【问题标题】:New to Prepared Statements, just doesn't feel secure新的准备好的陈述,只是感觉不安全
【发布时间】:2013-06-12 23:48:57
【问题描述】:

通过检查列出这些表的表,将表名与可接受表的白名单进行比较。该列表必须是动态的,这就是我选择不使用数组的原因。设置变量部分中的变量是否安全?他们来了用户提交的帖子数据。

    if ($stmt = $mysqli->prepare("INSERT INTO `" . mysql_real_escape_string($tablename) . "` (item_name, item_price, item_position, item_type, multi_link_id) values (?, ?, ?, ?, ?)")) {

        //Build Parameters 
        $stmt->bind_param('sdiii', $additemnameb, $additempriceb, $itempositionb, $itemtypeb, $linkidb);

        //Set Variables
        $additemnameb = $additemname;
        $additempriceb = $additemprice;
        $itempositionb = $itemposition;
        $itemtypeb = $itemtype;
        $linkidb = $linkid;

        //Execute Statement
        $stmt->execute();

        //Close Statement
        $stmt->close();
    }else{
        //Errors
        printf("Prepared Statement Error: %s\n", $mysqli->error);
    }

编辑有一个实际问题,以明确我关心的问题。

【问题讨论】:

  • 这不是问题。
  • 你为什么在 mysqli 中使用 mysql_real_escape_string?选择一个扩展(并注意 php_mysql 在 5.5 中已被弃用等待删除)。准备好的语句是安全的:)
  • @Martin,使用 mysql_real_escape_string 在从以前的方法切换时过度使用。我很担心,因为这些值来自用户提交的 POST 数据,只是感觉很脏。我仍在学习 PHP,我所拥有的很多东西都是教程。现在我正在经历和实施安全性,同时对代码进行更改以使其成为“自己的”,试图全面了解各个方面,准备好的语句还不是全面了解的一部分。
  • 与其转义$tablename,不如将​​$tablename可接受的 表名数组进行比较。如果不在白名单中,则不执行查询。
  • @MichaelBerkowski 我将摆脱 tablename 的转义,但正如我在帖子中提到的那样,我确实计划将它与从一个单独的表构建的白名单进行检查,该白名单出于不同的原因需要,但是在这种情况下,恰好可以完美地用作白名单。

标签: php mysql mysqli prepared-statement


【解决方案1】:

回答您的问题是的,// Set Variables 部分中的变量是安全的,或者从技术上讲,这些变量将在查询执行之前变得安全。 mysqli 会为你处理好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多