PHP安全之道学习笔记1:PHP项目安全设置
在全球范围来看,超过了80%的网站是使用php进行搭建的,由于脚本语言和早期版本设计的诸多原因,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.关闭全局变量
如果开启全局变量会使一些表单提交的数据被自动注册为全局变量。代码如下:
<form action="/login" method="post">
<input name="username" type="text">
<input name="password" type="password">
<input type="submit" value="submit" name="submit">
</form>
如果开启了全局变量,则服务器端PHP脚本可以用$username和$password来获取到用户名和密码,这会造成极大的脚本注入危险。
开启方法是在php.ini中修改如下:
register_globals=On
建议关闭,参数如下:
register_globals=Off
当关闭后,就只能从$_POST、$_GET、$_REQUEST里面获取相关参数。
- 4.文件系统限制
可以通过open_basedir来限制PHP可以访问的系统目录。
如果不限制使用下面的脚本代码(hack.php)可以获取到系统密码。
<?php
echo file_get_contents('/etc/passwd');
当设置了后则会报错,不再显示相关信息,让系统目录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 -
其他第三方安全扩展
Suhosin
设计初衷是为了保护服务器和用户抵御PHP程序和PHP核心中,已知或者未知的缺陷。
PHP7支持版本
Taint
用于xss/sqli/shell注入的检测。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通