当用户在我的网站上搜索时,我会获取get请求并对其进行mysql查询。我原来的代码看起来像这样:$q = $_GET['q'];
。
现在urldecode正在为我添加斜杠,但我决定使用santize字符串过滤器尝试filter_var。
当我使用$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是相同的)。
我想我的问题是,清理和搜索查询字符串的最佳方法是什么?
答案 0 :(得分:4)
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安全格式。在知道对数据执行的操作之前,您无法知道要运行哪个函数。
其他人提到了参数化查询。是的,这些都是尽可能安全的,避免意外错误,但不容易在一夜之间切换。
答案 1 :(得分:3)
请勿尝试清理数据。使用参数化查询。
有关示例,请参阅http://bobby-tables.com/php.html。
答案 2 :(得分:0)
我愿意:
$q = mysql_real_escape_string( stripslashes( $_GET['q'] ) );