PreparedStatements 有多安全?
How secure are PreparedStatements?
我最近了解到不使用 PreparedStatements 的 .set() 方法是一个相当大的安全漏洞。
看过一些代码示例后,我对 PreparedStatements 及其安全性有一些疑问。
如果有人可以攻击 MySQL 查询来更改数据,那么 PreparedStatement 的 .set() 方法究竟如何防止攻击?
例如,如果查询是
INSERT INTO table_name(?, ?);
(假设两个问号都是字符串)
有人不能简单地将 table_name 更改为另一个 table 吗?
另一个例子;
如果查询是
UPDATE table_name SET column_name=?;
一个人不能更改 column_name 以使查询更改不同的列吗?
我能想到的最后一个例子;
如果查询是
SELECT column_name FROM table_name WHERE column2_name = ?;
攻击者是否有可能修改 column_name、table_name 等或将其他操作注入查询?
如您所知,我对安全和 MySQL 知之甚少,如果这些是非常明显的问题,请原谅。谢谢!
准备好的语句,如果使用得当,确实可以防止 SQL 注入。但是请记住,Prepared statements 只能保护数据,而不能保护程序本身。
看这里:
How can prepared statements protect from SQL injection attacks?
预处理语句的价值在于将变量数据与查询字符串本身分开。这提供了两个主要优势:
对于仅发送数据不同的重复查询,查询本身不需要重新解析;相反,只需要发送新数据。
您可以免受 SQL 注入攻击,这些攻击可能会导致不正确转义的数据直接包含在您的查询字符串中,因为您的数据与查询字符串本身是分开的,并且是以安全的方式发送的方式。
准备好的语句不会(也不打算)保护您免受客户端和数据库之间可能改变查询(或数据)你打算发送。为此,您需要使用 SSL 传输,否则请确保攻击者无法介入您与数据库的通信。
我最近了解到不使用 PreparedStatements 的 .set() 方法是一个相当大的安全漏洞。
看过一些代码示例后,我对 PreparedStatements 及其安全性有一些疑问。
如果有人可以攻击 MySQL 查询来更改数据,那么 PreparedStatement 的 .set() 方法究竟如何防止攻击?
例如,如果查询是
INSERT INTO table_name(?, ?);
(假设两个问号都是字符串)
有人不能简单地将 table_name 更改为另一个 table 吗?
另一个例子; 如果查询是
UPDATE table_name SET column_name=?;
一个人不能更改 column_name 以使查询更改不同的列吗?
我能想到的最后一个例子; 如果查询是
SELECT column_name FROM table_name WHERE column2_name = ?;
攻击者是否有可能修改 column_name、table_name 等或将其他操作注入查询?
如您所知,我对安全和 MySQL 知之甚少,如果这些是非常明显的问题,请原谅。谢谢!
准备好的语句,如果使用得当,确实可以防止 SQL 注入。但是请记住,Prepared statements 只能保护数据,而不能保护程序本身。
看这里: How can prepared statements protect from SQL injection attacks?
预处理语句的价值在于将变量数据与查询字符串本身分开。这提供了两个主要优势:
对于仅发送数据不同的重复查询,查询本身不需要重新解析;相反,只需要发送新数据。
您可以免受 SQL 注入攻击,这些攻击可能会导致不正确转义的数据直接包含在您的查询字符串中,因为您的数据与查询字符串本身是分开的,并且是以安全的方式发送的方式。
准备好的语句不会(也不打算)保护您免受客户端和数据库之间可能改变查询(或数据)你打算发送。为此,您需要使用 SSL 传输,否则请确保攻击者无法介入您与数据库的通信。