当我将'
添加到URL末尾时,为什么会出现错误?例如: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之后,这将在任何地方显示。
出了什么问题,如何解决?谢谢你。
在SQL查询中插入一个未转义的变量。如果这个变量恰好包含SQL特殊字符,这可能会导致SQL语法错误,甚至更糟。
在SQL查询中插入变量之前需要转义。
的例子:
$query = "SELECT * FROM users WHERE id = " . mysql_real_escape_string($id);
代替(this is WRONG, don't do this):
$query = "SELECT * FROM users WHERE id = $id LIMIT 1";
如果$id
是24'
,查询变成:
$query = "SELECT * FROM users WHERE id = 24' LIMIT 1";
可以看到,24
后面有一个'
,这是一个语法错误。
如果'
杀死了您的查询,则很明显存在sql注入漏洞。阅读mysql_real_escape_string()
, bobby-tables,并考虑切换到PDO预处理语句。
看这里
http://www.codeproject.com/KB/database/SqlInjectionAttacks.aspx 你应该学习一些关于SQL注入的知识。你的脚本现在是可注入的此错误通常意味着您对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']);
- 这个函数不能取代服务器端验证,在使用它之前应该验证所有东西,总是假设最坏的情况:)