簡體   English   中英

通過替換占位符而不是在查詢中附加用戶數據來防止SQL注入

[英]Preventing SQL injection by replacing place holders instead of appending user data in query

這聽起來確實是一個非常奇怪和模糊的問題。 我正在處理的迷你項目會在查詢中將where條件生成為完整的字符串,然后將其附加到主查詢中,如下所示:

String whereCondition ="someCondition";
String query = "select * from myTable "+ whereCondition;

現在,在經歷了什么是SQL注入之后,我知道這種方法是一種非常糟糕的方法,並邀請SQL注入。 我想問的是,如果我采用下面提到的另一種方法,對防止注射會有所幫助嗎?

String myTable = "table1";
String query =" select * from {0} {1}";
query = query.replace("{0}",myTable).repalce("{1}",whereCondition);

在這里,我沒有附加用戶數據和條件,而是根據需要替換了查詢模板中的占位符。

這可能是另一種不好的方法,但我需要了解它是否會起作用。

歡迎提出意見和建議。

關於SQL注入,字符串替換與字符串連接相同: UNSAFE。

字符串的產生方式無關緊要。 SQL注入的風險是,您將不安全的內容與SQL字符串組合在一起,然后再將該字符串發送到數據庫及其SQL解析器。 風險是不安全的內容可能會通過更改查詢語法來影響查詢的邏輯。

在大多數情況下,避免SQL注入漏洞的推薦方法是對動態內容使用查詢參數。 但是查詢參數只能代替SQL表達式中的標量值使用-不能使用表名,列名,整個查詢子句等。

對於您的情況,必須確保內容安全。 一種常見的方法是將內容與已知的安全模式進行比較。 例如,您的字符串myTable應該經過驗證,以匹配數據庫中的已知表之一。

驗證像whereCondition更復雜的整個子句。 如果您使用應用程序外部的任何內容(包括但不限於用戶輸入,從文件讀取的內容,Web服務返回的內容,從數據庫讀取的內容)來生成whereCondition ,則您的應用程序很容易受到攻擊。

暫無
暫無

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

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