我无法真正理解清除GET
请求的所有不同方法,所以我想我会请求帮助。
$view=$_GET['view'];
if($view){
$result = mysql_query('SELECT * FROM main WHERE category = "'.$view.'"', $main);
}
这里有安全问题吗?我试图搜索示例尝试注入字符串,但我找不到任何有用的东西。
我在考虑使用只有字母和数字的preg_match
,但不确定是否需要它。
尽管我想知道答案,是否有任何背景阅读,我应该看看帮助我?有很多不同的场景和方法来清理那些不同情况的字符串,我正在努力解决这些问题。
答案 0 :(得分:1)
试试这个:
?view = derp“OR SLEEP(10000000)=”问题?
对此和您的网站的足够请求是DoS。
避免它的最佳方法是使用mysql_real_escape_string
,或更新为更新的内容,例如PDO。
答案 1 :(得分:1)
这里有安全问题吗?
是的,您有SQL Injection个漏洞。
为了保护您的查询,您应该考虑使用PDO或MySQLi并使用预准备语句。准备好的语句提供了比转义或验证变量更多的安全性。准备好的语句永远不会在查询中插入变量,而是由MySQL服务器单独处理变量(或参数),因此不会留下SQL注入的可能性。
This is a good PDO tutorial针对来自mysql_*
背景的开发人员,它包含一些预备语句示例。
适用于您的查询的SQL注入示例:
script.php?view =''OR 1
这会欺骗您的代码从表中检索所有行,因为它会导致WHERE子句始终求值为true
。这就是查询的结果:
SELECT * FROM main WHERE category =''OR 1
答案 2 :(得分:0)
您应该切换到使用mysqli或PDO使用预准备语句。这将解决安全问题。另外,不推荐使用mysql_函数,这些函数将被删除。