【问题标题】:Is JDBC secure?JDBC安全吗?
【发布时间】:2010-11-20 11:11:26
【问题描述】:

我是 JDBC 新手,新项目要求我使用 JDBC。我想知道的是,

JDBC 安全吗?

如何防止类似“Mysql Injection”的问题?

使用JDBC需要注意哪些安全问题?

以及如何确保,我的意思是优化安全性,以防止黑客入侵数据库?

编辑:

我试过谷歌,如果我谷歌:

"php mysql 安全问题" => 结果很多

如果我用谷歌搜索:

“jdbc mysql 安全问题” => 几乎看不到任何相关页面

这是否意味着,使用 jdbc 是安全的?不用担心被黑?

【问题讨论】:

  • 我认为,每当有人问“x 是否安全”的问题时,他们的代码中很有可能存在安全漏洞,因为安全更多的是一个过程而不是事实。代码/工具/站点不安全。它们以安全的方式(或不安全)运行和使用,并且可能存在已知漏洞。当人们问 X 是否安全时,他们倾向于认为如果答案是“是”,他们就不必再考虑安全性了。这种想法会导致漏洞。

标签: java database security jdbc


【解决方案1】:

JDBC 安全吗?

JDBC 的安全性是您使用的 JDBC 驱动程序的一个属性。一般来说,如果您的驱动程序使用 SSL 传输层,它与您的 SSL 密钥的强度一样安全。如果它使用未加密的传输,则不安全。

如何防止类似“Mysql Injection”的问题?

当您为 JDBC 编写 SQL 查询时,请注意不要合并可能包含嵌入式 SQL 的“原始”字符串。例如:

String query = "SELECT * FROM SOME_TABLE WHERE X = '" + someString + "' ;";

如果 someString 包含未转义的“'”字符,那么您打算成为 SQL 文字字符串的内容实际上可以更改为完全不同的内容。解决方法是如果 someString 包含任何“'”字符(或其他讨厌的字符),则拒绝它,或者使用插入 SQL 字符串转义的方法对其进行预处理。

另一种(更简单/更可靠/更安全)的方法是使用带有“?”的PreparedStatement占位符并使用setString(...) 等将值注入到查询中。使用PreparedStatement,可以保证JDBC 驱动程序使用适当的引用和转义来防止SQL 注入。

使用JDBC需要注意哪些安全问题?

除了上述之外,我不知道任何特定于 JDBC 的内容。事实上,上述问题都不是 JDBC 所特有的。

以及如何确保,我的意思是优化安全性,以防止黑客入侵数据库?

  1. 购买/阅读一本关于构建安全系统的好书。
  2. 小心。
  3. 请安全专家审核您的代码/系统。

【讨论】:

    【解决方案2】:

    始终使用字段验证器,在将任何内容传递给数据库访问 api 之前匹配一些特定的正则表达式规则。

    【讨论】:

    • 一般来说,这不是一个好方法。它依赖于您设计一个正则表达式,该表达式将阻止通过特定类型的字段进行 SQL 注入的所有可能的巧妙方法。 JDBC PreparedStatement 更简单更可靠。
    【解决方案3】:

    或者你可以使用实用方法:“org.apache.commons.lang.StringEscapeUtils.escapeSql(java.lang.String str)”来防止sql注入的发生。

    字符串清理始终是防止 sql 注入或跨站点脚本攻击的最佳策略。

    【讨论】:

    【解决方案4】:

    JDBC 纯粹是您的程序和数据库之间的传输。

    它是相当安全的,因为登录协议不易受到网络嗅探的影响,并且非常非常难以将任何东西注入网络流量。

    但是 JDBC 只是将您的 SQL 传输到数据库并返回结果数据集。 如果您的程序容易受到 SQL 注入的攻击,那么无论您使用的是直接连接、odbc 还是 jdbc,都将很容易受到攻击。

    真正保护自己免受 sql 注入的唯一方法是使用带有“?”的预处理语句。键入用户输入的占位符。切勿使用不安全的输入将 SQL 语句串在一起(这包括直接用户输入和用户输入的表中的数据)。

    【讨论】:

      【解决方案5】:

      JDBC 是一种数据库连接协议,它与所有其他连接数据库的方式一样安全。

      大多数安全问题与 JDBC 协议本身无关。例如,您可以通过使用 Prepared Statement 将 SQL 注入的风险降至最低。无论您如何连接到数据库,这都是正确的。

      【讨论】:

        【解决方案6】:

        使用prepared statements。对于假设的登录,您可以使用它,例如:

        PreparedStatement stmt = conn.prepareStatement("SELECT * FROM member WHERE member_username = ? AND member_password = ?");
        stmt.setString(1, username);
        stmt.setString(2, password);
        stmt.execute();
        
        ResultSet rs = stmt.getResultSet();
        // ...
        

        这将完全保护您免受 SQL 注入漏洞的影响。

        【讨论】:

        • 谢谢,这就是我当前代码中的内容。我的意思是准备好的陈述。我现在松了一口气:)
        • 这适用于 PHP/MySQL 以及几乎任何其他现代/Web 编程语言。
        • 什么是不安全的版本?
        • 从技术上讲,JDBC 规范不要求驱动程序正确转义参数。我不知道哪些驱动程序正确,哪些没有。
        • ZeroCool:不安全的版本类似于 conn.createStatement().execute("SELECT * from mytable where username='"+username+"'");
        猜你喜欢
        • 2010-11-15
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 2020-05-29
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多