用于防止SQL注入和XSS的PHP函数

时间:2011-07-28 10:55:10

标签: php mysql xss sql-injection

我想让我的PHP尽可能安全,我想避免的两件主要事情是

  • mySQL注射
  • Cross-Side Scripting(XSS)

这是我针对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?最后,还有什么我可以添加到此功能以防止其他形式的黑客攻击?

3 个答案:

答案 0 :(得分:13)

此功能:

function make_safe($variable) 
{
   $variable = strip_tags(mysql_real_escape_string(trim($variable)));
   return $variable; 
}

无效

SQL注入和XSS是两种不同的野兽。因为它们每个都需要不同的转义,所以你需要分别使用每个转义函数strip_tagsmysql_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会将<之类的特殊字符转换为&lt;,这些字符将显示为<,但不会被执行。第二个只是删除所有标签。

我不建议使用特殊功能来执行此操作,甚至不要使用一个函数来完成所有操作,但您的示例可以正常工作。我假设。

答案 2 :(得分:2)

您应该关注的是使用prepared statementsPDO来为您的数据库提供抽象层,以及彻底根除SQL注入攻击。

对于XSS,请确保永远不要信任用户输入。在存储数据时,或者在输出数据时运行strip_tagshtmlentities,或者输出数据(不是因为这会弄乱你的输出),你就会好起来。

相关问题