1. 程式人生 > >Mybatis防止SQL注入攻擊

Mybatis防止SQL注入攻擊

相比於ORM框架,Mybatis只能被稱為半自動持久層框架,它其實是將JDBC進行了輕量級的封裝,提供SQL對映能力,便於更為方便地管理專案中的SQL程式碼,同時避免程式設計師重複手動編寫連線資料庫底層程式碼,並提供資料快取能力。

JDBC在使用時存在SQL注入攻擊的風險,同樣需要進行SQL編寫的Mybatis同樣也有這個問題,在使用時需要注意,防止被別有用心的人利用。

那麼在Mybatis中如何避免SQL注入攻擊呢?

答:在SQL對映檔案中儘量使用#指示符標識引數位置,避免使用$。

我們通過簡短的程式來看這二者實際有什麼不同。

首先我們使用$符號來注入引數

<select
id="getCustomerCar" resultType="map">
select * from tb_customer_car t where t.customer_id = ${customerId} </select>

測試用的Java程式碼:

@Test
public void testGetCustomerCar(){
    TestService service = new TestService();
    try {
        Map<String,Object> parameters = new HashMap<>();
        //如果使用SQL拼接將or 1=1拼接進SQL,那麼攻擊者就能竊取到tb_customer_car表中的所有資料
parameters.put("customerId", "1 or 1=1"); service.getCustomerCar(parameters); } catch (IOException e) { e.printStackTrace(); } }

程式輸出結果:

==>  Preparing: select * from tb_customer_car t where t.customer_id = 1 or 1=1 
==> Parameters: 
<==    Columns: customer_id, brand, model
<==        Row: 1, 福特, 福克斯
<==        Row: 2, 雪佛蘭, 科魯茲
<==      Total: 2

可以看到使用$指示符時Mybatis在編譯時將1 or 1=1直接拼接進了SQL語句中,從而導致攻擊者獲取到所有的資料。

我們將$替換為#來注入引數:

<select id="getCustomerCar" resultType="map">
    select * from tb_customer_car t where t.customer_id = #{customerId}
</select>

程式輸出結果:

==>  Preparing: select * from tb_customer_car t where t.customer_id = ? 
==> Parameters: 1 or 1=1(String)
<==    Columns: customer_id, brand, model
<==        Row: 1, 福特, 福克斯
<==      Total: 1

從輸出結果可以看出,#標識的引數被預編譯為了佔位符?,1 or 1=1是作為引數來替換佔位符。

這裡查詢出了customer_id為1的資料,是因為cutomer_id欄位是int型的,在Mysql中將int型別資料和varchar型別資料比較判斷時,會將varchar的首字元轉化為數字來和int型別資料比較判斷。

因此,為了防止SQL注入攻擊,在使用Mybatis時我們應儘量使用#而不是$來注入引數

相關推薦

Mybatis防止SQL注入攻擊

相比於ORM框架,Mybatis只能被稱為半自動持久層框架,它其實是將JDBC進行了輕量級的封裝,提供SQL對映能力,便於更為方便地管理專案中的SQL程式碼,同時避免程式設計師重複手動編寫連線資料庫底層程式碼,並提供資料快取能力。 JDBC在使用時存在SQL注

Mybatis防止sql注入原理

     SQL 注入是一種程式碼注入技術,用於攻擊資料驅動的應用,惡意的SQL 語句被插入到執行的實體欄位中(例如,為了轉儲資料庫內容給攻擊者)。[摘自]  SQL注入 - 維基百科SQL注入,大家都不陌生,是一種常見的攻擊方式。攻擊者在介面的表單資訊或UR

sql注入攻擊和PreparedStatement有效防止sql注入攻擊

