从用户过滤数据的最佳方法(xss和sql注入)

时间:2011-04-05 18:52:28

标签: php xss sql-injection

我阅读了很多关于过滤数据的信息,我的网站从用户处获取数据,以便在sql injenction和xss中使网站安全。 。 。 但我在php中看到很多功能,所以我无法决定做什么。 。 。 请帮我把它变得更安全

3 个答案:

答案 0 :(得分:5)

你在这里问几个问题,所以我会尝试将其分解:

SQL注入

问题

将用户输入直接传递给数据库时会发生这种情况,如下所示:

$query = "SELECT * FROM Table WHERE field = " . $_POST['field'];
$result = mysql_query($query);

用户可以将他们想要的任何内容放入表单上的“字段”字段中,数据库将执行它。这意味着用户可能会输入一个过早终止您的预期查询的恶意字符串,然后运行他们自己的查询。

解决方案

不要使用用户输入直接构建查询。相反,您应该考虑使用预准备语句(这通常使用PDO库处理)。准备好的语句可以采用多种形式,但它们都涉及在实际查询字符串中使用占位符来告诉数据库在哪里粘贴您稍后将传递的其他数据。这样,数据库就可以处理任何适当的转义。代码看起来有点像这样:

$statement = $db->prepare("SELECT * FROM Table WHERE field = :field");
$statement->bindValue(":field", $_GET['field']);
$statement->execute();

在这种情况下,:field表示bindValue稍后提供的值的占位符。 PDO将根据需要处理转义。

尽管如此,您仍应根据需要清理所有用户数据。

XSS

问题

当未经过验证的用户输入直接传回浏览器时,会发生跨站点脚本(XSS)。如果用户输入了JavaScript命令,则可以在其他用户浏览器中执行这些命令,这可能允许原始黑客获得对该用户凭据的访问权。

解决方案

我不会在这里详细介绍,我只是说可以通过在你设置的任何cookie上设置HttpOnly标志来避免这种情况,这样就无法用JavaScript(恶意或其他)访问它们,并且永远不会永远向用户回复未经过处理的输入。

清理用户输入

PHP内置了一些很好的功能,用于清理许多形式的用户输入。我只是建议您查看filter_var function以及可以应用的various filters

永远不要只是将用户输入回复给用户。您应该尽力验证输入并拒绝任何不符合的输入,但对于需要显示给用户的输入,请始终使用htmlentities()之类的内容。对于更重但更彻底的选项,您可以查看HTML Purifier库。

希望能让你开始朝着正确的方向前进。

答案 1 :(得分:2)

假设您正在运行MySQL,可以使用mysql_real_escape_string()阻止大多数SQL注入。其他数据库系统也有类似的功能。

保护您的网站免受XSS攻击更加复杂。防止javascript代码注入的最简单方法是使用strip_tags()删除所有HTML标记,但这样做也会阻止使用<b>等无害标记,但如果需要,可以将其列入白名单。

答案 2 :(得分:0)

我能给你的唯一通用建议是学习:

  • 准备好的语句,以避免 SQL注入
  • StackOverflow等自定义标记语言用于避免 XSS攻击