将 URL 或 XML 编码的文本放入数据库的问题在于,这使得查询和对该文本进行其他处理变得困难。
另一个问题是在不同的上下文中需要不同类型的转义。
...但是此解决方案需要配置,我讨厌配置,因为它不是一个非常完善的解决方案。
Ermm,断言配置“不是一个非常合理的解决方案”不是一个合理的论点。具有数据库组件的绝大多数应用程序都需要某种数据库配置。
此外,用户可以输入垃圾代码来破解数据库。
SQL注入的真正解决方案是使用PreparedStatement
和修复SQL查询、插入、更新等字符串。对所有查询参数使用占位符,并使用PreparedStatement
设置参数方法来提供它们的值。这将正确引用参数中的文本,以消除 SQL 注入攻击的可能性。
您需要担心的另一件事是人们使用未转义的 XML/HTML 元字符(如<
和>
引号)来对其他用户进行 XSS 攻击。解决这个问题的方法是在创建 HTML 时转义文本。例如,您可以使用<c:out>
转义文本。
最后,HTML URL 编码的文本不能直接插入到 HTML 页面中。URL 编码方案(使用 % 和 +)不是 HTML 页面中文本的正确编码方案。在那里,您需要使用&...;
字符实体对事物进行编码。%xx
当您在浏览器中显示网页时,文本中的 A 将完全显示。试试看!
回答评论中的问题:
iamthepiguy 说“在将所有内容放入 Db 之前对其进行编码”,但您说“不”。假设我将 Html 文本放入 DB,其中有很多特殊字符和许多其他东西,我们如何让 Db 处理所有这些,例如,如果 mysql 不识别字符,它会变成“?” &这意味着文本已损坏,这意味着用户丢失了该文本。Mysql如何处理各种特殊字符?
如果您使用带有所有文本参数占位符的 SQL 的 PreparedStatement,则 JDBC 驱动程序会自动处理转义。
此外,由于 UTF 和特殊字符非常多样化,那么如果我们不对文本进行编码以确保系统稳定运行,我们还需要担心多少其他事情呢?
一样的答案。
编码文本使系统运行速度稍慢一些,但我们很头疼。
如果您使用准备好的语句和<c:out>
(或等效的),就不会令人头疼。
you sid “解决这个问题的方法是在创建 HTML 时转义文本。” 所以我们必须使用Java编码对吗?
是的,但是当您输出文本以包含在网页中时,您只能对文本进行 HTML 编码。如果将其输出为 JSON,则使用 JSON 转义进行编码……或者更有可能的是,让 JSON 序列化程序为您完成。如果您以其他格式发送文本,或者将其包含在其他内容中,您可以根据需要对其进行编码......或者根本不进行编码。
但关键是您不会以编码形式将其存储在数据库中。如果你这样做了,那么在几乎所有情况下(包括 HTML !!)你都需要先解码HTML URL 编码的文本,然后才能以正确的方式对其进行编码。