合并变量对 SQL 注入安全吗?

Is merging variables safe against 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 注入是否安全(因为我没有单独准备每个用户输入?

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

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

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