写作之间有什么区别
{$_GET['id']}
和
' “$ _ GET [ '身份证'。”'
在sql语句中?两者都是相同的
答案 0 :(得分:4)
将get请求中的数据直接放入SQL中总是一个坏主意,并且有许多简单的方法可以防止SQL注入。
对于你知道你想要一个数字ID的简单情况,你可以简单地强制该值为数字,然后没有SQL注入的机会。一种方法可能是okoman使用sprintf()
,可能是这样的:
$sql = "INSERT INTO table VALUES(".sprintf("%d",$_GET['id']) .")";
虽然我认为它的丑陋和糟糕的形式。这样的事情更好:
$sql = "INSERT INTO table VALUES(".(int)$_GET['id']) .")";
只是将值转换为int - 如果它不是可以转换为int的数字 - 你将得到一个“0”,这可能是你想要的也可能不是。
其他替代方案(以及当您的数据不应该是数字时)包括使用转义函数,例如add_slashes()
或上述mysql_real_escape_string()
。
恕我直言,从PHP中使用数据库访问并且非常容易防止SQL注入的最佳方法是使用新的PHP PDO库(http://php.net/PDO)。这允许您编写不包含任何数据的SQL字符串,并在稍后的数据库服务器本身内添加数据。在这种形式下,绝对没有办法进行SQL注入。
以下是一些示例代码:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare("INSERT INTO table VALUES (?)");
$stmt->bindParam(1, $_GET['id']);
$stml->execute();
如您所见,数据未添加到SQL查询本身,因此无需转义。
答案 1 :(得分:2)
在SQL语句中直接使用其中任何一个都是一个非常糟糕的想法。它允许SQL注入。请务必使用mysql_real_escape_string
等内容来清理您的输入。
两者之间的主要区别在于top只能在使用双引号的字符串中使用。但是,底部可以使用双引号或单引号。
答案 2 :(得分:2)
据我所知,没有区别,但你应该这样做吗?你允许在你的sql查询中使用未经过输入的输入,这意味着如果你的网站是面向互联网的,你就会对sql注入攻击保持开放态度。
这是一个Q& A,你应该在继续之前阅读:
答案 3 :(得分:-1)
如果在字符串中使用变量(尤其是关联数组),则可以确定它会导致错误。这只是糟糕的风格。 我 - 个人 - 也不喜欢第二种选择。
sprintf( '... %d ...', $_GET[ 'id' ] );
这是我最喜欢将变量放入字符串的方式。