繁体   English   中英

在插入数据库而不是输出之前逃避HTML是一个坏主意吗?

[英]Is it a bad idea to escape HTML before inserting into a database instead of upon output?

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

我在这里看到的其他类似问题看起来像HTML仍然可以用于格式化的情况,所以我要求的情况是根本不会使用HTML。

是的,因为在某个阶段您需要访问输入的原始输入。 这是因为...

  • 你永远不知道你想如何显示它 - 用JSON,HTML,作为短信?
  • 可能需要按原样将其显示给用户。

我确实看到了你从不想输入HTML的观点。 你还用什么去剥离HTML标签? 如果它是正则表达式,那么请留意可能输入类似内容的混淆用户...

3<4 :->

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

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

如果你已经在你的数据库中存储了转义的html,你首先必须'unescape'存储在数据库中的值,只是为了再次将它重新转换为不同的格式。

还看到了关于xss预防的完美owasp文章

  1. 另一个难以捉摸的问题:假设您输入的是带有字符串R&B的记录。 它将存储为R&amp;B 并假设我们有一个使用SQL的搜索功能:

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

    现在,如果有人搜索R&B ,它将与该行不匹配,因为它存储为R&amp;B 平等,排序等情况相同。

    当然,这里我们遇到的问题是不搜索HTML标签,因为当有人搜索span时, <span>会匹配。 这可以通过将搜索功能委托给像Solr这样的外部服务来解决,或者通过将版本存储在第二个字段中来解决,该字段清除了HTML标签,特殊字符等(用于全文搜索),类似于@limscoder建议的内容。

  2. 有一天,您可能会通过API或其他方式公开您的数据,并且您的API用户可能会认为它是未转义的。

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

  4. htmlspecialchars()引用样式(例如ENT_QUOTESENT_COMPAT等)会咬你,如果你使用的是默认值之外的任何东西,并且忘记在存储/输出中使用相同的引用样式。

    当你使用htmlentities()来存储,并使用htmlspecialchars()来输出时,会发生类似的问题,反之亦然(使用相应的反函数)。 您的HTML将被&Uuml;污染&Uuml; s, &Ccedil;

    如果有多个开发人员在相同的代码库上工作,则更容易被滥用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM