【发布时间】:2020-02-27 01:47:45
【问题描述】:
所以我有一个名为“escape”的函数,看起来像这样:
function escape($string){
$escaped_string = mysqli_real_escape_string($this->conn, $string);
return $escaped_string;
}
在运行查询之前,我在此处发送了一个变量(显然源自用户输入),因此出于安全原因将其转义。
现在我知道可以使用 array_walk 将一组值应用于此函数,但我只想知道是否有任何理由不应该这样做?我知道这听起来像是一个愚蠢的问题,但是将它应用于用户输入值的数组而不是每个变量会很好也很容易。
通常如果在制作函数时我会这样做:
function whatever($user_input){
$user_input = $this->escape($user_input);
$this->query("SELECT dog from pets where owner = '$user_input'");
e.c.t.
}
但是,如果我有很多用户从表单输入的数据,例如 id,则只需将一个数组传递给函数并在转义函数上使用 array_walk 来省去麻烦。但是还有什么特别的原因(从安全的角度来看)为什么这不是一个好主意?
【问题讨论】:
-
它可以争论说使用
mysqli_real_escape_string(),而不是创建带有绑定参数的准备好的语句,是不好的(可以说是次优的)实践...... -
您的脚本面临SQL Injection Attacks 的风险。使用prepared statements。即使escaping 字符串也不安全!您不必学习 PDO。 mysqli也可以。
-
准备好的语句的简单示例在stackoverflow.com/questions/60174/…
-
@aynber - 如果您链接到 mysqli_prepare_statement 而不是 PDO 版本,可能会减少混乱;)
-
@CD001 呃,复制了错误的行。我真傻。