1. 程式人生 > >SpringMVC利用攔截器防止SQL注入

SpringMVC利用攔截器防止SQL注入

引言 隨著網際網路的發展,人們在享受網際網路帶來的便捷的服務的時候,也面臨著個人的隱私洩漏的問題。小到一個擁有使用者系統的小型論壇,大到各個大型的銀行機構,網際網路安全問題都顯得格外重要。而這些網站的背後,則是支撐整個服務的核心資料庫。可以說資料庫就是這些服務的命脈,沒有資料庫,也就無從談起這些服務了。 對於資料庫系統的安全特性,主要包括資料獨立性、資料安全性、資料完整性、併發控制、故障恢復等方面。而這些裡面顯得比較重要的一個方面是資料的安全性。由於開發人員的設計不周到,以及資料庫的某些缺陷,很容易讓黑客發現系統的漏洞,從而造成巨大的損失。 接下來本文將會介紹非常常見的一種攻擊資料庫的方法:SQL注入,以及使用在專案使用Java開發的情況下如何使用SpringMVC的攔截器實現防止SQL注入的功能。 SQL注入 SQL注入簡介 通俗的講,SQL注入就是惡意黑客或者競爭對手利用現有的B/S或者C/S架構的系統,將惡意的SQL語句通過表單等傳遞給後臺SQL資料庫引擎執行。比如,一個黑客可以利用網站的漏洞,使用SQL注入的方式取得一個公司網站後臺的所有資料。試想一下,如果開發人員不對使用者傳遞過來的輸入進行過濾處理,那麼遇到惡意使用者的時候,並且系統被發現有漏洞的時候,後果將是令人難以想象的。最糟糕的是攻擊者拿到了資料庫伺服器最高階的許可權,可以對整個資料庫伺服器的資料做任何操作。 通常情況下,SQL注入攻擊一般分為以下幾個步驟: 判斷WEB環境是否可以注入SQL。對於一個傳統的WEB網頁來說,如果是一個簡單的靜態頁面,比如地址為http://www.news.com/100.html的網頁,這是一個簡單的靜態頁面,一般不涉及對資料庫的查詢。而如果這個網頁的網址變成了:http://www.news.com/news.asp?id=100 那麼,這就是一個根據主鍵id來查詢資料的動態網頁了。攻擊者往往能夠在 id=100的後面加上一些自己的SQL,用來“欺騙”過應用程式。 尋找SQL注入點。當攻擊者確定某個頁面可以使用SQL注入之後,他一般會尋找可以SQL注入的點。而這些點往往就是網頁或者應用程式中的用於向伺服器傳送使用者資料的表單了。一般的流程是,客戶端通過這些表單傳送一些使用者資訊的欄位,比如使用者名稱和密碼,接著伺服器就會根據這些欄位去查詢資料庫。而如果使用者輸入了一些非法的字元,比如’這個符號,那麼在SQL解析的時候,解析的結果可能並不是應用開發人員想象中那樣。 尋找系統的後臺。這一點就建立在破壞者對整個系統的瞭解程度上面了,如果攻擊者對整個系統瞭如指掌,那麼實現攻擊也就是一件很簡單的事情了。 入侵和破壞。當攻擊者攻破系統之後,整個系統從某種意義上來講已經失去意義了。 SQL注入案例 一個簡單的PHP登入驗證SQL注入 比如一個公司有一個用來管理客戶的客戶管理系統,在進入後臺進行管理的時候需要輸入使用者名稱和密碼。 假設在客戶端傳給伺服器的欄位分別為使用者名稱username和密碼password,那麼如果用來處理登入的伺服器端程式碼對使用者的輸入做以下處理: 上面的PHP程式碼就是首先獲取客戶端POST過來的填寫在表單裡面的使用者名稱和密碼,接著要MySQL去執行下面這條SQL語句: SELECT `id` FROM `users` WHERE `username` = username AND `password` = password; 可以看到上面的程式碼沒有對使用者的輸入做任何的過濾,這是非常容易遭到黑客攻擊的。 比如,一個使用者在輸入使用者名稱的輸入框裡面輸入了 user’;SHOW TABLES;-- 那麼就會解析為下面的SQL: SELECT `id` FROM `users` WHERE `username` = ‘user’;SHOW TABLES;-- AND `password` = password; 可以看到被解析的SQL被拆分為了2條有用的SQL: (1)SELECT `id` FROM `users` WHERE `username` = ‘user’; (2)SHOW TABLES; 而後面驗證密碼的部分就被註釋掉了。這樣攻擊者就輕鬆的獲得了這個資料庫裡面的所有表的名字。同樣的道理,如果攻擊者在輸入框裡面輸入: ’;DROP TABLE [table_name];-- 那麼,這一張表就被刪除了,可見後果是非常嚴重的。 而使用者如果在使用者名稱輸入框裡面輸入了:user’or 1=1-- 那麼會被解析成: SELECT `id` FROM `users` WHERE `username` = ‘user’ or 1=1-- AND `password` = password; 這裡可以看到1=1永遠為真,這樣不用輸入使用者名稱就直接可以登入系統了。 一個ASP新聞動態頁面的id查詢 比如有一個新聞網站的動態頁面是這種格式: http://www.news.com/news.asp?id=100 那麼當用戶在瀏覽器的地址框裡面輸入 http://www.news.com/news.asp?id=100;and user>0 那麼如果這個網站的資料庫用的是SQL Server的話,那麼SQL Server在解析的時候,由於user是SQL Server的一個內建變數,它的值就是當前連線資料庫的使用者,那麼SQL在執行到這裡的時候會拿一個型別為nvarchar的和一個int型別的比較。比較過程中就必然涉及型別的轉化,然而不幸的是,轉化過程並不是一帆風順,出錯的時候SQL Server將會給出類似將nvarchar值”aaa”轉為為int的列時發生語法錯誤。這個時候攻擊者就輕鬆的獲得了資料庫的使用者名稱。 SpringMVC攔截器防止SQL注入 為了有效的減少以及防止SQL注入的攻擊,開發人員在開發的時候一定不要期待使用者的輸入都是合理的,當用戶輸入完畢之後,應該嚴謹的對使用者提交的資料進行格式上的檢查以及過濾,儘可能的減少被注入SQL 的風險。 一般來說,不同的伺服器端語言都有不同的解決方案。比如拿中小型企業採用得最多的PHP語言來說,PHP的官方就為開發者提供了這樣的一些函式,比如mysql_real_escape_string()等。 接下來會詳細介紹如何通過SpringMVC的攔截器實現防止SQL注入的功能。 這裡以我的大資料人才簡歷庫的攔截器為例。 自定義攔截器類實現HandlerInterceptor介面 package com.data.job.util.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Enumeration; /** * 防止SQL注入的攔截器 * * @author

