以下是一个示例查询:
$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::PARAM
如PDO::PARAM_STR
和PDO::PARAM_INT
未设置。
我的问题毕竟是:
当PDO::PARAM
未设置时,此查询是否适用于SQL注入?
答案 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],
]