1. 程式人生 > >JDBC:使用PreparedStatement防止SQL注入

JDBC:使用PreparedStatement防止SQL注入

   1.關於SQL注入

什麼是SQL注入:

由於jdbc程式在執行的過程中sql語句在拼裝時使用了由頁面傳入引數,如果使用者惡意傳入一些sql中的特殊關鍵字,會導致sql語句意義發生變化,這種攻擊方式就叫做sql注入,參考使用者註冊登入案例。

  首先看一下以下程式碼:

String sql = "select* from users where username='" + userName
				+ "' and password='" + passWord+"'";
		Connection conn = null;
		Statement state = null;
		ResultSet result;
		conn = JdbcUtil.getConnection();
		System.out.println(sql);
		try {
			state = conn.createStatement();
			result = state.executeQuery(sql);

這是一段根據傳入使用者名稱,密碼查詢使用者表的程式碼。

在做使用者登入的驗證的時候,我們可能會根據使用者所填寫的使用者名稱和密碼在後臺拼成一條SQL語句執行,去查使用者表:

select* from users where username='張三' and password='小張',如果能查出結果則表示驗證成功,允許登入,否則賬號或密碼錯誤不允許登入。那麼在組成這條語句的過程中會存在一個叫做SQL注入的問題,就是使用者在輸入使用者名稱或密碼的時候填寫某些內容使得後臺所拼成的SQL語句語義有所變化。

       舉個例子,在沒有防止SQL的情況下:假如我們知道一個使用者叫做張三,但是不知道這個使用者的密碼是什麼,我們依然可以在登入的時候在使用者輸入框寫上:張三'# 然後密碼框任意填:njksad。一點選登入,會發現居然能夠登入上去。那是為什麼呢?

    這是因為#在SQL中的意思是註釋,那麼我們根據上面的情況來分析一下最終所拼成的SQL語句是怎樣的,

select* from users where username='張三'#' and password='njksad'

為了讓大家能夠看清楚上面那條SQL語句,筆者特地加大顯示,可以看到username='張三' 之後是一個#

那就意味著之後的內容都是註釋,也就是可以忽略掉那麼這條語句真正發揮作用的部分就是select* from users where username='張三'

直接變成了一條查詢張三 的語句,完全不用經過密碼驗證。

2.防止SQL注入攻擊

那麼怎麼才能做到防止SQL注入攻擊呢?

在上面那段程式碼中,Statement的物件是用來執行SQL語句的,Statement有一個子類叫做PreparedStatement,可以做到防止SQL注入攻擊,接下來我們來看看PreparedStatement有什麼特點以及怎麼使用:

PreparedStatement是Statement的孩子,不同的是,PreparedStatement使用預編譯機制,在建立PreparedStatement物件時就需要將sql語句傳入,傳入的過程中引數要用?替代,這個過程回導致傳入的sql被進行預編譯,然後再呼叫PreparedStatement的setXXX將引數設定上去,由於sql語句已經經過了預編譯,再傳入特殊值也不會起作用了。
而且PreparedStatement使用了預編譯機制,sql語句在執行的過程中效率比Statement要高。

String sql = "select* from users where username=? and password=?";
		Connection conn = null;
		PreparedStatement state = null;
		ResultSet result;
		conn = JdbcUtil.getConnection();
		System.out.println(sql);
		try {
			state = conn.prepareStatement(sql);
			state.setString(1, userName);
			state.setString(2, passWord);
			result = state.executeQuery();


相關推薦

JDBC使用PreparedStatement防止SQL注入

   1.關於SQL注入 什麼是SQL注入: 由於jdbc程式在執行的過程中sql語句在拼裝時使用了由頁面傳入引數,如果使用者惡意傳入一些sql中的特殊關鍵字,會導致sql語句意義發生變化,這種攻擊方式就叫做sql注入,參考使用者註冊登入案例。   首先看一下以下程式碼:

回頭探索JDBCPreparedStatementSQL注入原理

概述 JDBC在我們學習J2EE的時候已經接觸到了,但是僅是照搬步驟書寫,其中的PreparedStatement防sql注入原理也是一知半解,然後就想回頭查資料及敲測試程式碼探索一下。再有就是我們在專案中有一些配置項是有時候要變動的,比如資料庫的資料來源,為了在修改配置時不改動編譯的程式碼,我們把要變動的

以mysql為例介紹PreparedStatement防止sql注入原理

最近,在寫程式時開始注意到sql注入的問題,由於以前寫程式碼時不是很注意,有一些sql會存在被注入的風險,那麼防止sql注入的原理是什麼呢?我們首先通過PrepareStatement這個類來學習一下吧! 作為一個IT業內人士只要接觸過資料庫的人都應該知道sq

PreparedStatement防止sql注入原理

PreparedStatement類是java的一個類,準確說是jdbc規範中的一個介面,各個資料庫產商的實現不同(即實現類不同),今天我們就以mysql資料庫來說,我已經下載了mysql資料庫的驅動jar包和驅動程式的原始碼. sql注入的時候,比如,有些使用者就會在介面

JDBC學習之路(三)防止SQL注入PreparedStatement探索

   現在登入註冊或者其他很多地方遇到使用者輸入的內容可以直接拿到資料庫內部去進行執行SQL語句,這個是一項很危險的運動,因為你不知道使用者會輸入什麼,如果使用者對SQL語句很熟悉,他就可以在輸入的時候加上''兩個冒號作為特殊字元,這樣的話會讓計算機認為他輸入的是SQL語句

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

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

PreparedStatement是如何防止SQL注入的?

為什麼在Java中PreparedStatement能夠有效防止SQL注入?這可能是每個Java程式設計師思考過的問題。 首先我們來看下直觀的現象(注:需要提前開啟mysql的SQL文列印) 1. 不使用PreparedStatement的set方法設定引數(效果跟Statement相似,相當於執行靜

PHP中防止SQL注入的方法

【一、在伺服器端配置】        安全,PHP程式碼編寫是一方面,PHP的配置更是非常關鍵。 我們php手手工安裝的,php的預設配置檔案在 /usr/local/apache2/conf/php.ini,我們最主要

玩轉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=張無忌}

jdbc防止sql注入方法總結

參考:http://hi.baidu.com/wangyue06/item/c00c824b35cf740ae835049c 1.傳統JDBC,採用PreparedStatement 。預編譯語句集,內建了處理SQL注入的能力 String sql= "selec

JDBC 增、查、刪、改 和 防止sql注入登入

package cn.mxl.jdbc04; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement

PHP安全程式設計防止SQL注入

SQL 注入是PHP應用中最常見的漏洞之一。事實上令人驚奇的是,開發者要同時犯兩個錯誤才會引發一個SQL注入漏洞,一個是沒有對輸入的資料進行過濾(過濾輸入),還有一個是沒有對傳送到資料庫的資料進行轉義(轉義輸出)。這兩個重要的步驟缺一不可,需要同時加以特別關注以減少程式錯誤

JDBC要點總結、SQL注入示例(Statement和PreparedStatement

寫在前面:JDBC是sun公司(已被Oracle收購)制定一系列介面標準,由不同廠商(Oracle、MySQL等)實現介面方法並封裝成驅動檔案,供開發人員操作資料庫。也就是說,開發人員可採用統一的程式碼 一、三個重要物件:    a.Connection   代表著Jav

資料庫連線中使用PreparedStatement預編譯防止SQL注入

//使用預編譯不需要對SQL語句進行拼接,而是使用?佔位符,因此可以防止SQL注入,提升了安全性。 1.提高程式碼可讀性和可維護性 2.提高sql語句執行效能 3.提高安全性 PreparedS

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

sql注入防止sql注入

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

為什麼說Mysql預處理可以防止SQL注入

簡單點理解:prepareStatement會形成引數化的查詢,例如:1select * from A where tablename.id = ?傳入引數'1;select * from B'如果不經過prepareStatement,會形成下面語句:1select * from A where table