[email protected] * @time 2/13/16 8:22 PM. */ public class SqlInjectInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { Enumeration names = request.getParameterNames(); while (names.hasMoreElements()) { String name = names.nextElement(); String[] values = request.getParameterValues(name); for (String value : values) { value = clearXss(value); } } return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception { } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception { } /** * 處理字元轉義 * * @param value * @return */ private String clearXss(String value) { if (value == null || "".equals(value)) { return value; } value = value.replaceAll("<", "<").replaceAll(">", ">"); value = value.replaceAll("\\(", "(").replace("\\)", ")"); value = value.replaceAll("'", "'"); value = value.replaceAll("eval\\((.*)\\)", ""); value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\""); value = value.replace("script", ""); return value; } } 配置攔截器 SQL注入總結 安全問題從古至今都有著非常高的關注度,如今網際網路高速發達,各種網路應用層出不窮。不管是現在炙手可熱的雲端計算和大資料,還是傳統的B/S或者C/S架構的網路應用,資料的安全性是至關重要的。從應用層面來講,網路應用的開發者可以通過完善軟體的架構,儘量減少因為BUG而導致的資料洩漏的問題。開發者可以不斷的審視與完善自己的系統,站在攻擊者的角度上去開發某些關鍵的安全性要求比較高的環節,如銀行支付部分等,這樣能夠在一定程度上面減少SQL注入等應用層面攻擊資料庫的風險。
作者: noprom 
連結:http://www.imooc.com/article/6137
來源:慕課網

相關推薦

SpringMVC利用攔截防止SQL注入

引言 隨著網際網路的發展,人們在享受網際網路帶來的便捷的服務的時候,也面臨著個人的隱私洩漏的問題。小到一個擁有使用者系統的小型論壇,大到各個大型的銀行機構,網際網路安全問題都顯得格外重要。而這些網站的背後,則是支撐整個服務的核心資料庫。可以說資料庫就是這些服務的命脈,沒有資料庫,也就無從談起這些服務了。 對於

