点击进入“PHP开源社区”
免费获取高级访谈、文档和视频资源
1.屏蔽PHP错误输出
在/etc/php.ini(默认配置文件位置)中,将以下配置值更改为Off
portant;overflow-wrap: break-word !important;">display_errors=Off
不要将错误堆栈信息直接输出到网页,以防止黑客利用相关信息。
正确的做法是:
将错误日志写入日志文件,方便故障排除。
2. 屏蔽PHP版本。
默认情况下,PHP版本会显示在返回头中,例如:
X——作者:PHP/7.2.0
将php.ini中以下配置值更改为Off
portant;overflow-wrap: break-word !important;">expose_php=Off
如果启用全局变量,某些表单提交的数据将自动注册为全局变量。 代码如下所示:
portant;overflow-wrap: break-word !important;"><form action="/login" method="post">
portant;overflow-wrap: break-word !important;"><input name="username" type="text">
portant;overflow-wrap: break-word !important;"><input name="password" type="password">
portant;overflow-wrap: break-word !important;"><input type="submit" value="submit" name="submit">
portant;overflow-wrap: break-word !important;">form>
如果启用全局变量,服务器端PHP脚本可以使用$和$来获取用户名和密码,这会造成很大的脚本注入风险。
打开方法是修改php.ini如下:
portant;overflow-wrap: break-word !important;">register_globals=On
建议关闭,参数如下:
portant;overflow-wrap: break-word !important;">register_globals=Off
关闭时只能从$_POST、$_GET、$中获取相关参数。
4. 文件系统限制
您可以通过以下方式限制 PHP 可以访问的系统目录
如果不限制使用下面的脚本代码(hack.php),就可以获取系统密码。
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">echo file_get_contents('/etc/passwd');
设置后会报错,并且不再显示相关信息,这样系统目录b就不会被非法访问:
PHP : (): 在 . 文件(/etc/)不是 /var/www/hack.php 第 3 行中的路径:(/var/www)
: (): 在 。 文件(/etc/)不是 /var/www/hack.php 第 3 行中的路径:(/var/www) PHP : (/etc/): 打开:不在 /var/www/ 中hack.php 第 3 行
: (/etc/): 打开:不在 /var/www/hack.php 第 3 行
设置方法如下:
portant;overflow-wrap: break-word !important;">open_basedir=/var/www
5.禁止远程资源访问。
portant;overflow-wrap: break-word !important;">allow_url_fopen=Off
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">allow_url_include=Off
其他第三方安全扩展
6.
它是PHP程序的保护系统。 它最初的设计目的是为了保护服务器和用户免受PHP程序和PHP核心中已知或未知的缺陷的影响(感觉很实用,可以抵御一些小型攻击)。 有两个独立的部分,使用时可以单独使用,也可以组合使用。
第一部分是 PHP 核心的补丁,以防止缓冲区溢出或格式字符串漏洞(必须!);
第二部分是强大的PHP扩展(扩展模式还不错,安装方便……),包括所有其他的保护措施。
安装扩展
portant;overflow-wrap: break-word !important;">wget http://download.suhosin.org/suhosin-0.9.37.1.tar.gz
portant;overflow-wrap: break-word !important;">tar zxvf suhosin-0.9.37.1.tar.gz
portant;overflow-wrap: break-word !important;">cd suhosin-0.9.37.1/
portant;overflow-wrap: break-word !important;">phpize
portant;overflow-wrap: break-word !important;">./configure --with-php-config=/usr/local/bin/php-config
portant;overflow-wrap: break-word !important;">make
portant;overflow-wrap: break-word !important;">make install
portant;overflow-wrap: break-word !important;">在php.ini下加入suhosin.so即可
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">extension=suhosin.so
特征
运行时保护
保护
其中的数据通常以明文形式存储在服务器上。 这里,$是在服务器端加密和解密的。 这样,当句柄存储在数据库中时,就不会轻易被攻破。 很多时候我们的数据会存储一些敏感字段。
该功能默认启用,也可以通过 php.ini 修改:
portant;overflow-wrap: break-word !important;">suhosin.session.encrypt = On
portant;overflow-wrap: break-word !important;">suhosin.session.cryptkey = zuHywawAthLavJohyRilvyecyondOdjo
portant;overflow-wrap: break-word !important;">suhosin.session.cryptua = On
portant;overflow-wrap: break-word !important;">suhosin.session.cryptdocroot = On
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">;; IPv4 only
portant;overflow-wrap: break-word !important;">suhosin.session.cryptraddr = 0
portant;overflow-wrap: break-word !important;">suhosin.session.checkraddr = 0
加密
客户端浏览器传输的 HTTP 标头也是明文形式。通过加密,您可以保护您的应用程序免受多种攻击,例如
php.ini 中的加密配置:
portant;overflow-wrap: break-word !important;">suhosin.cookie.encrypt = On
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">;; the cryptkey should be generated, e.g. with 'apg -m 32'
portant;overflow-wrap: break-word !important;">suhosin.cookie.cryptkey = oykBicmyitApmireipsacsumhylWaps1
portant;overflow-wrap: break-word !important;">suhosin.cookie.cryptua = On
portant;overflow-wrap: break-word !important;">suhosin.cookie.cryptdocroot = On
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">;; whitelist/blacklist (use only one)
portant;overflow-wrap: break-word !important;">;suhosin.cookie.cryptlist = WALLET,IDEAS
portant;overflow-wrap: break-word !important;">suhosin.cookie.plainlist = LANGUAGE
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">;; IPv4 only
portant;overflow-wrap: break-word !important;">suhosin.cookie.cryptraddr = 0
portant;overflow-wrap: break-word !important;">suhosin.cookie.checkraddr = 0
portant;overflow-wrap: break-word !important;">Blocking Functions
portant;overflow-wrap: break-word !important;">测试
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">##默认PHP的Session保存在tmp路径下
portant;overflow-wrap: break-word !important;">ll -rt /tmp | grep sess
portant;overflow-wrap: break-word !important;">##扩展未开启时查看某条sesson的数据
portant;overflow-wrap: break-word !important;">cat sess_ururh83qvkkhv0n51lg17r4aj6
portant;overflow-wrap: break-word !important;">//记录是明文的
portant;overflow-wrap: break-word !important;">##扩展开启后查看某条sesson 的数据
portant;overflow-wrap: break-word !important;">cat sess_ukkiiiheedupem8k4hheo0b0v4
portant;overflow-wrap: break-word !important;">//记录是密文的
portant;overflow-wrap: break-word !important;">可见加密对安全的重要性
阻塞功能
白名单
portant;overflow-wrap: break-word !important;">##显式指定指定白名单列表
portant;overflow-wrap: break-word !important;">suhosin.executor.func.whitelist = htmlentities,htmlspecialchars,base64_encode
portant;overflow-wrap: break-word !important;">suhosin.executor.eval.whitelist = htmlentities,htmlspecialchars,base64_encode
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">echo htmlentities('
' );portant;overflow-wrap: break-word !important;">eval('echo htmlentities("
");' );
黑名单
portant;overflow-wrap: break-word !important;">##显式指定指定黑名单列表
portant;overflow-wrap: break-word !important;">suhosin.executor.func.blacklist = assert,unserialize,exec,popen,proc_open,passthru,shell_exec,system,hail,parse_str,mt_srand
portant;overflow-wrap: break-word !important;">suhosin.executor.eval.whitelist = assert,unserialize,exec,popen,proc_open,passthru,shell_exec,system,hail,parse_str,mt_srand
portant;overflow-wrap: break-word !important;">通过日志来查看非法调用黑白名单
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">suhosin.simulation = 1
portant;overflow-wrap: break-word !important;">suhosin.log.file = 511
portant;overflow-wrap: break-word !important;">suhosin.log.file.name = /tmp/suhosin-alert.log
其他配置项
portant;overflow-wrap: break-word !important;">suhosin.executor.include.max_traversal 扩目录的最大深度,可以屏蔽切换到非法路径
portant;overflow-wrap: break-word !important;">suhosin.executor.include.whitelist 允许包含的URL,用逗号分隔
portant;overflow-wrap: break-word !important;">suhosin.executor.include.blacklist 禁止包含的URL,用逗号分隔
portant;overflow-wrap: break-word !important;">suhosin.executor.disable_eval = On 禁用eval函数
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">suhosin.upload.max_uploads
portant;overflow-wrap: break-word !important;">suhosin.upload.disallow_elf
portant;overflow-wrap: break-word !important;">suhosin.upload.disallow_binary
portant;overflow-wrap: break-word !important;">suhosin.upload.remove_binary
portant;overflow-wrap: break-word !important;">suhosin.upload.verification_script 上传文件检查脚本,可以来检测上传的内容是否包含webshell特征
使用时,你可以获得一些错误日志,你可以将这些日志放入系统日志中,也可以同时写入任何其他日志文件; 它还可以为每个虚拟主机创建黑名单和白名单; 您可以过滤 GET 和 POST 请求、文件上传;
还可以发送加密会话,可以在线设置不能发送的存储等;
与原来的 PHP 强化补丁不同,它兼容 Zend 等第三方扩展。
*免责声明:本文整理于网络,版权归原作者所有。 若来源信息错误或侵犯权益,请联系我们删除或授权。
portant;overflow-wrap: break-word !important;"> END portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;"> PHP开源社区 扫描关注 进入”PHP资料“
免费获取进阶
面试、文档、视频资源portant;overflow-wrap: break-word !important;">