有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java和MYSQL中,在将文本插入数据库时对文本进行编码是一种好的做法吗?

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

通常,我使用URLEncoder.encode(text,"UTF-8")&;我的应用程序运行非常稳定;我从不担心用户是否插入任何特殊字符,因为文本是经过编码的,所以当我阅读文本时,我只是对其进行解码&;课文的内容与以前一模一样

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

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

因此,在Java&;MYSQL,在将文本插入数据库时对其进行编码是一种好的做法吗

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

所以这个问题是给那些在Java和MySQL方面有丰富经验的人来回答的


共 (2) 个答案

  1. # 1 楼答案

    在稳定性和配置方面,以及在XSS攻击中的安全性方面,在将所有内容放入数据库之前对其进行编码会更好。缺点是它占用的时间稍长,数据库中的空间稍大,当它再次创建时,你可以逃避一切,但逃避一切更容易

  2. # 2 楼答案

    将URL或XML编码的文本放入数据库的问题是,这使得查询和处理该文本变得困难

    另一个问题是,在不同的环境中需要不同类型的转义

    ... but this solution requires configuration & I hate configuration as it is not a very sound solution.

    呃,断言配置“不是一个非常合理的解决方案”不是一个理性的论点。绝大多数带有数据库组件的应用程序都需要某种数据库配置

    Besides, users can enter junk code to hack the DB.

    SQL注入的真正解决方案是使用PreparedStatement和固定的SQL查询、插入、更新等字符串。对所有查询参数使用占位符,并使用PreparedStatementset参数方法提供它们的值。这将正确引用参数中的文本,以消除SQL注入攻击的可能性

    您需要担心的另一件事是,人们使用未替换的XML/HTML元字符(如<>和引号)对其他用户实施XSS攻击。解决这个问题的方法是在创建HTML时转义文本。例如,您可以使用<c:out>来转义文本

    最后,HTML URL编码的文本不能直接插入HTML页面。URL编码方案(使用%和+)不是HTML页面中文本的正确编码方案。在这里,您需要使用&...;字符实体来编码。文本中的%xx与在浏览器中显示网页时的显示完全相同。试试看


    回答评论中的问题:

    iamthepiguy said "encode everything before putting it into Db", but u said "No". Suppose i put Html text into DB, there a lot of special characters & many other stuffs, how can we let Db to handle all of them, for example, if mysql doesn't recognize a char, it will turn to "?" & it means the text got corrupted, it mean the users lost that text. How Mysql handle all kind of special characters?

    如果将PreparedStatement与SQL一起使用,并且SQL中的所有文本参数都有占位符,那么JDBC驱动程序会自动处理转义

    Also, since there is a very diversity of UTF & special chars, so how many other things we need to worry if we do not encode text to make sure the system run stably?

    同样的答案

    Encoded text make the system run a bit slower, but we are headache-free.

    如果你使用预先准备好的语句和<c:out>(或等效语句),就不会有什么麻烦

    you sid "The way to defeat that is to escape the text at the point you are creating the HTML." so we have to use Java to encode right?

    是的,但是当输出文本以包含在网页中时,您只需要对其进行HTML编码。如果将其输出为JSON,则使用JSON转义进行编码。。。或者更可能的情况是,您让JSON序列化程序为您完成这项工作。如果您以其他格式发送文本,或将其包含在其他内容中,您可以根据需要对其进行编码。。。或者根本没有

    但关键是,你不能以编码的形式将其存储在数据库中。如果你这样做了,那么在几乎所有情况下(包括HTML!!)在编码之前,您需要解码HTML URL编码文本