一 . 外部策略
1.处理用户的提交的数据
我们的网站(应用)每天通过各种途径接收大量的外部数据,如:
$_GET , $_POST , $_REQUEST , $_COOKIE , $argv , php://stdin , php://input , file_get_contents
远程的数据库信息 , 远程API , 来自客户端的数据
以上的数据源都很可能被作为数据源插入到你的PHP脚本中从而造成:XSS和CSRF攻击以及SQL注入
解决方法:
过滤输入:使用htmlentities函数对数据进行过滤; 使用PDO预处理语句过滤数据,
验证数据:使用filter_var,filter_input函数去验证不同类型的数据
转义输出:使用htmlentities函数对数据进行转义再输出到页面上
2.处理用户的密码
绝不可以把用户的密码明文储存到数据库,否则一旦数据库被黑后果就不堪设想
加密与哈希:加密是双向算法,哈希是单向算法,哈希后的数据不能还原成原始值,最安全的哈希算法是bcrypt,
bcrypt算法会自动加盐,可以防止彩虹表攻击,在PHP编程中可以使用password_hash和password_verifty函数
二 .内部策略
1.文件系统安全
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操作文件(删除),如果有这方面的需求,那用户可删除文件也必须是系统生成的随机名称,不可被用户控制
三. 其他策略
线上环境关闭错误报告(error_reporting,dislay_erros,可在php.ini中配置error_log路径,记录错误信息,这样有助于发现可能的用户攻击)
Register Globals,弃用(移除)的特性,不要使用
魔术引号特性,不要开启,在PHP-5.4中已经被移除
尽量使用PHP的最新版本,最新版本修复了已知的很多安全漏洞和bug
代码中严格遵守上述策略,基本能保证代码不会有太多的安全漏洞,能防范常见攻击。