盘点如何利用PHP生成PDF文件

在PHP代码中生成PDF文件是一项非常耗时的工作,早期的程序员通常是在PHP代码中利用FPDF生成PDF文件。但在如今,有很多的函数库可以使用,借助它们你可以从你提供的HTML文档生成PDF文件,从而让工作变得简单方便起来。

FPDF

FPDF是一个PHP类,它允许用纯PHP代码生成PDF文件,这也就是说我们不用使用PDFlib库。FPDF中的F就代表着自由:你可以以各种方式使用它,并根据你的需求调整它。下面我们来看看FPDF的特征:

  • 自由选择单元格,页面格式和边距;
  • 管理页眉和页脚;
  • 自动分页;
  • 自动换行和文本对齐;
  • 支持图片(JPEG,PNG,GIF);
  • 颜色管理;
  • 支持链接;

接下来再介绍一下可以直接从HTML生成PDF的函数库。

DomPDF

DomPDF是一个从HTML到PDF的转换器,它遵循CSS2.1的HTML布局,还有是用PHP编写的渲染引擎。DomPDF以样式为主导:它可以下载和读取外链样式表,内链样式标签和HTML元素的属性。它的特点包括:

  • 处理CSS属性,包括了@import,@media和@page规则;
  • 支持HTML的可见属性;
  • 支持外部样式表,通过本地或http/ftp;
  • 支持复杂的表结构;
  • 支持图片(JPEG,BMP,PNG,GIF);
  • 不依赖于其他PDF库;

TCPDF

TCPDF是一个用于生成PDF文件的开源PHP类,该项目起源于2002年,现在已经有全世界成千上万的人在使用。它的提点包括:

  • 基本功能不需要外部函数库;
  • 支持标准页面格式,自定义页面格式;
  • 支持UTF-8编码和从右向左的语言;
  • 支持各种字体;
  • 支持图片和图形的转换;
  • 支持页面压缩;
  • 支持页眉和页脚管理;

本站文章除注明转载外,均为本站原创或翻译

php源代码保护——PHP加密方案分析&解密还原

php是一种解释型脚本语言.与编译型语言不同,php源代码不是直接翻译成机器语言.而是翻译成中间代码(OPCODE) ,再由解释器(ZEND引擎)对中间代码进行解释运行 .

在php源代码的保护在原理可以分为3大类.

  • 源代码混淆(编码)
  • OPCODE混淆(编码)
  • 修改解释引擎(虚拟机)

在部署上可以分为2大类.

  • 无扩展
  • 有扩展

下面分析下各种加密方案的实现方法

源代码混淆

无限扩展的加密在一些小开发者比较常见。这种源代码保护方式侵入性小,无需对服务器做额外的配置,兼容性较强。