【1】sql注入攻擊: /** * SQL 注入. */ @Test public void testSQLInjection() { String username = "a' OR PASSWORD = "; String password = " OR '1'='1

MyBatis防止SQL注入

預設情況下,使用#{}語法,MyBatis會產生PreparedStatement語句中,並且安全的設定PreparedStatement引數,這個過程中MyBatis會進行必要的安全檢查和轉義。 #相當於對資料 加上 雙引號,$相當於直接顯示資料 示例1: 執行SQL:

mybatis 防止sql注入

SQL注入是一種程式碼注入技術,用於攻擊資料驅動的應用,惡意的SQL語句被插入到執行的實體欄位中(例如,為了轉儲資料庫內容給攻擊者)。[摘自] SQL injection - Wikipedia SQL注入,大家都不陌生,是一種常見的攻擊方式。攻擊者在介面的表單資訊或URL上輸入一些奇怪的SQL片

網站漏洞修復方案防止SQL注入攻擊漏洞

SQL注入漏洞在網站漏洞裡面屬於高危漏洞,排列在前三,受影響範圍較廣,像asp、.net、PHP、java、等程式語言編寫的程式碼,都存在著sql注入漏洞,那麼如何檢測網站存在sql注入漏洞?SQL注入漏洞測試方法在程式程式碼裡不管是get提交,post提交,cookies的

mybatis 防止sql注入的注意事項

1.sql注入的原理     在頁面引數輸入時,輸入有語法含義的字串,這樣可以改變你原有的SQL。例如:<?php    $username = "aaa";    $pwd = "pwd";    $sql = "SELECT * FROM table WHERE u

如何防止SQL注入攻擊

    SQL注入攻擊的危害性很大,在講解其防止方法之前,資料庫管理員有必要想了解一下其攻擊的原理,這有利於管理員採取有針對性的防治措施。     一、SQL注入攻擊的簡單示例     statement:="select * from users where value=

防止SQL注入攻擊的一些方法小結

開頭語:SQL注入攻擊的危害性很大。在講解其防止辦法之前,資料庫管理員有必要先了解一下其攻擊的原理。這有利於管理員採取有針對性的防治措施 -----解決方案-------------------------------------------------------- 過濾

文字框輸入防止sql注入攻擊

對文字框輸入文字進行校驗禁止輸入%和<等: <input class="easyui-textbox" data-options="validType:['length[0,30]','

Hibernate防止SQL注入攻擊的方法

如果在查詢欄位中輸入單引號"'",則會報錯,這是因為輸入的單引號和其他的sql組合在一起程式設計了一個新的sql,實際上這就是SQL注入漏洞,後來我在前臺和後臺都對輸入的字元進行了判斷。 永遠也不要寫這樣的程式碼:      String queryString = "f

MyBatis 防止 % _ sql 注入攻擊 解決方法

首先說思路,在mybatis中防止sql注入,目前只能在Controller層進行轉義,後臺sql進行查詢,然後在controller層轉義回來,返回到前臺。 理論上應該可以在dao.xml中進行判斷   但是目前還沒寫出來。Orz 上程式碼 @RequiresPer

MyBatis 排序防止sql注入

MyBatis的排序 引言     最近在專案開發中遇到一個問題,專案中使用的的MyBatis的排序功能被安全部門掃描出了SQL注入安全隱患,檢視安全報告說是有一個介面中存在SQL注入的安全漏洞,檢查後發現是因為該介面中的排序功能使用了的MyBatis中的$ {}。

Mybatis 是如何防止SQL注入的?

面試中經常會問到: Mybatis 是如何防止注入的?  首先:SQL是怎樣的注入攻擊的? String sql = String.Format( "SELECT * FROM tablename WHERE username='{0}'", username); &n

mybatis模糊查詢防止sql注入

SQL注入,大家都不陌生,是一種常見的攻擊方式。攻擊者在介面的表單資訊或URL上輸入一些奇怪的SQL片段(例如“or ‘1’=’1’”這樣的語句),有可能入侵引數檢驗不足的應用程式。所以,在我們的應用中需要做一些工作,來防備這樣的攻擊方式。在一些安全性要求很高的應用中(比如銀行軟體),經常使用將SQ

Mybatis框架中#{}與${}的差別(如何防止sql注入

預設情況下,使用#{}語法,MyBatis會產生PreparedStatement語句中,並且安全的設定PreparedStatement引數,這個過程中MyBatis會進行必要的安全檢查和轉義。 #相當於對資料 加上 雙引號,$相當於直接顯示資料 示例1: 執行SQL:select * f

如何防止網站被SQL注入攻擊

首先我們應該對網站程式程式碼進行詳細的安全檢測,與網站漏洞檢測,在網站的前端進行多種方式的提交與注入檢測,對程式碼裡中與使用者互動並與資料庫直接傳輸打交道的程式碼進行嚴查,看看是否可以摻雜非法的sql注入程式碼進去。對GET、POST、COOKIES的提交進行過濾,過濾特殊符號,對一些&*%¥#@/等

asp.net 360通用防護程式碼,防止sql注入與xss跨站漏洞攻擊

這是360提供的一個aspx公用程式碼,可以防止sql注入漏洞,xss跨站攻擊漏洞,如果您的網站被360掃描,出現sql注入或跨站攻擊等相關漏洞,沒有較好的解決方案,倒是可以採用該方法進下防範。 -----------------使用方法------------

springboot-防止sql注入,xss攻擊,cros惡意訪問

springboot-防止sql注入,xss攻擊,cros惡意訪問 文章目錄 springboot-防止sql注入,xss攻擊,cros惡意訪問 1.sql注入 2.xss攻擊 3.csrf/cros 完

Mybatis like 查詢 防止SQL注入方法相關原理和解決方法整理

SQL注入:引自百度百科: 所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程式,將(惡意)的