热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP的一些安全设置(优化)

由于脚本语言和早期版本设计的诸多原因,php项目存在不少安全隐患。从配置选项来看,可以做如下的优化。1.屏蔽PHP错误输出:在etcphp.ini(默认配置文件位置),将如下配置值改为Off....

由于脚本语言和早期版本设计的诸多原因,php项目存在不少安全隐患。从配置选项来看,可以做如下的优化。

1.屏蔽PHP错误输出。

在/etc/php.ini(默认配置文件位置),将如下配置值改为Off

display_errors=Off

不要将错误堆栈信息直接输出到网页上,防止黑客加以利用相关信息。

正确的做法是:

把错误日志写到日志文件中,方便排查问题。

2.屏蔽PHP版本。

默认情况下PHP版本会被显示在返回头里,如:

Response Headers X-powered-by: PHP/7.2.0

将php.ini中如下的配置值改为Off

expose_php=Off

3.关闭全局变量。

如果开启全局变量会使一些表单提交的数据被自动注册为全局变量。代码如下:




如果开启了全局变量,则服务器端PHP脚本可以用$username和$password来获取到用户名和密码,这会造成极大的脚本注入危险。

开启方法是在php.ini中修改如下:

register_globals=On

建议关闭,参数如下:

register_globals=Off

当关闭后,就只能从$_POST、$_GET、$_REQUEST里面获取相关参数。

4.文件系统限制

可以通过open_basedir来限制PHP可以访问的系统目录。

如果不限制使用下面的脚本代码(hack.php)可以获取到系统密码。

当设置了后则会报错,不再显示相关信息,让系统目录b不会被非法访问:

PHP Warning: file_get_contents(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/var/www) in /var/www/hack.php on line 3
Warning: file_get_contents(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/var/www) in /var/www/hack.php on line 3 PHP Warning: file_get_contents(/etc/passwd): failed to open stream: Operation not permitted in /var/www/hack.php on line 3
Warning: file_get_contents(/etc/passwd): failed to open stream: Operation not permitted in /var/www/hack.php on line 3

设置方法如下:

open_basedir=/var/www

5.禁止远程资源访问。

allow_url_fopen=Off
allow_url_include=Off

其他第三方安全扩展

6.Suhosin。

Suhosin是一个PHP程序的保护系统。它的设计初衷是为了保护服务器和用户,抵御PHP程序和PHP核心中已知或者未知的缺陷(感觉挺实用的,可以抵御一些小攻击)。Suhosin有两个独立的部分,使用时可以分开使用或者联合使用。

第一部分是一个用于PHP核心的补丁,它能抵御缓冲区溢出或者格式化串的弱点(这个必须的!);

第二部分是一个强大的 PHP扩展(扩展模式挺好的,安装方便…),包含其他所有的保护措施。

安装扩展

wget http://download.suhosin.org/suhosin-0.9.37.1.tar.gz
tar zxvf suhosin-0.9.37.1.tar.gz
cd suhosin-0.9.37.1/
phpize
./configure  --with-php-cOnfig=/usr/local/bin/php-config
make
make install
在php.ini下加入suhosin.so即可
extension=suhosin.so

特性

● 模拟器保护模式

● 增加两个函数sha256()和sha256_file()到PHP核心中

● 所有平台,加入CRYPT_BLOWFISH到函数crypt()中

● 打开对phpinfo()页的透明保护

● SQL数据库用户保护(测试阶段)

运行时保护

● 加密COOKIEs

● 防止不同种类的包含漏洞(不允许远程URL包含(黑/白名单);不允许包含已上传的文件;防止目录穿越攻击)

● 允许禁止preg_replace()

● 允许禁止eval()函数

● 通过配置一个最大执行深度,来防止无穷递归

● 支持每个vhost配置黑白名单

● 为代码执行提供分离的函数黑白名单

● 防止HTTP响应拆分漏洞

● 防止脚本控制memory_limit选项

● 保护PHP的superglobals,如函数extract(),import_request_vars()

● 防止mail()函数的新行攻击

● 防止preg_replace()的攻击

Session 保护

● 加密session数据

● 防止session被劫持

● 防止超长的session id

● 防止恶意的session id

