代码之家  ›  专栏  ›  技术社区  ›  waiwai933

Htmlentities vs addslashes vs mysqli\u real\u escape\u string

  •  6
  • waiwai933  · 技术社区  · 16 年前

    我一直在读一些关于保护PHP应用程序的书,在我看来 mysqli_real_escape_string 是将数据插入MySQL表时要使用的正确函数,因为 addslashes 对于一个聪明的攻击者来说,可能会导致一些奇怪的事情发生。对吗?

    转义 htmlentities 将用户输入的数据回显给用户以保护其数据时 就是那个有漏洞的人。这是真的,还是我记错了?

    7 回复  |  直到 16 年前
        1
  •  5
  •   Eric Butera    16 年前

    在所有新代码中,进入数据库的转义数据都应弃用,而应使用准备好的语句。任何告诉你不这样做的人都是对你的极大伤害。

    我生活的一般规则是验证(而不是过滤,如果不正确则拒绝)输入&转义输出(基于上下文)。

        2
  •  12
  •   Quentin    16 年前

    它们是用于不同目的的不同工具。

    mysqli_real_escape_string使插入MySQL的数据更安全(但参数化查询更好)。

    Htmlentities使数据安全地输出到HTML文档中

    addslashes使数据在其他一些情况下更安全,但对MySQL来说还不够

        3
  •  0
  •   tDo    16 年前
        4
  •  0
  •   Mike Sherov    16 年前

    是的,在所有用户输入上使用mysqli_real_escape_字符串或类似PDO的库。回显时,我使用带有ENT_引号的htmlentities作为第二个参数,因为它将所有适用字符转义到它们的html实体,包括引号。

        5
  •  0
  •   Dor    16 年前

    注意:应避免在UTF-8编码文档中使用htmlentities()。见:

    注意(引自) phpwact.org

    使用现代web浏览器和宽屏 支持UTF-8,您不需要 因为所有这些 字符可以直接表示 在UTF-8中。更重要的是,在 一般来说,只有浏览器支持HTML 例如,编辑器不知道 HTML实体。取决于什么 你在做什么,使用HTML5 降低其他系统的性能 消费你的内容。

    合理-根据此处的anon评论), 角色实体(类似于或) 送达文件时不工作 作为应用程序/xml+xhtml(除非 定义它们)。你还是可以逃走的 虽然是数字形式。

        6
  •  0
  •   Laurent Thierry Blais    16 年前

    PHP 5.2及以上版本的另一个有趣的解决方案是使用过滤器扩展: http://www.php.net/manual/en/book.filter.php

    它允许您验证和清理用户输入。有许多内置的过滤器可用,它们可以与标志相结合,以调整其行为。 此外,这些过滤器还可用于验证/清理整数、浮点、电子邮件和特定正则表达式。

    我个人已经开始在我的项目中使用它们来验证表单和输出用户输入的数据,我很高兴我做到了。尽管如此,当我在MySQL数据库中插入值时,我使用准备好的查询来增加安全性。这些解决方案一起可以帮助避免大多数SQL注入和XSS类型的攻击。

        7
  •  0
  •   Pekka    14 年前

    你不可能只有一个“转义”功能,却期望它一直工作。有不同的攻击需要特定的卫生程序。理解这一概念的唯一方法是编写一些易受攻击的代码,然后加以利用。编写攻击代码对于理解任何安全系统都至关重要。

    $host=htmlspecialchars($_GET[host],ENT_QUOTES);
    $name=htmlspecialchars($_GET[name],ENT_QUOTES);
    mysql_query("select * from user where Host='$host' and Name='$name' ");
    

    利用: http://localhost/sqli_test.php?host= \&名称=%20睡眠(20)--%201

    mysql的最佳转义函数是mysqli_real_escape_string(),但这可能会失败:

    mysql_query("select * from user where id=".mysqli_real_escape_string($_GET[id]));
    

    利用: http://localhost/sqli_test.php?id=1%20or%20sleep(20)

    OWASP top 10 因为web应用程序的安全性有很多问题。