[英]Is it a bad idea to escape HTML before inserting into a database instead of upon output?
我一直在研究一个不允许HTML格式化的系统。 我目前使用的方法是在HTML实体插入数据库之前将其转义。 我被告知我应该将原始文本插入数据库,并在输出时转义HTML实体。
我在这里看到的其他类似问题看起来像HTML仍然可以用于格式化的情况,所以我要求的情况是根本不会使用HTML。
是的,因为在某个阶段您需要访问输入的原始输入。 这是因为...
我确实看到了你从不想输入HTML的观点。 你还用什么去剥离HTML标签? 如果它是正则表达式,那么请留意可能输入类似内容的混淆用户...
3<4 :->
如果是正则表达式,他们只会得到3
。
另一个难以捉摸的问题:假设您输入的是带有字符串R&B
的记录。 它将存储为R&B
并假设我们有一个使用SQL的搜索功能:
$query = $database->prepare('SELECT * FROM table WHERE title LIKE ?'); $query->execute(array($searchString.'%'));
现在,如果有人搜索R&B
,它将与该行不匹配,因为它存储为R&B
平等,排序等情况相同。
当然,这里我们遇到的问题是不搜索HTML标签,因为当有人搜索span
时, <span>
会匹配。 这可以通过将搜索功能委托给像Solr这样的外部服务来解决,或者通过将版本存储在第二个字段中来解决,该字段清除了HTML标签,特殊字符等(用于全文搜索),类似于@limscoder建议的内容。
有一天,您可能会通过API或其他方式公开您的数据,并且您的API用户可能会认为它是未转义的。
几个月后,一个新的团队成员加入。 作为一个训练有素的开发人员,他总是使用html转义,现在只是为了看到所有内容都被双重转义(例如,有些标题出现像He said "nuff"
而不是He said "nuff"
)。
htmlspecialchars()
引用样式(例如ENT_QUOTES
, ENT_COMPAT
等)会咬你,如果你使用的是默认值之外的任何东西,并且忘记在存储/输出中使用相同的引用样式。
当你使用htmlentities()
来存储,并使用htmlspecialchars()
来输出时,会发生类似的问题,反之亦然(使用相应的反函数)。 您的HTML将被Ü
污染Ü
s, Ç
等
如果有多个开发人员在相同的代码库上工作,则更容易被滥用。
我通常存储两个版本的文本。 在进行正常页面请求时使用转义/格式化文本以避免每次转义/格式化的开销。 当用户需要编辑现有条目时使用原始/原始文本,并且仅在创建或更改文本时发生转义/格式化。 除非您有严格的存储空间限制,否则此策略很有效,因为您将复制数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.