SESSION里的数据通常在服务器上的明文存放的。这里通过在服务端来加解密$_SESSION。这样将Session的句柄存放在Memcache或数据库时,就不会被轻易攻破,很多时候我们的session数据会存放一些敏感字段。

这个特性在缺省情况下是启用的,也可以通过php.ini来修改:

suhosin.session.encrypt = On
suhosin.session.cryptkey = zuHywawAthLavJohyRilvyecyondOdjo
suhosin.session.cryptua = On
suhosin.session.cryptdocroot = On
;; IPv4 only
suhosin.session.cryptraddr = 0
suhosin.session.checkraddr = 0

COOKIE加密

COOKIE在客户端浏览器的传输的HTTP头也是明文的。通过加密COOKIE,您可以保护您的应用程序对众多的攻击,如

COOKIE篡改:攻击者可能会尝试猜测其他合理的COOKIE值来攻击程序。

跨应用程序使用COOKIE:不正确配置的应用程序可能具有相同的会话存储,如所有会话默认存储在/tmp目录下,一个应用程序的COOKIE可能永远不会被重新用于另一应用,只要加密密钥不同。

COOKIE加密在php.ini中的配置:

suhosin.COOKIE.encrypt = On
;; the cryptkey should be generated, e.g. with 'apg -m 32'
suhosin.COOKIE.cryptkey = oykBicmyitApmireipsacsumhylWaps1
suhosin.COOKIE.cryptua = On
suhosin.COOKIE.cryptdocroot = On
;; whitelist/blacklist (use only one)
;suhosin.COOKIE.cryptlist = WALLET,IDEAS
suhosin.COOKIE.plainlist = LANGUAGE
;; IPv4 only
suhosin.COOKIE.cryptraddr = 0
suhosin.COOKIE.checkraddr = 0
Blocking Functions
测试
##默认PHP的Session保存在tmp路径下
ll  -rt /tmp | grep sess
##扩展未开启时查看某条sesson的数据
cat  sess_ururh83qvkkhv0n51lg17r4aj6
//记录是明文的
##扩展开启后查看某条sesson 的数据
cat  sess_ukkiiiheedupem8k4hheo0b0v4
//记录是密文的
可见加密对安全的重要性

阻断功能

白名单

##显式指定指定白名单列表
suhosin.executor.func.whitelist = htmlentities,htmlspecialchars,base64_encode
suhosin.executor.eval.whitelist = htmlentities,htmlspecialchars,base64_encode
');
eval('echo htmlentities("");');

黑名单

##显式指定指定黑名单列表
suhosin.executor.func.blacklist = assert,unserialize,exec,popen,proc_open,passthru,shell_exec,system,hail,parse_str,mt_srand
suhosin.executor.eval.whitelist = assert,unserialize,exec,popen,proc_open,passthru,shell_exec,system,hail,parse_str,mt_srand
通过日志来查看非法调用黑白名单
suhosin.simulation = 1
suhosin.log.file = 511
suhosin.log.file.name = /tmp/suhosin-alert.log

其他配置项

suhosin.executor.include.max_traversal    扩目录的最大深度,可以屏蔽切换到非法路径
suhosin.executor.include.whitelist        允许包含的URL,用逗号分隔
suhosin.executor.include.blacklist        禁止包含的URL,用逗号分隔
suhosin.executor.disable_eval = On        禁用eval函数
suhosin.upload.max_uploads
suhosin.upload.disallow_elf
suhosin.upload.disallow_binary
suhosin.upload.remove_binary
suhosin.upload.verification_script        上传文件检查脚本,可以来检测上传的内容是否包含webshell特征

使用Suhosin,你可以得到一些错误日志,你能把这些日志放到系统日志中,也可以同时写到其他任意的日志文件中去;

它还可以为每一个虚拟主机创建黑名单和白名单;

可以过滤GET和POST请求、文件上载和COOKIE;

你还能传送加密的会话和COOKIE,可以设置不能传送的存储上线等等;

它不像原始的PHP强化补丁,Suhosin是可以被像Zend Optimizer这样的第三方扩展软件所兼容的。

更多相关php知识,请访问php教程!

以上就是PHP的一些安全设置(优化)的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
author-avatar
狡兔死走狗喷Henry
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有