我想让我的PHP尽可能安全,我想避免的两件主要事情是
这是我针对mySQL注入的脚本:
function make_safe($variable) {
$variable = mysql_real_escape_string(trim($variable));
return $variable; }
http://www.addedbytes.com/writing-secure-php/writing-secure-php-1/
针对XSS,我发现了这个:
$username = strip_tags($_POST['username']);
现在我想将两者合二为一个功能。这是最好的方法吗? :
function make_safe($variable) {
$variable = strip_tags(mysql_real_escape_string(trim($variable)));
return $variable; }
或者 mysql_real_escape_string 是否已经阻止了XSS?最后,还有什么我可以添加到此功能以防止其他形式的黑客攻击?
答案 0 :(得分:13)
此功能:
function make_safe($variable)
{
$variable = strip_tags(mysql_real_escape_string(trim($variable)));
return $variable;
}
无效
SQL注入和XSS是两种不同的野兽。因为它们每个都需要不同的转义,所以你需要分别使用每个转义函数strip_tags
和mysql_real_escape_string
。
加入他们会破坏每个人的安全。
将数据输入数据库时使用标准mysql_real_escape_string()
在将数据输出到屏幕之前查询数据库时使用strip_tags()
。
为什么要合并这两个功能是危险的
从马口:http://php.net/manual/en/function.strip-tags.php
由于strip_tags()实际上并未验证HTML,因此部分或损坏的标记可能会导致删除比预期更多的文本/数据。
因此,通过将格式错误的html输入到数据库字段中,智能攻击者可以使用您的天真实现来击败组合中的mysql_real_escape_string()
。
答案 1 :(得分:11)
mysql_real_escape_string()不会阻止XSS。只能进行SQL注入。
要对抗XSS,您需要使用htmlspecialchars()或strip_tags()。 1st会将<
之类的特殊字符转换为<
,这些字符将显示为<
,但不会被执行。第二个只是删除所有标签。
我不建议使用特殊功能来执行此操作,甚至不要使用一个函数来完成所有操作,但您的示例可以正常工作。我假设。
答案 2 :(得分:2)
您应该关注的是使用prepared statements和PDO来为您的数据库提供抽象层,以及彻底根除SQL注入攻击。
对于XSS,请确保永远不要信任用户输入。在存储数据时,或者在输出数据时运行strip_tags或htmlentities,或者输出数据(不是因为这会弄乱你的输出),你就会好起来。