当我的URL末尾有撇号时,为什么会出现SQL错误?

时间:2011-08-18 19:04:27

标签: php sql-injection

为什么在将'添加到网址末尾时会出现错误?例如: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之后放置',则随处显示。

有什么问题,以及如何修复? 谢谢。

4 个答案:

答案 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";

如果$id24',则查询变为:

$query = "SELECT * FROM users WHERE id = 24' LIMIT 1";

如您所见,'之后有一个24,这是一个语法错误。

答案 1 :(得分:2)

如果'杀死了您的查询,您显然有一个SQL注入漏洞。阅读mysql_real_escape_string()bobby-tables,并考虑切换到PDO准备好的陈述。

答案 2 :(得分:0)

看这里

http://www.codeproject.com/KB/database/SqlInjectionAttacks.aspx

你应该学习一些关于SQL注入的知识。您的脚本现在可注射

答案 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']);
  • 此功能不会取代服务器端验证,所有内容都应在使用前验证,总是假设最差:)