-1

我无法真正理解清理GET请求的所有不同方法,所以我想我会寻求帮助。

$view=$_GET['view'];

if($view){
$result = mysql_query('SELECT * FROM main WHERE category = "'.$view.'"', $main);
}

这里有任何安全问题吗?我试图搜索示例以尝试注入字符串,但找不到任何有效的方法。

我正在考虑preg_match只使用字母和数字,但不确定是否需要。

尽管我很想知道答案,但有没有我应该看的背景资料来帮助我?有很多不同的场景和方法可以为那些不同的情况清理字符串,我正在努力理解这一切。

4

3 回答 3

1

尝试这个:

?view=derp" OR SLEEP(10000000) = "有问题吗?

对此有足够的请求,您的站点就是 DoS。

避免它的最佳方法是使用mysql_real_escape_string,或更新到更新的内容,例如 PDO。

于 2013-06-19T16:08:52.480 回答
1

这里有任何安全问题吗?

是的,您有一个SQL 注入漏洞。

为了保护您的查询,您应该考虑使用 PDO 或 MySQLi 并使用准备好的语句。与转义或验证变量相比,准备好的语句提供了更多的安全性。准备好的语句从不向查询中插入变量,相反,变量(或参数)由 MySQL 服务器单独处理,因此没有 SQL 注入的可能性。

这是一个很好的 PDO 教程,面向具有mysql_*背景的开发人员,它包括一些准备好的语句示例。

适用于您的查询的 SQL 注入示例:

script.php?view='' OR 1

这会欺骗您的代码从表中检索所有行,因为它会导致 WHERE 子句始终计算为true. 这就是查询将变成的样子:

SELECT * FROM main WHERE category = '' OR 1

于 2013-06-19T16:09:05.230 回答
0

您应该使用 mysqli 或 PDO 切换到使用准备好的语句。这将解决安全问题。另外, mysql_ 函数已被弃用并将被删除。

于 2013-06-19T16:08:10.973 回答