消除/逃避用户输入和输出

时间:2013-04-23 15:45:49

标签: php mysql input output

我知道我已经asked有关消毒和逃避的问题,但我有一个问题没有得到解答。

好的,就在这里。如果我有一个PHP脚本,我GET用户从mySQL数据库输入并SELECT,如果我没有逃脱{{1},它是否会有任何安全风险? }和<使用>htmlspecialcharshtmlentities,因此允许从数据库中选择/搜索HTML标记?因为已使用strip_tagstrim()mysql_real_escape_string(\%_)对输入进行了清理。

使用addcslashes的问题是它逃脱&符号(&amp;),用户输入应该允许(我猜htmlspecialchars也是如此?)。使用htmlentities,类似&#34; John &#34;导致PHP脚本选择并显示John的结果,这是不应该做的。

在从数据库中选择之前,这是用于清理输入的PHP代码:

strip_tags

这是我输出的显示&#34; x匹配的y结果。&#34;:

if(isset($_GET['query'])) {
  if(strlen(trim($_GET['query'])) >= 3) {
      $search = mysql_real_escape_string(addcslashes(trim($_GET['search']), '\%_'));
      $sql = "SELECT name, age, address WHERE name LIKE '%".$search."%'";
      [...]
  }
}

2 个答案:

答案 0 :(得分:2)

解决这个问题的一个好方法是使用MySQLi,它使用预处理语句,它基本上可以在后端为您提供所有内容,并提供针对SQL注入的强大保护。不转义GET数据就像逃避任何其他输入一样危险。

答案 1 :(得分:1)

您已经确定了两个不同的问题。

SQL语句中的用户数据

每当您构建查询时,您都需要绝对确定任何用户数据都不会在其中结束。这些错误称为SQL injection bugs,是无法正确转义数据的结果。作为一般规则,您永远不应该使用字符串连接来撰写查询。只要有可能,请使用placeholders确保您的数据已正确转义。

HTML文档中的用户数据

当您呈现包含用户提交的内容的页面时,您需要对其进行转义,以便用户无法引入任意HTML标记或脚本元素。这样可以避免XSS issues,这意味着&<等字符的解释不正确。用户数据“x&lt; y”不会最终破坏您的页面。

无论您将用户数据呈现到何种上下文,您都需要转义。还有其他内容,例如脚本标记或URL中,但这些是最常见的两种。