【问题标题】:Is this code sql-injection-safe in PDO?这个代码在 PDO 中是​​ sql-injection-safe 吗?
【发布时间】:2011-08-18 17:31:24
【问题描述】:

代码(新手):

        if(isset($_POST['selection']))
        {
            include_once 'pdo_init.php';
            $params_str = str_repeat('?,',count($_POST['selection']));
            $params_str = substr($params_str,0,-1);
            $res = $pdo->prepare('DELETE FROM funcionario WHERE codigo in ('.$params_str.')');
            if($res->execute($_POST['selection']))
            {
                return json_encode(array(
                    'success' => 1,
                    'msg'     => 'os registros foram deletados com sucesso!'
                ));
            } else {
                return json_encode(array(
                    'success' => 0,
                    'msg'     => 'nao admitimos sql-injection aqui seu safado!'
                ));
            }
        } else {
            # error out
            break;
        }

【问题讨论】:

    标签: php pdo sql-injection


    【解决方案1】:

    学究式地,不,它不是 100% 安全的(您通常从准备好的语句中得到)。那是因为使用 MySQL,PDO emulates prepared statements 在内部。这意味着数据被转义,因此在涉及 PDO(至少使用默认设置)时,使用准备好的语句而不是转义没有任何好处。

    您可以通过在连接上设置PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, 0) 来更改此设置。

    MySQLi 确实使用真正的预处理语句,所以我建议使用它。

    【讨论】:

      【解决方案2】:

      看起来您正在动态进行参数化查询。

      参数化查询是注入安全的。

      但也要注意content itself

      【讨论】:

        【解决方案3】:

        看起来注入是安全的,只要允许用户删除表中的所有行(因为如果她愿意,她可以发送包含表中所有 codigo 的 POST)。

        不可能诱使您的查询触及其他表。

        【讨论】:

          【解决方案4】:

          您使用?prepare 做得正确。请注意,PDO 不会保护您免受的一种情况是动态表/列名。 PDO(和 mysql_real_escape_string)不会逃避反引号,`,所以尽量不要使用动态表或列名。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-05-05
            • 2013-03-13
            • 1970-01-01
            • 2016-09-14
            • 2013-04-09
            • 2020-03-27
            相关资源
            最近更新 更多