防sql注入java
『壹』 java拼接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();
『貳』 java防止sql注入有哪些方法
前台我們可以通過過濾用戶輸入,後台可以通過PreparedStatement來代替Statement來執行SQL語句。
『叄』 如何防止SQL注入攻擊之java網站安全部署
java防SQL注入,最簡單的辦法是杜絕SQL拼接,SQL注入攻擊能得逞是因為在原有SQL語句中加入了新的邏輯,如果使用PreparedStatement來代替來執行SQL語句,其後只是輸入參數,SQL注入攻擊手段將無效,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結構,大部分的SQL注入已經擋住了,在WEB層我們可以過濾用戶的輸入來防止SQL注入比如用Filter來過濾全局的表單參數 。下面就舉三個例子來說明一下:
第一種:
採用預編譯語句集,它內置了處理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(".*([';]+|(--)+).*", " ");
}
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();
『肆』 用java編寫防止SQL注入!求java高手指點!問題解決後,一定提高懸賞!
SQL注入無非就是把對單引號和雙"-"進行轉換。
最好不要拼裝SQL語句,以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
『伍』 java防止SQL注入的問題
"select * from where uname=? and upass=?"; select * from 表名,你的表名呢?沒表名就直接where?
『陸』 如何防止網站被SQL注入攻擊之java網站安全部署
開發階段: 使用預編譯的sql 比如statement --> preparedStatement,使用orm框架時 setParameter(參數綁定,而不是在語句中直接拼接),或者通過servlet進行所有請求攔截過濾攻擊字元
網站10大常見安全漏洞及解決方案
『柒』 java防止SQL注入的幾個途徑
java防SQL注入,最簡單的辦法是杜絕SQL拼接,SQL注入攻擊能得逞是因為在原有SQL語句中加入了新的邏輯,如果使用PreparedStatement來代替Statement來執行SQL語句,其後只是輸入參數,SQL注入攻擊手段將無效,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結構,大部分的SQL注入已經擋住了,在WEB層我們可以過濾用戶的輸入來防止SQL注入比如用Filter來過濾全局的表單參數
01importjava.io.IOException;
02importjava.util.Iterator;
03importjavax.servlet.Filter;
04importjavax.servlet.FilterChain;
05importjavax.servlet.FilterConfig;
06importjavax.servlet.ServletException;
07importjavax.servlet.ServletRequest;
08importjavax.servlet.ServletResponse;
09importjavax.servlet.http.HttpServletRequest;
10importjavax.servlet.http.HttpServletResponse;
11/**
12*通過Filter過濾器來防SQL注入攻擊
13*
14*/
{
16privateStringinj_str="'|and|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncate|char|declare|;|or|-|+|,";
=null;
18/**
19*?
20*/
21protectedbooleanignore=true;
22publicvoidinit(FilterConfigconfig)throwsServletException{
23this.filterConfig=config;
24this.inj_str=filterConfig.getInitParameter("keywords");
25}
26publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
27FilterChainchain)throwsIOException,ServletException{
28HttpServletRequestreq=(HttpServletRequest)request;
29HttpServletResponseres=(HttpServletResponse)response;
30Iteratorvalues=req.getParameterMap().values().iterator();//獲取所有的表單參數
31while(values.hasNext()){
32String[]value=(String[])values.next();
33for(inti=0;i<value.length;i++){
34if(sql_inj(value[i])){
35//TODO這里發現sql注入代碼的業務邏輯代碼
36return;
37}
38}
39}
40chain.doFilter(request,response);
41}
42publicbooleansql_inj(Stringstr)
43{
44String[]inj_stra=inj_str.split("\|");
45for(inti=0;i<inj_stra.length;i++)
46{
47if(str.indexOf(""+inj_stra[i]+"")>=0)
48{
49returntrue;
50}
51}
52returnfalse;
53}
54}
也可以單獨在需要防範SQL注入的JavaBean的欄位上過濾:
1/**
2*防止sql注入
3*
4*@paramsql
5*@return
6*/
(Stringsql){
8returnsql.replaceAll(".*([';]+|(--)+).*","");
9}
『捌』 java中preparedstatement為什麼可以防止sql注入
其實是預編譯功能,用preparedstatement就會把sql的結構給資料庫預編譯。
SQL注入 攻 擊 是利用是指利用 設計 上的漏洞,在目 標 服 務 器上運行 Sql語 句以及 進 行其他方式的 攻 擊 ,
動態 生成 Sql語 句 時 沒有 對 用 戶輸 入的數據 進 行 驗證 是 Sql注入 攻 擊 得逞的主要原因。
對 於 JDBC而言, SQL注入 攻 擊 只 對 Statement有效, 對 PreparedStatement 是無效的, 這 是因 為 PreparedStatement 不允 許 在不同的插入 時間 改 變查詢 的 邏輯結 構。
如 驗證 用 戶 是否存在的 SQL語 句 為 :
select count(*) from usertable where name='用 戶 名 ' and pswd='密 碼 '
如果在 用 戶 名欄位 中 輸 入 ' or '1'='1' or '1'='1
或是在 密 碼 欄位 中 輸 入 1' or '1'='1
將 繞過驗證 ,但 這種 手段只 對 只 對 Statement有效, 對 PreparedStatement 無效。
PreparedStatement 相 對 Statement有以下 優 點:
1.防注入攻擊
2.多次運行速度快
3.防止資料庫緩沖區溢出
4.代 碼 的可讀性可維護性好
加油!
『玖』 java如何防止sql注入
採用預編譯語句集,它內置了處理SQL注入的能力,只要使用它的setString方法傳值即可:
String
sql=
"select
*
from
users
where
username=?;
PreparedStatement
preState
=
conn.prepareStatement(sql);
preState.setString(1,
userName);
preState.setString(2,
password);
ResultSet
rs
=
preState.executeQuery();