real_escape_string和prepare()之间的区别?

 黄镇郁皓伟嘉惟 发布于 2023-02-06 17:53

prepare()对于我的大多数代码来说,似乎有点乏味和不必要.如果我在SQL命令中发送一个字符串,为什么我不能用它来清理它real_escape_string?有什么不同?这就是我一直在做的事情,它对SQL注入效果很好......谢谢.

1 个回答
  • 在SQL注入防御中,转义与使用查询参数一样有效.

    如果您不能始终如一地执行这两种方法,那么这两种方法的效

    这两种方法仅用于保护SQL表达式中的各个.它们不支持查询的其他动态部分.例如,如果要ORDER BY用户指定的列.查询参数和转义函数都不能处理.

    所以基本上,这是一个风格和个人偏好的问题.

    我更喜欢查询参数,因为我认为:

    $sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$a, $b, $c]);
    

    比这更明确:

    $sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
    mysqli_query($conn, $sql);
    

    你不能认真地说,摆弄所有那些开放引号/ close-quotes和.字符串连接比使用带参数的prepare()更容易.


    重新评论一个query()带参数的假设函数.

    首先,没有必要.一起使用prepare()和execute()是编写安全代码的一个小代价,并且坚持使用单个函数执行它,你只是听起来很懒惰.我想你不检查返回false错误的函数的返回值吗?

    对于它的价值,编写一个包装函数来做这两件事很容易,因为PHP隐式支持varargs.

    function myquery() {
      global $pdo;
      $params = func_get_args();
      $sql = array_shift($params);
      $stmt = $pdo->prepare($sql);
      $stmt->execute($params);
      return $stmt; // so we can fetch(), etc.
    }
    

    2023-02-06 17:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有