繁体   English   中英

使用php清理搜索查询

[英]Sanitize search query with php

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

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

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

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是相同的)。

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

Urldecode是错误的函数 - PHP将自动解码$ _GET中的任何变量,因此您不需要,而且PHP手册说这样做是危险的

人们经常谈论消毒输入,但我更愿意考虑消毒输出。

例如,清理输入将是:

$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安全格式。 在知道对数据执行的操作之前,您无法知道要运行哪个函数。

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

不要试图清理您的数据。

使用参数化查询。

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

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

我会做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM