没有PDO :: PARAM的bindParams是否安全?

时间:2017-03-07 20:27:31

标签: php mysql pdo

以下是一个示例查询:

$sql = $db->prepare("INSERT INTO `accounts` 
    (`id`, `name`, `email`, `phoneNumber`, `country`, `city`, `addrLine1`, `company`, `zipCode`, `sha_pass_hash`, `ClientGroup`, `Newsletter`, `signedIN`) VALUES 
    (NULL, :name, :email, :phoneNumber, :country, :city, :addrLine1, :company, :zipCode, :sha_pass_hash, '1', '1', NOW())");
$sql->bindParam(':name',$name);
$sql->bindParam(':email',$email);
$sql->bindParam(':phoneNumber',$phoneNumber);
$sql->bindParam(':country',$country);
$sql->bindParam(':city',$city);
$sql->bindParam(':addrLine1',$addrLine1);
$sql->bindParam(':company',$company);
$sql->bindParam(':zipCode',$zipCode);
$sql->bindParam(':sha_pass_hash',$sha_pass_hash);
$sql->execute();

正如您所看到的,使用bindParam的时间PDO::PARAMPDO::PARAM_STRPDO::PARAM_INT未设置。

我的问题毕竟是: 当PDO::PARAM未设置时,此查询是否适用于SQL注入?

2 个答案:

答案 0 :(得分:1)

这是正确的方法。 PARAM常量是为了方便起见,因此如果需要,您可以根据需要将数据转换/转换为适当的类型。

有时这是相关的,您可能希望某些值为整数,以避免在将非数字数据插入数字列时出错,但如果您准备捕获并报告这些错误,则此处不会出现任何问题。这可能是比静默修改数据更好的解决方案。

答案 1 :(得分:1)

在我看来,忽略数据类型是完全安全的。因为变量被绑定为引用,并且仅在调用PDOStatement :: execute()时进行计算。

请注意,在使用PDOStatement :: bindParam时,在PDOStatement :: execute()上将整数更改为字符串值。 (经过MySQL测试)。

所以我使用以下来运行查询,这是scape Framework

的一部分
/** @var string|array $query
 */
public function runQuery($query){
    /** @var \PDOStatement $statement
     */
    $result=NULL;

    $statement=$this->con->prepare(is_array($query)? $query['query']: $query);

    try
    {
        $statement->execute(is_array($query)?$query['param']:null);
        return $statement;
    }
    catch (\Exception $e)
    {
        if($e->errorInfo[1]==1062)
            echo PHP_EOL."Duplicate Entry. Check your unique Entry such as username, ID etc.".PHP_EOL;
        else if ($e->errorInfo[1]==1146)
            echo PHP_EOL."Table ".$this->getName()." Not Found".PHP_EOL;
        else
            echo $e->getCode().": ".$e->getMessage();
        return false;
    }
}

在我的函数调用中,$ query将是格式化查询的sting或者是动态格式化的以下格式的数组。

$query= ["query" => $tmpQ,
         "param" => [$search],
        ]
相关问题