0

让我们看一下这个场景:您有一个文本框,允许用户复制任何类型的文本(UTF8 或中文或阿拉伯字符),然后有一个提交按钮将该文本插入 MySQL DB。

通常,我使用URLEncoder.encode(text,"UTF-8")&我的应用程序运行非常稳定;我从不担心用户是否插入了任何特殊字符,因为文本是经过编码的,所以当我阅读文本时,我只是对其进行了解码,并且文本完全按照以前的方式出现。

但是有些人说我们可以在 MySQL 和 Tomcat 服务器中设置 UTF8 或其他东西,这样我们就不需要编码,但是这个解决方案需要配置,我讨厌配置,因为它不是一个非常完善的解决方案。

此外,用户可以输入垃圾代码来破解数据库。

那么,在 Java 和 MYSQL 中,将文本插入数据库时​​对其进行编码是一种好习惯吗?

其他论坛中的一些人说将编码文本存储在数据库中非常糟糕,但他们没有说明为什么会这样。

所以这个问题是给对Java和MySQL有很多经验的人来回答的!

4

2 回答 2

4

将 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 编码的文本,然后才能以正确的方式对其进行编码。

于 2013-05-12T02:00:35.057 回答
-1

就稳定性和配置以及 XSS 攻击的安全性而言,在将所有内容放入数据库之前对其进行编码会更好一些。缺点是它需要更长的时间,数据库中的空间也稍微多一些,并且在再次创建它时您可以将所有内容转义,但转义所有内容更容易。

于 2013-05-12T02:01:51.240 回答