SpringMVC利用攔截攔截自定義註解

前幾篇文章裡寫了關於token的個人思考,那麼具體在程式碼中要怎麼實現攔截token,今天寫了一段程式碼,記錄一下 框架:SpringMVC Spring 執行環境:tomcat8 說一下思路: 1.自定一個註解,然後註解在我的Controller方法上 2.實現Sprin

Spring MVC通過攔截處理sql注入、跨站XSS攻擊風險(jeecg)

最近一個以前做的政府網站被資訊保安部門掃描了一下,存在一些風險,發了一份安全報告過來。所以開始對這個網站進行安全性升級。其中主要的幾個問題是sql注入風險、跨站xss攻擊和連結注入問題。 首先,什麼是sql注入,度娘一下一大堆,官方語言我就不多說了,說說我自己

springMvc 攔截 防止重複提交

1.DispatcherServlet     SpringMVC具有統一的入口DispatcherServlet,所有的請求都通過DispatcherServlet。     DispatcherServlet是前置控

玩轉JDBC打造資料庫操作萬能工具類JDBCUtil,加入了高效的資料庫連線池,利用了引數繫結有效防止SQL注入

SELECT * FROM emp_test 成功查詢到了14行資料 第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=張無忌}

springmvc 攔截 防止重複提交表單

第一種方法:判斷session中儲存的token 比較麻煩,每次在提交表單時都必須傳入上次的token。而且當一個頁面使用ajax時,多個表單提交就會有問題。 註解Token程式碼: package com.thinkge

SpringMVC攔截

ica 現在 handle 3-9 keyword contain sha 但是 add SpringMVC的攔截器:   1.首先我們需要引入jar包,這就不用說了,   定義自己的攔截器實現HandlerInterceptor,進行方法的重寫。      2.配置web

SpringMVC攔截(Interceptor)和過濾器(Filter)的區別與聯系

get err 實例 分享 切面 簡介 () lee XML 一 簡介 (1)過濾器: 依賴於servlet容器。在實現上基於函數回調,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取

springMVC攔截

urn html request ora 異常處理 bool class 用戶 name 有兩種方法配置spring的攔截器 1. 實現接口: HandleInterceptor public class MyInterceptor1 implements Handl

【Spring】SpringMVC攔截

https javax request orm bin 支持 exceptio 賬號 intern Spring的HandlerMapping處理器支持攔截器應用。當需要為某些請求提供特殊功能時,例如實現對用戶進行身份認證、登錄檢查等功能。 攔截器必須實現HandlerI

SpringMVC攔截的執行

throws err class mode println ret stub post 如果 如果有多個攔截器,執行的順序是在SpringMVC的配置文件裏的前後順序。 <mvc:interceptors>   <bean class="com.neue

Struts2 06--系統攔截防止數據重復提交

tab align 提交 中文 mode alt submit import wid 一.攔截器簡要概述 攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或字段被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現

十一、利用攔截統計action執行時間

err cep time exceptio execute method current result ack 1.新建login.jsp <body> <a href="HelloAction.action">點擊統計action執行時間

SpringMVC攔截實現登錄驗證

一個 throw idt 判斷 sed XML auto 也有 登錄驗證 今天回頭看之前發的javaweb學習路線圖,發現把路線圖中的也學的有一半多了,不過還是路漫漫。在前面的博客中有學習過spring的aop,它利用動態代理實現,在springmvc中也是一樣,今天使用H

nodejs中查詢mysql防止SQL注入

Performing queries The most basic way to perform a query is to call the .query() method on an object (like a Connection, Pool, or PoolNamespace inst

Mybatis防止sql注入原理

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

iBatis解決自動防止sql注入

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MySQL— pymysql模組(防止sql注入),視覺化軟體Navicat

一.Pymysql import pymysql #python2.X 中是 mysqldb 和 pythonmysql 用法是一模一樣的 #pymysql可以偽裝成上面這兩個模組 user = input('username: ') pwd = input('passwo

SpringMVC 配置攔截 HandlerInterceptor

目錄 一、實現思路 二、具體實現 三、HandlerInterceptorAdapter  一、實現思路 在 SpringMVC 或者 SSM 環境的專案下,新建一個攔截類,繼承 HandlerInterceptor 介面,然後實現接口裡面的三個方法,接著在 pre

sql注入防止sql注入

資料庫中的資料 sql程式碼 package com.zjw.jdbc2; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.