【问题标题】:Is is bad practice to use array_walk with mysqli_real_escape_string?将array_walk与mysqli_real_escape_string一起使用是不好的做法吗?
【发布时间】: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 呃,复制了错误的行。我真傻。

标签: php mysqli


【解决方案1】:

是的,绝对的

这种做法是臭名昭著的“magic quotes”功能的转世,它曾经是该语言的一部分,但谢天谢地它不是。

这种方法对您没有任何好处,只会给人一种虚假的安全感,并无缘无故地破坏您的数据。

对于所有涉及 PHP 变量的数据库交互,您必须使用准备好的语句。这是唯一 100% 安全的解决方案,它使相关功能过时。

这里我有一个使用准备好的语句进行选择查询的示例,https://phpdelusions.net/mysqli_examples/prepared_select

通过一个简单的辅助函数,它变成了比转义驱动的混乱更简单和更清洁的解决方案

【讨论】:

  • 我喜欢这种方式,在 cmets 中,我们都在努力轻柔地而你只是带着一个巨大的 OI 推土机进来!不!:D
  • 是否有理由说明为什么 mysqli_real_escape_string 不安全?到目前为止,我可以看到很多人说它不安全,但没有说明原因。很高兴知道。
  • @MikeAbineri 好吧,这个函数一开始并不意味着“安全”。它与任何安全、安保、注射或类似的事情无关。这是一个不起眼的字符串格式化函数,被几代 PHP 程序员误认为是对抗 SQL 注入的金药。尽管它使字符串免受注入的影响,但作为副作用,像您的批量转义一样,您只是无法确定它是字符串还是数字还是字段名称。幸运的是,潮流已经逆转,现在开出了合适的药丸 - 参数化查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 2023-02-07
  • 2015-11-22
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
相关资源
最近更新 更多