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

在插入数据库之前而不是在输出时转义HTML是个坏主意吗?

  •  22
  • unrelativity  · 技术社区  · 14 年前

    我一直在开发一个不允许HTML格式的系统。我目前使用的方法是在HTML实体插入数据库之前对它们进行转义。我被告知应该将原始文本插入数据库,并在输出时转义HTML实体。

    我在这里看到的其他类似问题类似于HTML仍然可以用于格式化的情况,所以我想问一个HTML根本不会被使用的情况。

    4 回复  |  直到 12 年前
        1
  •  17
  •   knittl    14 年前

    在插入数据库之前执行转义操作时,也会限制自己。假设您决定不使用HTML作为输出,而是使用JSON、纯文本等。

    如果您已将转义的html存储在db中,则首先必须“取消转义”db中存储的值,以便再次将其转义为不同的格式。

    也看到这个完美的 owasp article on xss prevention

        2
  •  18
  •   alex    14 年前

    • 你永远不知道你想如何显示它-在JSON中,在HTML中,作为短信?
    • 你呢 可以 需要把它展示给用户 原样 .

    我明白你的意思,永远不要输入HTML。你用什么去掉HTML标签?如果它是正则表达式,那么请注意那些可能会键入以下内容的困惑用户。。。

    3<4 :->
    

    他们只会得到 3 如果是正则表达式。

        3
  •  4
  •   limscoder    14 年前

    我通常存储两个版本的文本。转义/格式化文本在发出普通页面请求时使用,以避免每次转义/格式化的开销。原始/原始文本在用户需要编辑现有条目时使用,转义/格式化仅在创建或更改文本时发生。除非您的存储空间限制很紧,否则此策略非常有效,因为您将复制数据。

        4
  •  4
  •   Halil Özgür    12 年前
    1. R&B 在它的标题里。它将存储为 R&amp;B

      $query = $database->prepare('SELECT * FROM table WHERE title LIKE ?');
      $query->execute(array($searchString.'%'));    
      

      R&B公司 R&B公司

      当然,这里的问题是不搜索HTML标记,因为 <span> 当有人搜索 span . 这可以通过将搜索功能委托给一些外部服务(如Solr)来解决,或者将版本存储在第二个字段中,该字段中没有HTML标记、特殊字符等(对于全文搜索),类似于@limscoder建议的内容。

    2. 几个月后,一个新的团队成员加入。作为一个训练有素的开发人员,他总是使用html转义,现在只看到所有内容都是双转义的(例如,有标题显示为 He said &quot;nuff&quot; 而不是 He said "nuff" ).

    3. htmlspecialchars() (例如。 ENT_QUOTES , ENT_COMPAT 如果您使用的不是默认的引用样式,而是在存储/输出时忘记使用相同的引用样式,那么etc)将对您造成不利影响。

      htmlentities() 储存,以及 htmlspecialchars() &Uuml; &Ccedil; s等。

      如果有多个开发人员在同一个代码库上工作,那么这些代码就更容易被滥用。