【问题标题】:How secure are PreparedStatements? [duplicate]PreparedStatements 的安全性如何? [复制]
【发布时间】:2016-01-30 07:02:07
【问题描述】:

我最近了解到不使用 PreparedStatements 的 .set() 方法是一个相当大的安全漏洞。

在查看了一些代码示例后,我对 PreparedStatements 及其安全性有一些疑问。

如果有人可以攻击 MySQL 查询以更改数据,PreparedStatement 的 .set() 方法究竟如何防止攻击?

例如,如果查询是

INSERT INTO table_name(?, ?);

(假设两个问号都是字符串)

难道不能简单地将 table_name 更改为另一个表吗?

另一个例子; 如果查询是

 UPDATE table_name SET column_name=?;

一个人不能更改 column_name 以使查询更改不同的列吗?

我能想到的最后一个例子; 如果查询是

SELECT column_name FROM table_name WHERE column2_name = ?;

攻击者是否有可能修改 column_name、table_name 等,或者在查询中注入其他操作?

您可能会说,我对安全性和 MySQL 知之甚少,如果这些问题非常明显,请见谅。谢谢!

【问题讨论】:

    标签: java mysql security jdbc prepared-statement


    【解决方案1】:

    准备好的语句中的价值是将变量数据与查询字符串本身分开。这提供了两个主要优点:

    1. 在重复查询的情况下,仅发送的数据不同,查询本身不需要重新解析;相反,只需要发送新数据。

    2. 您可以免受 SQL 注入攻击,因为您的数据与查询字符串本身是分开的,并且以安全的方式发送。

      李>

    准备好的语句(也不打算)保护您免受客户端和数据库之间的中间人攻击,这些攻击可能会改变您打算执行的查询(或数据)发送。为此,您需要使用 SSL 传输,否则请确保攻击者无法干预您与数据库的通信。

    【讨论】:

    • 好的。所以它的要点是SQL注入攻击只能修改查询中发送的数据,而不是查询本身?并且 MITM 攻击实际上能够修改查询? (谢谢你的回复顺便说一句)。
    • 成功的 SQL 注入攻击意味着您的数据是查询字符串本身的一部分,而漏洞在于查询会执行您不希望的事情,而不仅仅是进入数据库的不正确数据。如果数据与查询分离,那么任何恶意输入都只是数据的一部分。如果攻击者能够读取和修改数据,MITM 可能会影响您的应用程序通过攻击者传递的任何内容。 (但请注意,只读 MITM 仍然可能很危险。)
    【解决方案2】:

    如果使用得当,Prepared 语句确实可以防止 SQL 注入。但请记住,Prepared 语句只能保护数据,而不能保护程序本身。

    看这里: How can prepared statements protect from SQL injection attacks?

    【讨论】:

    • 好的,这就更清楚了,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2019-01-03
    • 2020-12-06
    • 2012-06-15
    • 2013-01-19
    • 2014-02-10
    • 2014-12-23
    相关资源
    最近更新 更多