合并变量是否可以安全地防止SQL注入?

时间:2015-07-21 16:56:47

标签: php mysql sql-injection

我有一些用户输入

$place = $_POST["errorreport_place"];
$os = $_POST["errorreport_os"];
$browser = $_POST["errorreport_browser"];
$text_user = $_POST["errorreport_text_user"];
$section = $_GET["section"];

以及一些用户未创建的会话变量(来自数据库)

$user_id = $_SESSION["user_id"];
$username = $_SESSION["username"];

现在我将所有这些用户创建的变量合并为一个文本字符串

$text = "ERROR REPORTED BY $username (ID: $user_id)<br /><br />Place: $place<br />Operating System: $os<br />Browser: $browser<br />Text:<br />$text";

然后我将此数据插入数据库(但使用预先准备好的语句)

$done = 0;
$sql = $db->prepare("INSERT INTO errorreports (user_id, section, text, done) VALUES (?, ?, ?, ?)");
$sql->bind_param('issi', $user_id, $section, $text, $done);
$sql->execute();

现在我的问题是:这种方法是否可以安全地防止SQL注入(因为我没有单独准备每个用户输入?

2 个答案:

答案 0 :(得分:4)

你的方法很安全。插入前连接,同时使用预准备语句,并不重要。准备好的语句将准备整个$text值作为整个插入字符串 - 它仍然与查询本身分开。

答案 1 :(得分:2)

当您使用预备语句时,您的方法是安全的。 $sql = $db->prepare("INSERT INTO errorreports (user_id, section, text, done) VALUES (?, ?, ?, ?)");

将数据与查询混合时可能会发生SQL注入。准备好的语句可确保将查询和数据单独发送到服务器