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

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

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

1、簡(jiǎn)單又有效的方法是使用PreparedStatement

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

好處:

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

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

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

原理:

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

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

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

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

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

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

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

2、使用過(guò)濾器

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

String begin="您的請(qǐng)求參數(shù)信息";
 
//可以通過(guò)配置文件,去配置這些特殊字符,以便隨時(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()){
    //危險(xiǎn)請(qǐng)求參數(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)來(lái)的參數(shù) 4 or 1 = 1就會(huì)被當(dāng)作是一個(gè)student_id,所以就不會(huì)出現(xiàn)sql注入了。

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • JavaWeb項(xiàng)目中classpath路徑詳解

    JavaWeb項(xiàng)目中classpath路徑詳解

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

    Java中StopWatch的使用示例詳解

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

    淺析我對(duì) String、StringBuilder、StringBuffer 的理解

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

    牡丹江市| 绵阳市| 和静县| 德安县| 滦南县| 海林市| 维西| 德安县| 和静县| 永嘉县| 腾冲县| 濉溪县| 大理市| 故城县| 长子县| 秀山| 灵宝市| 全南县| 灌阳县| 平远县| 益阳市| 东海县| 大洼县| 沧源| 云南省| 罗山县| 吴江市| 岚皋县| 巴青县| 泰兴市| 吉首市| 合作市| 鹿邑县| 安康市| 滦南县| 邹平县| 津南区| 邵东县| 志丹县| 卓资县| 台州市|