SQL隱碼攻擊如何防止

2020-09-22 11:01:00

SQL隱碼攻擊如何防止

​ SQL隱碼攻擊是駭客對資料庫進行攻擊常用的手段之一,隨著B/S模式應用開發的發展,由於沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢程式碼,根據程式返回的結果,獲得某些他想獲取的資料,這就是所謂的SQL Injection,即SQL隱碼攻擊。

什麼是SQL隱碼攻擊

​ 下面我們就通過實際生產中的例子來演示什麼是SQL隱碼攻擊。

不安全程式碼編寫

​ 當我們不注意sql攻擊的時候sql容易些成下面這樣:

public List<People> orderList (String peopleid){
    String sql = " select id,name,age from people where people_id = " + peopleid;
    return jdbcTemplate.query(sql,new BeanPropertyRowMapper(People.class));
}

這個時候我們將前端傳入的引數直接拼接到sql語句的後端,此時就容易出現sql注入攻擊。

攻擊方式
  • 越過判斷條件查詢所有資料

    • 通過前面的分析,由於是sql拼接,所以我們在攻擊的時候只需要在其後面拼接一個諸如:or 1=1的恆等式,即可查詢到所有的資訊。
  • 查詢mysql版本號(version())

    • 使用union拼接sql
  • 查詢資料庫名(database())

    • 使用union拼接sql
  • 查詢mysql當前使用者的所有庫

    • 也是使用union拼接sql

    由此我們可以看出,只要使用拼接sql的方式,對方就有一百種方法來攻擊你,找到一些關鍵資料。

如何防止sql注入

程式碼層

​ 程式碼層防止sql注入攻擊的最佳方案就是sql預編譯

public List<People> orderList (String peopleid){
    String sql = " select id,name,age from people where people_id = ?" ;
    return jdbcTemplate.query(sql,new BeanPropertyRowMapper(People.class));
}

​ 這樣穿過來的引數 4 or 1 = 1 就會被當做是一個people_id,就不會出現SQL隱碼攻擊了。

其他方法

  • 確認每種資料的型別,比如是數位的,資料庫則必須使用int型別來儲存
  • 規定資料長度,能從一定程度上防止sql注入
  • 嚴格限制資料庫許可權,能最大程度上減少sql注入的危害
  • 避免直接響應一些sql異常資訊,sql發生異常後,自定義異常進行響應
  • 過濾引數中含有的一些資料庫關鍵詞

最後

  • 如果覺得看完有收穫,希望能給我點個贊,這將會是我更新的最大動力,感謝各位的支援
  • 歡迎各位關注我的公眾號【java冢狐】,專注於java和計算機基礎知識,保證讓你看完有所收穫,不信你打我
  • 如果看完有不同的意見或者建議,歡迎多多評論一起交流。感謝各位的支援以及厚愛。