在Java和MYSQL中,在将文本插入数据库时对文本进行编码是一种好的做法吗?
让我们看看这个场景:您有一个文本框,允许用户复制任何类型的文本(UTF8或中文或阿拉伯语字符),然后有一个提交按钮将该文本插入MySQL数据库
通常,我使用URLEncoder.encode(text,"UTF-8")
&;我的应用程序运行非常稳定;我从不担心用户是否插入任何特殊字符,因为文本是经过编码的,所以当我阅读文本时,我只是对其进行解码&;课文的内容与以前一模一样
但是有些人说我们可以在MySQL和Tomcat服务器中设置UTF8,或者其他一些我们不需要编码的东西,但是这个解决方案需要配置,我讨厌配置,因为它不是一个很好的解决方案
此外,用户可以输入垃圾代码来入侵数据库
因此,在Java&;MYSQL,在将文本插入数据库时对其进行编码是一种好的做法吗
其他论坛的一些人说,在数据库中存储编码文本是非常糟糕的,但他们没有说为什么这样不好
所以这个问题是给那些在Java和MySQL方面有丰富经验的人来回答的
# 1 楼答案
在稳定性和配置方面,以及在XSS攻击中的安全性方面,在将所有内容放入数据库之前对其进行编码会更好。缺点是它占用的时间稍长,数据库中的空间稍大,当它再次创建时,你可以逃避一切,但逃避一切更容易
# 2 楼答案
将URL或XML编码的文本放入数据库的问题是,这使得查询和处理该文本变得困难
另一个问题是,在不同的环境中需要不同类型的转义
呃,断言配置“不是一个非常合理的解决方案”不是一个理性的论点。绝大多数带有数据库组件的应用程序都需要某种数据库配置
SQL注入的真正解决方案是使用
PreparedStatement
和固定的SQL查询、插入、更新等字符串。对所有查询参数使用占位符,并使用PreparedStatement
set参数方法提供它们的值。这将正确引用参数中的文本,以消除SQL注入攻击的可能性您需要担心的另一件事是,人们使用未替换的XML/HTML元字符(如
<
、>
和引号)对其他用户实施XSS攻击。解决这个问题的方法是在创建HTML时转义文本。例如,您可以使用<c:out>
来转义文本最后,HTML URL编码的文本不能直接插入HTML页面。URL编码方案(使用%和+)不是HTML页面中文本的正确编码方案。在这里,您需要使用
&...;
字符实体来编码。文本中的%xx
与在浏览器中显示网页时的显示完全相同。试试看回答评论中的问题:
如果将PreparedStatement与SQL一起使用,并且SQL中的所有文本参数都有占位符,那么JDBC驱动程序会自动处理转义
同样的答案
如果你使用预先准备好的语句和
<c:out>
(或等效语句),就不会有什么麻烦是的,但是当输出文本以包含在网页中时,您只需要对其进行HTML编码。如果将其输出为JSON,则使用JSON转义进行编码。。。或者更可能的情况是,您让JSON序列化程序为您完成这项工作。如果您以其他格式发送文本,或将其包含在其他内容中,您可以根据需要对其进行编码。。。或者根本没有
但关键是,你不能以编码的形式将其存储在数据库中。如果你这样做了,那么在几乎所有情况下(包括HTML!!)在编码之前,您需要解码HTML URL编码文本