1

我知道我已经过一个关于消毒和逃生的问题,但我有一个问题没有得到回答。

好的,就到这里。如果我有一个 PHP 脚本并且我GET的用户输入和SELECT它来自一个 mySQL 数据库,如果我没有逃避<>通过使用其中一个htmlspecialcharshtmlentities或者strip_tags因此允许 HTML 标记成为从数据库中选择/搜索?因为输入已经通过使用trim(),mysql_real_escape_stringaddcslashes(\%_) 进行了清理。

使用的问题htmlspecialchars是它转义了&符号(&),用户输入应该允许(我猜这同样适用于htmlentities?)。使用 时,“ Johnstrip_tags ”之类的东西会导致 PHP 脚本为 John 选择和显示结果,这是不应该的。

这是我在从数据库中选择之前对输入进行清理的 PHP 代码:

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."%'";
      [...]
  }
}

这是我用于显示“x 匹配 y 结果”的输出。

echo htmlspecialchars(strip_tags($_GET['search']), ENT_QUOTES, 'UTF-8')." matched y results.";
4

2 回答 2

2

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

于 2013-04-23T15:52:55.853 回答
1

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

SQL 语句中的用户数据

无论何时构建查询,您都需要绝对确定不会出现任意用户数据。这些错误称为SQL 注入错误,是未能正确转义数据的结果。作为一般规则,您永远不应该使用字符串连接来组成查询。尽可能使用占位符来确保您的数据被正确转义。

HTML 文档中的用户数据

当您呈现包含用户提交内容的页面时,您需要对其进行转义,以便用户无法引入任意 HTML 标记或脚本元素。这是避免XSS 问题,意味着字符喜欢&并且<不会被错误地解释。“x < y”的用户数据最终不会破坏您的页面。

对于将用户数据渲染到的任何上下文,您总是需要转义。还有其他的,比如在脚本标签中或在 URL 中,但这是最常见的两个。

于 2013-04-23T16:04:43.093 回答