0

写作有什么区别吗

{$_GET['id']}

'".$_GET['id']."'

在sql语句中?两者的工作原理相同

4

4 回答 4

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 查询本身,因此无需转义。

于 2009-01-14T17:43:54.633 回答
2

在 SQL 语句中直接使用其中任何一个都是一个非常糟糕的想法。它允许 SQL 注入。请务必使用类似mysql_real_escape_string.

两者的主要区别在于 top 只能在使用双引号的字符串内部使用。然而,底部可以与双引号或单引号一起使用。

于 2009-01-14T17:26:23.000 回答
2

据我所知没有区别,但你应该这样做吗?您允许未经处理的输入到您的 sql 查询中,这意味着如果您的网站面向 Internet,您将使其对 sql 注入攻击敞开大门。

这是您在继续之前应该阅读的问答:

如何防止 PHP 中的 SQL 注入?

于 2009-01-14T17:26:42.267 回答
-1

如果你在字符串中使用变量——尤其是关联数组——你可以确定它会导致错误。这只是糟糕的风格。我 - 就个人而言 - 也不喜欢第二种选择。

sprintf( '... %d ...', $_GET[ 'id' ] );

这是我最喜欢将变量放入字符串的方式。

于 2009-01-14T17:25:11.910 回答