【问题标题】:Strip_tags or mysql_real_escape_string or add_magic_quotes in phpphp 中的 Strip_tags 或 mysql_real_escape_string 或 add_magic_quotes
【发布时间】:2013-02-14 14:22:49
【问题描述】:

这几天在看php安全,头晕,请解释清楚!

我知道我应该使用 strip_tags()htmlentities() 进行 XSS 攻击。但是如果我需要一些html标签,就像博客文章一样,我该怎么办!?

但是我应该在哪里使用mysql_real_escape_string()add_magic_quotes()? 这些是一样的吗?

另一个问题是,我应该对每个 SQL 查询使用 mysql_real_escape_string() 吗? (INSERTUPDATESELECTDELETE 等)?这个函数是否会对我的数据产生不良影响(例如,在具有 html 标签或'"" 的博客文章上)?

【问题讨论】:

  • add_magic_quotes 不是 PHP 内置函数。
  • strip_tags() 被认为是安全方法导致互联网上如此多的损坏的 cmets...
  • 哦,是的!我在这里找到它:php.robm.me.uk
  • 另一个很棒的资源:@​​987654322@
  • 忘掉magic_quotes吧。这是逃避某些控制字符的一种懒惰方式。继续学习更新和更有效的过滤/清理用户输入的方法,您会发现为什么 magic_quotes 已被弃用。

标签: php security


【解决方案1】:

我知道我应该使用 strip_tags()htmlentities() 进行 XSS 攻击。但是如果我需要一些html标签,就像博客文章一样,我该怎么办!?

如果您不信任用户,则解析 HTML,run all the elements and attributes through a whitelister,然后将文档序列化回 HTML。

但是我应该在哪里使用 mysql_real_escape_string() 和 add_magic_quotes()?这些是一样的吗?

它们不一样,一般来说,你应该避免它们。 Use bound parameters instead

另一个问题是,我应该对每个 SQL 查询使用 mysql_real_escape_string() 吗?

您应该先转义所有用户输入,然后再将其传递给 dabtas。

【讨论】:

    【解决方案2】:

    忘记magic_quotes。 自动转义用户输入中的某些控制字符是一种懒惰的方式。 Continue learning 关于newer and more efficient methods 过滤/清理用户输入,你会发现为什么magic_quotes has been deprecated

    这个函数会对我的数据产生不良影响吗(例如,在博客上 具有 html 标签或 ', "") 的帖子?

    您应该没有任何问题,因为数据没有存储在带有额外斜杠的数据库中。如果是,则很有可能启用了 magic_quotes,需要将其关闭。

    我应该对每个 SQL 查询使用 mysql_real_escape_string() 吗?

    在使用用户输入进行查询之前,需要对其进行过滤/清理。使用该函数或准备好的语句。

    【讨论】:

    • 最后一个问题,我使用mysql_real_escape_string() 进行sql 注入够了吗?
    • 在大多数情况下,是的,使用它就足以防止注入。但是,使用准备好的语句更安全,因为 sql 逻辑与提供的数据是分开的。
    【解决方案3】:

    如果您需要在博客文章中允许 HTML,您应该将标签和属性列入白名单,但您不应该自己尝试这样做。相反,使用 HTMLPurifier。在存储到数据库之前使用 if,因为它既重又慢,但非常安全。

    http://htmlpurifier.org/

    根本不应该使用魔术引号。曾经。 mysql_real_escape_string() 应该用于查询中提供的每个参数。这就是防止 SQL 注入所需要的一切。当然,确保连接期望您实际发送的字符编码是先决条件。

    【讨论】:

    • 最后一个问题,我使用mysql_real_escape_string() 进行sql 注入够了吗?
    • 更新了答案。基本上,是的。
    【解决方案4】:

    通用卫生功能的想法是一个错误的概念。

    每种用途都有一种正确的卫生方法。在字符串上运行通用的清理方法通常会破坏它 - 转义一段用于 SQL 查询的 HTML 代码会破坏它以在网页中使用,反之亦然。应在使用数据之前应用卫生设施:

    mysql_real_escape_string() for functional mysql_* calls (or parametrized queries)
    
    htmlspecialchars() for safe HTML output
    
    preg_quote() for use in a regular expression
    
    escapeshellarg() / escapeshellcmd() for use in an external command
    
    etc. etc.
    

    使用“一刀切”的卫生功能就像在植物上使用五种剧毒杀虫剂,根据定义,这种杀虫剂只能含有一种虫子 - 只是发现你的植物被第六种虫害,任何杀虫剂都不起作用。

    始终使用一种正确的方法,最好是在将数据传递给函数之前直接使用。除非需要,否则切勿混合方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多