这种情况混淆后的源代码还原非常简单,可完全还原出源代码。 有时连注释都会保留 (x 我觉得这种混淆都不能称之为加密基本流程 压缩代码->混淆变量函数类名->使用简单函数和方法进行编码加密 例:base64 异或

【点击查看资料】或私信回复“资料”获取

手工解密

看到这种的php不要慌 这种处理后的文件 解密流程的变量和函数名使用了大量的非打印字符 按照正常的流程就可以ctrl+alt+l 快捷键 格式化代码 (这里使用的PhpStorm 其他IDE 格式化遇到特殊符号可能出问题 这里提前调整好了文件编码)

这里有一个php的特性 php中的base64遇到非base64表中字符会直接忽略 不会影响解码注: PHP7 遇到空字符可能会抛出error 可以使用php5.6执行 (这里有一个兼容性问题 )遇到这种加密最简单的方法就是找文件中最后一步执行的函数 直接把内容打印出来

这种编码方法最后一步肯定要使用eval执行还原后的php代码 所以打印最后一个函数基本上php代码就会全部出来 (x 前面操作一大顿毫无卵用注: 有保护方案也使用了call_user_func或call_user_func_array间接调用eval

成功还原源代码 <?php phpinfo();?>

自动化通用解密

PHP提供了强大的扩展功能 可以直接通过编写php扩展hook eval相关函数 获取执行的源代码HOOK php zend引擎的 zend_compile_string zend_include_or_eval 函数达到目的这里演示的是 hook zend_compile_string 函数

成功还原源代码

源代码混淆

使用php扩展的代码混淆和无扩展代码混淆比较相似,只不过是把代码还原过程从php代码转到了php扩展。同样是使用aes des 异或等加密方法直接加密php代码,HOOK翻译php的函数在翻译PHP文件前对文件进行解密操作。这种方案也可以完全还原出源代码。在无其他混淆和压缩时甚至还会保留注释。

手工解密

这里以beast为例.首先在php的扩展目录下找到beast.sobeast的加密方案会把加密key编译进扩展中. 我们只需要寻找key就可以完成解密beast由于是开源项目.有现成的符号表和源码这使得反编译寻找key变得非常简单.但这样有点太简单了. 所以这里演示的是在没有源码的情况下使用IDA分析解密流程.

首先在导入表找到zend_compile_file这个函数会将php文件翻译成opcode因此大部分php加密扩展都需要hook这个函数达到拦截php文件载入和替换php文件的功能

继续跟入发现有两个函数一般在这种php加密扩展设计时会对这个函数有两次操作:一个是在启动时hook 这个函数,一个是在停止时恢复这个函数。继续跟入启动hook

显然文件处理逻辑在cgi_compile_file内

跟踪文件句柄decrypt_file函数的参数存在文件句柄 所以这个函数应该就是文件解密函数

根据代码可以看出beast 加密文件的结构| encrypt_file_header_sign 文件头标记(不固定 可修改)| reallen文件长度 int 4字节 | expire 到期时间 int 4字节| entype 加密方式 int 4字节| 加密后文件|

分析文件头发现该文件加密方式为 02

跟入beast_get_encrypt_algo

2对应的是 aes_handler_ops

使用了AES 128 ECB加密模式直接提取key参数内容长度刚好16位

到这一步就成功拿到了加密秘钥

使用拿到的KEY就可以解密PHP文件

自动化通用解密

编写php扩展 HOOK zend_compile_file函数

beast的加密不会对php文件做额外的操作 解密文件与加密前原文件完全一致php注释和原格式都会保留注意: 这里扩展加载顺序问题 建议直接修改php源码Zendzend_language_scanner.cZEND_API zend_op_array *compile_file

php会将源代码翻译成类似汇编的二进制中间操作码再交给zend引擎执行。之前的介绍的都是编译之前对php源代码的直接操作。这里是对opcode的操作,跳过翻译过程,直接把现成的opcode交给zend引擎执行(不同版本PHP引擎编译出的opcode可能会有兼容性问题)。这种php代码防护方法 只能hook zend_execute 拿到opcode。 不可能直接得到原本的源码,只能通过反编译尽可能的还原源代码。大部分商业php保护方案都使用这种可靠的方案为基础 _ZendGuard(zend) _SourceGuardian(SG) IonCube (IC) Swoole Compiler上面的方案有的还对zend引擎进行了魔改,使翻译出的opcode只能在修改后的引擎执行,进一步增强了安全性。

还原代码

hook zend_execute 拿到opcode使用对应版本的php操作码反推php代码太菜了不会反编译)

私信回复“资料”获取以下:

1、200多本网络安全系列电子书2、全套工具包3、100份src源码技术文档4、网络安全基础入门、Linux、web安全、攻防方面的视频6、 网络安全学习路线7、ctf夺旗赛解析

PHP扩展编译

phpize 生成Makefile

配置编译选项 启用扩展

最后执行make 编译扩展编译好的扩展会放在./modules/ 目录下使用扩展

可以重复使用-d extension 加载多个扩展

在选用PHP源码保护方案时 尽量选择opcode或虚拟机方案源代码混淆类只能对源代码获取和阅读增加一点困难 在加密扩展可被攻击者获取到时并不能起到保护作用

领导说PHP已经过时了,让我滚

作为一名程序员,我们应该都听过这样一个梗:PHP编程语言,是世界上最好用的编程语言~~~但是今天领导让我滚,我不服气写下了这篇PHP入门基础吊打领导。

PHP介绍  PHP又名超文本预处理器,是一种通用开源脚本语言。PHP主要适用于Web开发领域,语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛。其独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

了解了PHP的基本概念后,下面分享PHP的基础知识,希望对PHP学习有所帮助~

静态网站:(TML页面,页面固定,不会变化),没有与后台服务器的交互,没有数据库的支持。动态网站:(可以根据交互情况动态显示不同内容),需要与后台服务器进行数据交互,需要数据库的支持。

  • Java—JSP
  • PHP—-PHP
  • asp—-asp
  • Apache:Apache公司旗下服务器,用于解析PHP类网站
  • Tomcat:Apache公司旗下的另一款服务器,用于解析JSP类的网站;

mysql,Access,Oracle,SQLServer……我们PHP一般匹配MySQL使用。当然,PHP可以连接几乎所有的主流数据库。

  • B/S:浏览器/服务器结构。用户只需要通过浏览器即可访问的网站。大部分操作功能集中在后台服务器。
  • C/S:客户端/服务器结构。用户需要安装客户端使用的程序。客户端可以分担一定的操作功能。

安装一个软件,内置多种开发需要的软件或语言环境

  • Wamp:windows+Apache+mysql+PHP
  • Lamp:Linux+Apache+mysql+PHP
  • PHPStudy:
  • APPServer:

注:PHP开发首选Linux系统,但是PHP能够友好的兼容各种操作系统。(Windows, Linux, Unix, MacOS……)

PHP中\”+“只有运算功能,没有连接功能。连接功能用”.\”连接。关键词:PHP标记的种类、PHP中的指令分隔符、PHP中的变量、PHP中算false的情况、PHP中字符串的声明、PHP中的伪类型、PHP中的数据类型转换、PHP中判断类型、PHP中的输出语句、PHP中的常量一PHP标记的种类PHP文件中,如果要使用PHP语法,必须要将php语言放到标记当中。PHP支持如下四种标记方式:

①<?php ?>这是PHP官方推荐的写法,也是我们主要采用的写法!这种标签可以插入到HTML文档的任意位置;

注:如果页面中,只有PHP语言,推荐省略结束表示’?>’。原因:如果包含结束符号,在导入PHP文件时,可能会将文件最后的多余换行导入进来。<script language=\”php\”></script>长标记写法。这种写法,总是可以使用,但是我们不推荐。③<? ?>短标记风格。默认不开启,需要修改php.ini文件中\”short_open_tag = On\”打开。但是,由于和XML中的标记冲突,不推荐使用。④<% %>ASA风格。默认不开启,需要修改php.ini文件中\”asp_tags = On\”打开。但是,由于和ASP,JSP中的标记冲突,不推荐使用。

1、PHP中的“结构定义语句”(分支,循环,类,函数等{}结尾),不需要使用分号结尾。2、PHP中的“功能执行语句”,不用{}结尾的,必须使用分号结尾。3、特例:最后结束标签?>前的最后一条语句,可以省略分号。

1、PHP中的变量,声明与使用,必须用开头。 2、PHP是一种弱类型语言,变量其实并不需要声明,可以直接给变量赋任何类型的 3、PHP中可以使用连等同时声明多个变量,而不能使用逗号分隔;eg:开头。2、PHP是一种弱类型语言,变量其实并不需要声明,可以直接给变量赋任何类型的3、PHP中可以使用连等同时声明多个变量,而不能使用逗号分隔;eg:num1 = $num2 = num3 = 5; 4、常用变量函数: unset();删除并释放变量; isset();检验变量是否设置; empty();检验变量是否为空(未设置或值为null都算空); 5、变量的命名:只能由数字,字母,下划线组成,开头不能是数字。而且,PHP中变量区分大小写!num3=5;4、常用变量函数:unset();删除并释放变量;isset();检验变量是否设置;empty();检验变量是否为空(未设置或值为null都算空);5、变量的命名:只能由数字,字母,下划线组成,开头不能是数字。而且,PHP中变量区分大小写!name $Name $NAME 都是不同变量!但是,PHP内置函数或类名不区分大小写!echo EcHo 都是有效的!6、PHP中的数据类型(8种)4种标量类型:

2种复合类型:

2种特殊类型:

7、整型的范围:-231~(231-1),超过这个范围,自动转为浮点型

1、Boolan false2、整形 03、浮点型 0.04、字符串\”\” “0” (“0.0” “000” 都算对!只有一个0算错!)5、空数组6、空对象 仅在PHP4算false。其他版本,对象都算true。7、null和尚未定义的变量;8、所有资源都算对!(除PHP4,所有对象都算对!!!)

PHP支持三种方式声明字符串:1、’’:2、\”\”:3、<<<(定界符):$str = <<<s(定界标识符)//定界符声明字符串,通过<<<(定界标识符)开始//遇到顶格的定界标识符结束!!一个空格都不能有!!//定界标识符可以是任意字母,只需要保证开始和结束一致即可!s;(顶格的定界标识符)

4、三种声明方式的区别:①定界符功能,默认与双引号相同。(但是定界符中可以放双引号)②单引号中,不能解析变量,而双引号、定界符都可以解析变量。注:双引号解析变量时,需注意变量名后需用\”hahaha{KaTeX parse error: Expected \’EOF\’, got \’}\’ at position 4: num}̲hahaha\” \”hahaha{num}hahaha\”均可!③单引号中可以放双引号,双引号中可以放单引号。但是不能放自身相同类型的引号。④单引号中不能使用转义字符(除了单引号’\’本身,转义符\\本身),双引号中可以使用转义字符。

