针对PHP的安全措施
这篇文章是根据以下书籍进行写作的参考。
系統化地学习安全的Web应用程序制作方法,第2版[适应性重建版]- 脆弱性产生的原理和应对措施的实践。
跨站脚本(XSS)
在由最终用户输入等生成的页面中,可能存在混入/执行恶意脚本的风险。这种漏洞称为跨站脚本攻击。
綴是Cross Site Scripting的縮寫,但如果縮寫成CSS的話,容易與Cascading StyleSheet混淆,所以一般上把Cross Site Scripting縮寫為XSS。
对策
为了避免XSS漏洞,需要对动态生成的所有值进行转义处理。
但是仅仅通过转义处理是无法应对所有的情况的。
例如,为了防止通过JavaScript伪协议进行代码注入、插入非法的多字节字符或者空字节,
以及避免故意”破坏”标签并混入脚本等攻击,我们还需要对输入值进行有效性验证。
标签字符串允许使用
如果你想接受来自终端用户的标签字符串,无条件地接受所有的标签是很危险的。
为了保留只安全的标签,我们需要先进行文字分析,自己进行组装字符串的工作,只使用安全的标签和属性。
在这种情况下,我们可以使用HTML Purifier库。
HTML Purifier可以通过composer进行安装。
SQL注入
通过传递SQL命令的非法参数,指的是开发人员无意中生成或执行了意料之外的SQL命令的漏洞。
当用户编写或更改原始的SQL命令时,会导致一个严重的问题,即SQL注入。SQL注入是指向原始的SQL命令中注入其他SQL命令的行为。
应对措施
SQL转义已启用。
通过将结束字符「’」替换为「”」,SQL转义会将预留字符「’」无效化。
如果您使用PDO,则应该使用预处理语句,因为对每个值进行逐个转义处理是非常麻烦的。
通过使用占位符,PDOStatement类可以在内部执行各种转义处理,因此开发者可以放心进行开发而不需要担心转义问题。
操作系统命令注入
将恶意命令注入到操作系统命令中,被称为操作系统命令注入(OS Command Injection)。
具体的例子如下所示。
<?php
$result=shell_exec("dir {$_GET['param']}");
来源:从系统学习到的《构建安全的Web应用程序的方法 第2版 [重新构架版] 脆弱性产生的原理和实践对策》。
在PHP中,执行操作系统命令的方法是通过脚本实现的。
-
- shell_exec関数
-
- exec
-
- passthru関数
- 「`」演算子
您可以使用命令等。
在这里,我们试图将查询信息param的值作为参数传递给dir命令,但存在漏洞。
如果对shell.php进行访问,如~shell.php?param=|%20mkdir%20test,将生成以下命令。
$ dir | mkdir test
如果更改查询信息,则可能删除文件夹或输出文件内容。
尽量避免使用命令行指令,但如果确实需要使用,也应该避免直接接受外部输入。
如果在任何情况下都不可避免,用户需要使用escapeshellarg函数对输入进行转义处理。
$param=escapeshellarg($_GET['param']);
$result=shell_exec("dir {$param}");
引自:系统性学习安全的Web应用程序构建方法第2版[重编版]-漏洞产生的原理和实践对策。
顺便提一下,为了转义命令字符串,也有一个叫做escapeshellcmd的函数,但是最好避免从外部输入直接生成命令本身。
来源:系统学习安全Web应用的构建方法 第2版[重制版] 脆弱性的产生原理和应对实践