java中的sql參數和sql注入

來源:互聯網
上載者:User

 

當今,大多數程式都會或多或少地使用SQL語句和資料庫打交道。在程式碼中,SQL語句以字串的形式存在,如“SELECT column1, column2, … FROM table1 WHERE param_column1 = value1 AND param_column2 =‘value2’ ”。這個例子以資料列param_column1、param_column2的值分別為value1、value2作為過濾條件,從資料表table1中查詢column1、column2等資料列。其中param_column1為整數類型,param_column2為字串類型。很多時候,value1與value2的值在程式運行時才能確定,這意味著SQL語句只能在程式運行中動態產生。不少開發人員喜歡採用字串拼湊的方式產生SQL語句,形如 “SELECT column1, column2, … FROM table1 WHERE param_column1 = ” + int_to_str( int_value )+ “ AND param_column2 =‘ ” + str_value + “ ’ ”。C程式員可能更傾向於選擇格式化字串的方式,其中格式類似於 “SELECT column1, column2,… FROM table1 WHERE param_column1 = %d AND param_column2 =‘ %s ’ ”,在實際的值代替%後,SQL語句發送給資料庫引擎。從SQL執行的角度看,字串格式化與字串拼湊並沒有太大的差別。每次查詢條件稍有變化,都會向資料庫提交不同的SQL語句。這些SQL語句之間雖然差別可能很小,但查詢引擎每次都得重新解析,造成執行效率的降低。另外,如果上面的例子中,如果param_column1或param_column2是二進位類型的資料,則要產生SQL語句顯然很麻煩。更為重要的是,這種產生SQL語句的方式存在安全隱患,很容易導致SQL注入式攻擊。又以上面的SQL語句為例,如果攻擊者為param_column2指定的值為“ ’ OR ‘’ = ‘ ”(不包含雙引號),則得到的SQL語句為“SELECT column1, column2, … FROM table1 WHERE param_column1 = value1 AND param_column2 =‘’ OR ‘’ = ‘’ ”,使WHERE子句形同虛設,table1中所有的記錄都會查詢出來。如果攻擊者更缺德一點,為param_column2指定的值為“ ’;DELETE FROM table1 WHERE ‘’ = ‘”(不包含雙引號),則得到的SQL語句為“SELECT column1, column2, … FROM table1 WHERE param_column1 = 0 AND param_column2 =‘’;DELETE FROM table1 WHERE ‘’ = ‘’ ”,執行之後,資料表table1就被清空了。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.