【问题标题】:Is merging variables safe against SQL injection?合并变量对 SQL 注入安全吗?
【发布时间】:2015-07-21 16:56:47
【问题描述】:

我有一些用户输入

$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 注入安全吗(因为我没有单独准备每个用户输入?

【问题讨论】:

  • 您根据$sql-&gt;bind_param('issi', $user_id, $section, $text, $done); 绑定变量。每一个的来源和内容都无关紧要。绑定本身也不会改变它们。它只是确保它们的值与 SQL 查询分开传输。
  • 可能更适合代码审查codereview.stackexchange.com 另外,不要将 XSS 漏洞利用/注入排除在外。

标签: php mysql sql-injection


【解决方案1】:

您的方法是安全的。在使用准备好的语句时,插入之前的连接并不重要。准备好的语句会将整个 $text 值准备为一个完整的字符串以供插入 - 这仍然与查询本身分开。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多