一文件系统安全
php 如果具有 root 权限, 且在脚本中允许用户删除文件, 那么用户提交数据, 不进行过滤, 就非常有可能删除系统文件
- // 从用户目录中删除指定的文件
- $username = $_POST['user_submitted_name'];
- $userfile = $_POST['user_submitted_filename'];
- $homedir = "/home/$username";
- unlink ("$homedir/$userfile");
- echo "The file has been deleted!";
- ?>
上面的代码, 假设用户提交的 $userfile 值是 ../etc/, 那么 / etc 目录就会被删除
防范文件系统攻击, 策略如下
只给 php 有限的权限
用户提交上来的变量要监测和过滤, 不能包含文件路径等特殊字符
尽量避免使用 PHP 操作文件(删除), 如果有这方面的需求, 那用户可删除文件也必须是系统生成的随机名称, 不可被用户控制
二数据库安全
数据库安全主要防范的是 sql injection, 即 sql 注入攻击, 提升数据库安全的策略如下:
不用使用 root 帐号或者数据库所有者帐号连接数据库, 连接数据库限定连接用户的 ip
使用 php 的 pdo 扩展, 有效防止 sql 注入, 除了安全方面的优势, php 的 pdo 扩展在性能方面有有很大优势
请参看 http://php.net/manual/en/pdo.prepared-statements.php
对一些敏感信息进行加密, 常见的比如对密码进行加密
三用户数据过滤
对用户数据过滤, 可以防范 XSS 和 CSRF 攻击
使用白名单 (用户输入是固定模式) 的方式
比如用户名只能使用数字字母, 那么可以使用函数 ctype_alnum 判断
对用户输入使用函数 htmlentities 或者 htmlspecialchars 进行处理, 输入 url 不允许传入非 http 协议
用户身份验证使用令牌 token(csrf)
http://htmlpurifier.org/ HTML Purifier 是开源的防范 xss 攻击的有效解决方案,
四其他安全策略
线上环境关闭错误报告(error_reporting,dislay_erros, 可在 php.ini 中配置 error_log 路径, 记录错误信息, 这样有助于发现可能的用户攻击)
Register Globals, 弃用 (移除) 的特性, 不要使用
魔术引号特性, 不要开启, 在 PHP-5.4 中已经被移除
尽量使用 PHP 的最新版本, 最新版本修复了已知的很多安全漏洞和 bug
代码中严格遵守上述策略, 基本能保证代码不会有太多的安全漏洞, 能防范常见攻击
来源: https://www.php1.cn/detail/php-555aff1163.html