为什么在将'
添加到网址末尾时会出现错误?例如:http://mywebsite.com/singel?id=24'
我收到以下错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\' LIMIT 1' at line 1
如果我在查询字符串中的任何id之后放置'
,则随处显示。
有什么问题,以及如何修复? 谢谢。
答案 0 :(得分:7)
您正在SQL查询中插入非转义变量。如果此变量恰好包含SQL特殊字符,则可能导致SQL语法错误或更糟。
在将变量插入SQL查询之前,您需要转义变量。
示例:
$query = "SELECT * FROM users WHERE id = " . mysql_real_escape_string($id);
而不是(这是错误的,不要这样做):
$query = "SELECT * FROM users WHERE id = $id LIMIT 1";
如果$id
为24'
,则查询变为:
$query = "SELECT * FROM users WHERE id = 24' LIMIT 1";
如您所见,'
之后有一个24
,这是一个语法错误。
答案 1 :(得分:2)
如果'
杀死了您的查询,您显然有一个SQL注入漏洞。阅读mysql_real_escape_string()
,bobby-tables,并考虑切换到PDO准备好的陈述。
答案 2 :(得分:0)
答案 3 :(得分:-1)
此错误通常意味着您对sql注入持开放态度。这个函数比mysql_real_escape_string()复杂一点,因为它还进行了PHP配置测试,以确保你不会两次转义数据并添加各种PHP版本支持! (根据PHP手册1) 只需在每个提交的项目上运行这个小巧的函数,插入,更新或where语句:
function sql_injection($value){
$value = trim($value);
if(get_magic_quotes_gpc())
$value = stripslashes($value);
if(function_exists("mysql_real_escape_string")){
$value = mysql_real_escape_string($value);
}else
$value = addslashes($value);
return $value;
}
例如:
$q = 'SELECT `blah` FROM `users` WHERE `id`='.sql_injection($_POST['id']);