所以我遇到了一个奇怪的问题......我们使用参数化查询来阻止我们的代码中的SQL注入,但是我遇到了一些这样的行为问题,而我发现了一个丑陋的方式,我的工作周围的那种打败了参数化的目的。
假设我正在进行此查询:
$db = new csmysqli('database',$host,$user,$pass);
$value = x;
$stmt = "INSERT INTO table SET value='%s'";
$result = $db->prepare($stmt, $value);
echo $result;
现在问题是......如果x是一个字符串,或者我们得到这个结果:
INSERT INTO table SET value='123';
没问题......但是,如果x为null:
INSERT INTO table SET value='NULL';
< ---那里的单引号引起了一个问题....好的,所以我试着绕过它:
$value = "'x'"; // Notice the quotes now go around x
$stmt = "INSERT INTO table SET value=%s";
$result = $db->prepare($stmt, $value);
echo $result;
如果x是int或string,我们得到这个:
INSERT INTO table SET value=\'x\';
现在null工作了:
INSERT INTO table SET value=NULL;
所以问题是:
如何通过参数化正确填充普通数据和NULL数据?
编辑:
我应该提到我正在使用一个特殊的mysqli_helper脚本:
class csmysqli extends mysqli
{
public function __construct($dbname = '', $host,$user,$pass)
{
parent::__construct($host, $user, $pass, $dbname);
}
public function query($query)
{
$numParams = func_num_args();
$params = func_get_args();
//merge in parameters only if needed
if ($numParams > 1) {
for ($i = 1; $i < $numParams; $i++) {
$params[$i] = parent::real_escape_string($params[$i]);
}
$query = call_user_func_array('sprintf', $params);
}
return parent::query($query, MYSQLI_STORE_RESULT);
}
public function prepare($query)
{
$numParams = func_num_args();
$params = func_get_args();
//merge in parameters only if needed
if ($numParams > 1) {
for ($i = 1; $i < $numParams; $i++) {
$params[$i] = parent::real_escape_string($params[$i]);
}
$query = call_user_func_array('sprintf', $params);
}
return $query;
}
}
答案 0 :(得分:0)
使用本机mysqli参数化,可以正常填充普通数据和NULL数据。
使用自制的参数化,您必须检查参数类型并采取相应措施。