最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何有效避免SQL注入漏洞的方法總結(jié)

 更新時間:2022年01月04日 14:41:27   作者:LiveEveryDay  
SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,它不是利用操作系統(tǒng)的BUG來實現(xiàn)攻擊,而是針對程序員編程時的疏忽,通過SQL語句,實現(xiàn)無帳號登錄,甚至篡改數(shù)據(jù)庫,這篇文章主要給大家介紹了關(guān)于Java如何避免SQL注入漏洞的兩種方法,需要的朋友可以參考下

1、簡單又有效的方法是使用PreparedStatement

采用預(yù)編譯語句集,它內(nèi)置了處理SQL注入的能力,只要使用它的setXXX(如:setString)方法傳值即可。

好處:

(1).代碼的可讀性和可維護(hù)性變好。

(2).PreparedStatement盡最大可能提高性能。

(3).最重要的一點是極大地提高了安全性。

原理:

SQL注入只對SQL語句的編譯過程有破壞作用,而PreparedStatement的SQL語句編譯階段已經(jīng)準(zhǔn)備好了,執(zhí)行階段只是把輸入串作為數(shù)據(jù)處理,而不再對SQL語句進(jìn)行解析、準(zhǔn)備,因此也就避免了SQL注入問題。

一些熱門ORM框架在處理SQL時候也都使用了PreparedStatement,比如MyBatis。

我們在使用MyBatis要注意:在注入?yún)?shù)值得時候使用#{xxx},#{xxx}已經(jīng)啟用了預(yù)編譯功能,在SQL執(zhí)行前,會先將上面的SQL發(fā)送給數(shù)據(jù)庫進(jìn)行編譯;執(zhí)行時,直接使用編譯好的SQL,替換占位符“?”就可以了。因為SQL注入只能對編譯過程起作用,所以這樣的方式就很好地避免了SQL注入的問題。

“${xxx}”這樣格式的參數(shù)會直接參與SQL編譯,從而不能避免注入攻擊。

有時有些操作要使用這種方式,比如傳入表,模糊匹配等。這時可以使用bind+#{}防止SQL注入(#{}進(jìn)行預(yù)編譯,傳遞的參數(shù)不進(jìn)行編譯,只作為參數(shù),相當(dāng)于PreparedStatement)。

bind元素可以從OGNL表達(dá)式中創(chuàng)建一個變量并將其綁定到上下文。比如:

<select id="selectBlog" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG WHERE title LIKE #{pattern}
</select>

2、使用過濾器

如果我們做不到所有的SQL語句都使用PreparedStatement,我們可以使用過濾器,進(jìn)行全局的攔截這些字符串。在過濾器中,使用正則表達(dá)式過濾傳入的參數(shù)。使用正則表達(dá)式,判斷是否匹配:

String begin="您的請求參數(shù)信息";
 
//可以通過配置文件,去配置這些特殊字符,以便隨時添加一些關(guān)鍵字。
String pattern="|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like";
 
Pattern r = Pattern.compile(pattern);
Matcher isMatch = r.matcher(begin);
if(isMatch.find()){
    //危險請求參數(shù)
}

防止sql注入的一些建議

1. 代碼層防止sql注入攻擊的最佳方案就是sql預(yù)編譯

public List<Course> orderList(String studentId){
    String sql = "select id,course_id,student_id,status from course where student_id = ?";
    return jdbcTemplate.query(sql,new Object[]{studentId},new BeanPropertyRowMapper(Course.class));
}

這樣我們傳進(jìn)來的參數(shù) 4 or 1 = 1就會被當(dāng)作是一個student_id,所以就不會出現(xiàn)sql注入了。

2. 確認(rèn)每種數(shù)據(jù)的類型,比如是數(shù)字,數(shù)據(jù)庫則必須使用int類型來存儲

3. 規(guī)定數(shù)據(jù)長度,能在一定程度上防止sql注入

4. 嚴(yán)格限制數(shù)據(jù)庫權(quán)限,能最大程度減少sql注入的危害

5. 避免直接響應(yīng)一些sql異常信息,sql發(fā)生異常后,自定義異常進(jìn)行響應(yīng)

6. 過濾參數(shù)中含有的一些數(shù)據(jù)庫關(guān)鍵詞

總結(jié)

到此這篇關(guān)于Java如何避免SQL注入漏洞的文章就介紹到這了,更多相關(guān)Java避免SQL注入漏洞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaWeb項目中classpath路徑詳解

    JavaWeb項目中classpath路徑詳解

    今天小編就為大家分享一篇關(guān)于JavaWeb項目中classpath路徑詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java中StopWatch的使用示例詳解

    Java中StopWatch的使用示例詳解

    stopWatch 是org.springframework.util 包下的一個工具類,使用它可直觀的輸出代碼執(zhí)行耗時,以及執(zhí)行時間百分比,這篇文章主要介紹了Java中StopWatch的使用詳解,需要的朋友可以參考下
    2025-04-04
  • 淺析我對 String、StringBuilder、StringBuffer 的理解

    淺析我對 String、StringBuilder、StringBuffer 的理解

    StringBuilder、StringBuffer 和 String 一樣,都是用于存儲字符串的。這篇文章談?wù)勑【帉tring、StringBuilder、StringBuffer 的理解,感興趣的朋友跟隨小編一起看看吧
    2020-05-05
  • 最新評論

    葵青区| 梁平县| 富锦市| 连城县| 亚东县| 黔西| 嘉善县| 永善县| 平远县| 正镶白旗| 灌南县| 昌江| 浦东新区| 巨野县| 萍乡市| 建湖县| 南澳县| 莎车县| 黄冈市| 黄骅市| 高碑店市| 石台县| 曲周县| 福建省| 临澧县| 梁平县| 普兰县| 城固县| 镇安县| 东城区| 进贤县| 吉木乃县| 池州市| 梅河口市| 衡东县| 昆山市| 五常市| 定安县| 长宁县| 虞城县| 闵行区|