【问题标题】:Validating user input (search filters)验证用户输入(搜索过滤器)
【发布时间】:2010-10-21 14:04:38
【问题描述】:

我正在构建一个搜索页面,但我有点不确定在清理和验证用户输入方面我应该做什么。

搜索页面具有通过查询字符串传递的过滤器。 (一些来自输入,另一些来自具有复选框/收音机行为的链接)

在这种情况下我应该注意什么?我可以安全地使用 preg_replace(除掉所有但)并转义吗?

另外 - 在将查询字符串放入链接之前,我是否需要对查询字符串(通过用户输入)做任何事情?我是否应该添加另一个查询来检索可能的值、遍历结果并排除那些未找到的用户输入? (防止链接附加用户可能输入的虚假过滤器选项。虽然这不会影响使用更改的 url 的用户吗?)

我不知道这是否重要,但查询字符串中传递的一些过滤器是数组。

你怎么看?我对此很陌生,我很感激帮助。谢谢!

【问题讨论】:

    标签: php mysql validation search query-string


    【解决方案1】:

    从您的问题中不清楚您要保护什么,但清理输入的常见问题是数据库。

    在这种情况下,最重要的是:使用参数化查询。这可以立即解决您的大部分问题。这是a good answer.

    没有比这更好的逃避了。

    至于清理查询字符串本身,问问自己:如果攻击者手动构建了一个 URL,会不会发生不好的事情?或者他们只会得到一个错误页面?

    【讨论】:

      【解决方案2】:

      PHP 带有专门用于清理字符串以用于 MySQL 查询的函数。

      如果您使用(老式)PHP 函数 mysql_query() 向数据库发出查询,请查看 PHP 函数 mysql_real_escape_string

      $query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
              mysql_real_escape_string($user),
              mysql_real_escape_string($password));
      

      【讨论】: