可能重复:
Do I need to escape data to protect against SQL injection when using bind_param() on MySQLi?
我有一个简化查询的类。以下是如何插入数据的代码示例:
$dbi->prepare("INSERT INTO `temp` (`name`,`content`) VALUES (?,?);")->execute($name,$content);
类中有一个函数:
public function execute(){
if(is_object($this->connection) && is_object($this->stmt)){
if(count($args = func_get_args()) > 0){
$types = array();
$params = array();
foreach($args as $arg){
$types[] = is_int($arg) ? 'i' : (is_float($arg) ? 'd' : 's');
$params[] = $arg;
/*
or maybe $params[] = $this->connection->real_escape_string($arg);
*/
}
array_unshift($params, implode($types));
call_user_func_array(
array($this->stmt, 'bind_param'),
$this->_pass_by_reference($params)
);
}
if($this->stmt->execute()){
$this->affected_rows = $this->stmt->affected_rows;
return $this;
}
else {
throw new Exception;
}
}
else {
throw new Exception;
}
}
当我声明$params[]
时,我喜欢$params[] = $arg;
我应该放$params[] = $this->connection->real_escape_string($arg);
吗?
感谢。
答案 0 :(得分:3)
没有。使用参数时,不需要转义字符串。
实际上,你一定不能转义字符串,因为你最终会在包含文字反斜杠的数据库中存储字符串。这不是你想要的。
答案 1 :(得分:2)
根据PHP Manual on mysqli
和准备好的陈述:
转义和SQL注入
绑定变量将由服务器自动转义。该 服务器将其转义值插入到适当的位置 执行前的语句模板。必须提供一个提示 服务器为绑定变量的类型,以创建合适的 转换。有关更多信息,请参阅mysqli_stmt_bind_param()函数 信息。
有时会自动转义服务器中的值 被认为是一种防止SQL注入的安全功能。相同 如果是,可以使用未准备好的陈述来实现安全程度 输入值正确转义。
所以不,你不必小心逃避,服务器会为你逃避。
手动转义将导致双重转义值。在我个人看来,占位符?
在sql语句中的最大优点是你不必关心转义。