伪类型:并不是一种真实存在的数据类型。它的存在,仅仅是告诉程序员可以是哪种,哪些数据类型,常用于撰写帮助文档时使用。

mixed:代表参数可以是多种不同数据类型。Number:代表参数可以是Integer或者Float。callback:代表参数可以是一个回调函数。

1、自动类型转换:表示运算的时候,Boolean,Null,String等类型,会先自动转为Integer或Float类型null–>0true–>1false–>0String转非数值字符前的数字,没有的话转为0 “123a”–>123 “a123”–>0

2、强制类型转换:根据我们的需要,强制将变量转为其他类型的变量。新变量 = (新类型)新变量=(新类型)原变量; $str = (String)1;//新类型,可以使用全拼,也可以使用缩写。Integer/int Boolean/bool都行。

可以强制转换的类型如下:①使用()声明新类型强转:

②使用setType();函数强转:bool setType(mixed var,String type);第一个参数表示任何类型的变量,第二个参数表示字符串类型的数据类型,返回Boolean结果。

③两种转换的区别:

  • 第①种:是将转换之后的结果,赋给新变量;
  • 第②种:直接修改了原变量的数据类型。

1、常量的定义:bool define(String 常量名,mixed 常量值[,bool 是否区分大小写]);2、常量的注意事项:①常量定义,只能使用define()函数;②常量名,原则上要求必须使用大写声明。而且必须不能带符号(符号(只能是变量);③常量声明以后,默认全局范围有效。没有作用域之说。④常量不但不能改,而且不能删!unset,setType等函数均无效⑤常量默认区分大小写!!!但是,可以在声明常量时,将define第三个参数设为true,即可改为不区分大小写。⑥常量必须使用define()定义后才能使用。如果使用未声明常量,则默认转为常量字符串。但是,会有警告。var_dump(NUM);–>String “NUM”⑦常量的值只能是标量Boolean String Float Integer3、可以使用echo constant(“NUM”);读取常量值!注意!!!可以使用get_defined_constants(),获取所有已定义的常量!!包括系统自定义的N多个常量。

我是一名渗透测试工程师,为了感谢读者们,我想把我收藏的一些网络安全/渗透测试学习干货贡献给大家,回馈每一个读者,希望能帮到你们。

干货主要有:

①2000多本网安必看电子书(主流和经典的书籍应该都有了)

②PHP标准库资料(最全中文版)

③网络安全基础入门、Linux运维,web安全、渗透测试方面的视频(适合小白学习)

④ 网络安全学习路线图(告别不入流的学习)

⑤ 渗透测试工具大全

⑥ 2021网络安全/Web安全/渗透测试工程师面试手册大全

由于篇幅有限,资料都放在我的个人文档,需要的关注我:私信回复“资料”获取网络安全面试资料、源码、笔记、视频架构技术

最后,感谢您的关注和阅读!!

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。