1. 程式人生 > >ref:Java防止SQL註入

ref:Java防止SQL註入

tran sql註入 自己 user span api session replace article

ref:https://blog.csdn.net/abc19900828/article/details/39501349

小結:spring采用JdbcTemplate來操作sql,一般不要自行拼接sql,而是使用參數化的構造方式,則不會存在註入問題。

SQL 註入簡介:
SQL註入是最常見的攻擊方式之一,它不是利用操作系統或其它系統的漏洞來實現攻擊的,而是程序員因為沒有做好判斷,被不法用戶鉆了SQL的空子,下面我們先來看下什麽是SQL註入:

比如在一個登陸界面,要求用戶輸入用戶名和密碼:

用戶名: ‘ or 1=1 --

密 碼:

點登陸,如若沒有做特殊處理,而只是一條帶條件的查詢語句如:

String sql="select * from users where username=‘"+userName+"‘ and password=‘"+password+"‘ "

那麽這個非法用戶就很得意的登陸進去了.(當然現在的有些語言的數據庫API已經處理了這些問題)

這是為什麽呢?我們來看看這條語句,將用戶輸入的數據替換後得到這樣一條語句:

select * from users where username=‘‘ or 1=1 --‘ and password=‘‘

為了更明白些,可以將其復制到SQL分析器中,將會發現,這條語句會將數據庫的數據全部讀出來,為什麽呢?

很簡單,看到條件後面 username=‘‘ or 1=1 用戶名等於 ‘‘ 或 1=1 那麽這個條件一定會成功,然後後面加兩個-,這意味著

什麽?沒錯,註釋,它將後面的語句註釋,讓他們不起作用,這樣就可以順利的把數據庫中的數據讀取出來了。

這還是比較溫柔的,如果是執行
select * from users where username=‘‘ ;DROP Database (DB Name) --‘ and password=‘‘

.......其他的您可以自己想象。。。

那麽我們怎麽來處理這種情況呢?下面我以java為列給大家兩種簡單的方法:

第一種采用預編譯語句集,它內置了處理SQL註入的能力,只要使用它的setString方法傳值即可:
String sql= "select * from users where username=? and password=?;
PreparedStatement preState = conn.prepareStatement(sql);
preState.setString(1, userName);
preState.setString(2, password);
ResultSet rs = preState.executeQuery();
...

第二種是采用正則表達式將包含有 單引號(‘),分號(;) 和 註釋符號(--)的語句給替換掉來防止SQL註入
public static String TransactSQLInjection(String str)
{
return str.replaceAll(".*([‘;]+|(--)+).*", " ");

// 我認為 應該是return str.replaceAll("([‘;])+|(--)+","");

}

userName=TransactSQLInjection(userName);
password=TransactSQLInjection(password);

String sql="select * from users where username=‘"+userName+"‘ and password=‘"+password+"‘ "
Statement sta = conn.createStatement();
ResultSet rs = sta.executeQuery(sql); 第三種 使用Hibernate框架的SQL註入防範   Hibernate是目前使用最多的ORM框架,在Java Web開發中,很多時候不直接使用JDBC,而使用Hibernate來提高開發效率。在Hibernate中,仍然不應該通過拼接HQL的方式,而應使用參數化的方式來防範SQL註入。有兩種方式,一種仍然是使用JDBC一樣的占位符“?”,但更好的方式是使用Hibernate的命名參數,例如檢測用戶名和密碼是否正確,使用Hibernate可以寫成: String queryStr = “from user where username=:username ”+”password=:password”; List result = session.createQuery(queryStr).setString("username", username).setString("password", password).list();

ref:Java防止SQL註入