写作有什么区别吗
{$_GET['id']}
和
'".$_GET['id']."'
在sql语句中?两者的工作原理相同
写作有什么区别吗
{$_GET['id']}
和
'".$_GET['id']."'
在sql语句中?两者的工作原理相同
将 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 查询本身,因此无需转义。
在 SQL 语句中直接使用其中任何一个都是一个非常糟糕的想法。它允许 SQL 注入。请务必使用类似mysql_real_escape_string
.
两者的主要区别在于 top 只能在使用双引号的字符串内部使用。然而,底部可以与双引号或单引号一起使用。
据我所知没有区别,但你应该这样做吗?您允许未经处理的输入到您的 sql 查询中,这意味着如果您的网站面向 Internet,您将使其对 sql 注入攻击敞开大门。
这是您在继续之前应该阅读的问答:
如果你在字符串中使用变量——尤其是关联数组——你可以确定它会导致错误。这只是糟糕的风格。我 - 就个人而言 - 也不喜欢第二种选择。
sprintf( '... %d ...', $_GET[ 'id' ] );
这是我最喜欢将变量放入字符串的方式。