[英]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.