簡體   English   中英

預備語句和SQL注入

[英]prepared statement and SQL injection

我一直在閱讀有關准備好的語句的信息,它說SQL注入仍然非常有可能。 現在,如果要創建Web應用程序,我會使用spring,但我認為它允許此類攻擊很奇怪。

PreparedStatement強制您選擇索引。 這將引起很多問題,因為您將不總是要反復選擇相同的位置來存儲數據。 即使您創建一個計數器,它也會適得其反,因為它將重置程序關閉的所有內容。

String query = "INSERT INTO offers (name,email.text) VALUES 
'"+name+"','"+email+ "','"+text+"'";

可以說上面的代碼是我的查詢。 什么是安全的替代方法,它將允許在mySQL數據庫中自動遞增。

如果像在將變量連接到SQL語句的方式編寫SQL一樣編寫SQL,則使用PreparedStatement可能會發生SQL注入攻擊。

您的查詢應為

String query = "INSERT INTO offers (name,email,text) VALUES (?,?,?)

通過像您那樣串聯這些值,您確實允許進行sql注入,因為這些變量的值可能是實際的SQL,這將導致您的插入執行不想要的操作。 您可以像我一樣使用?s,然后以編程方式設置它們。 這些值將正確轉義,以防止發生SQL注入攻擊。

閱讀本文以了解如何設置? SQL中的值,就像我寫的一樣。

使用准備好的語句

准備好的語句查詢將如下所示:

String sql = "insert into offers (name, email, text) values(?, ?, ?);

您用此創建一個PreparedStatement。 然后設置基於1的索引值並執行查詢。 SQL注入100%安全!

使用Spring,您可能會使用JdbcTemplate。 請注意,存在一個NamedParameterJdbcTemplate實現,該實現不使用索引,而是使用命名參數。 查詢將是:

String sql = "insert into offers (name, email, text) values(:name, :email, :text);

然后設置基於名稱的值並執行查詢。 同樣,SQL注入100%安全!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM