【问题标题】:Sanitize search query with php使用 php 清理搜索查询
【发布时间】:2010-11-16 23:24:14
【问题描述】:

当用户在我的网站上进行搜索时,我会抓取 get 请求并对它进行 mysql 查询。我的原始代码看起来像这样:$q = $_GET['q'];

现在 urldecode 正在为我添加斜杠,但我决定尝试 filter_var 和 santize 字符串过滤器。

这是我使用$q = urldecode($_GET['q']);时的sql:

SELECT * FROM item WHERE title LIKE '%you\'re%' OR description LIKE '%you\'re%' ORDER BY date DESC 

这是我使用时的 sql:q = filter_var(urldecode($_GET['q']), FILTER_SANITIZE_STRING);

SELECT * FROM item WHERE title LIKE '%you\'re%' OR description LIKE '%you\'re%' ORDER BY date DESC 

sql 是完全一样的,但是我得到不同的结果,我不知道为什么?仅使用 urldecode 从数据库返回正确的结果,但 filter_var 什么也不返回(即使 sql 相同)。

我想我的问题是,清理和搜索查询字符串的最佳方法是什么?

【问题讨论】:

标签: php mysql


【解决方案1】:

Urldecode 使用了错误的函数 - PHP 会自动解码 $_GET 中的任何变量,所以你不需要,PHP Manual says doing so is dangerous

人们经常谈论净化输入,但我更喜欢考虑净化输出。

例如,净化输入将是:

$q = urldecode($_GET['q']);
$sql = "SELECT * FROM item WHERE title LIKE '%{$q}%'"

// later
echo "These items match '$q'";

并清理输出:

$sql = "SELECT * FROM item WHERE title LIKE '%".mysql_real_escape_string($_GET['q'])."%'"

// later
echo "These items match '".htmlspecialchars($_GET['q']).'";

请注意,在后一个示例中,我使用了不同的函数——一个用于将数据转换为 mysql 安全格式,另一个用于将数据转换为 HTML 安全格式。在您知道自己在对数据做什么之前,您无法知道要运行哪个函数。

其他人提到了参数化查询。是的,这些都尽可能安全并避免意外错误,但不容易在一夜之间切换到。

【讨论】:

    【解决方案2】:

    不要试图清理您的数据。

    使用参数化查询。

    有关示例,请参阅 http://bobby-tables.com/php.html

    【讨论】:

    • 'Prepared statements' 可能会在大多数 LAMP 开发人员中敲响警钟,参数化查询是不常用的术语,恕我直言。
    【解决方案3】:

    我愿意:

    $q = mysql_real_escape_string( stripslashes( $_GET['q'] ) );
    

    【讨论】:

    • stripslashes 仅在您无法关闭魔术引号时才需要。
    • @alex -- 谢谢。 @Staticsan -- 很好,但我们不知道操作的设置。
    • 试试这个:$stripslashes = ( get_magic_quotes_gpc() ? "stripslashes" : create_function('$f', 'return $f;')); 然后你可以做$q = $stripslashes($_GET['q']);
    • @Staticsan -- 不需要完成的额外编码需要更多工作。
    • 如果你不知道magic_quotes的状态又不能改变它,你真的别无选择。
    【解决方案4】:

    最好的变种是使用 php Sanitize 过滤器http://php.net/manual/en/filter.filters.sanitize.php

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 2011-07-24
      • 1970-01-01
      • 2012-11-12
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      相关资源
      最近更新 更多