1. 程式人生 > >java防sql注入的sql語句拼接工具sqlHandle

java防sql注入的sql語句拼接工具sqlHandle

     我在做網站的時候有一個需要在不同的插入時間改變查詢的邏輯結構,這個時候用PreparedStatement就不太適合了靈活性太差。所以我就寫了一個sql拼接工具。它的原理是將sql語句段與值繫結在一起,然後在最後拼接的時候把值按順序傳人給PreparedStatement。這樣我們任意拼接我們的sql語句還可以防止sql注入的困擾。

   平時我都是用Hibernate進行操作,但有時我多表查詢是Hibernate的靈活性就也受到了限制,所以sqlHandle還是適用不少情況的。

package com.sql.db;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
/**
 * sql拼接程式碼
 * 一個完整的sql語句可以有多個sqlHandle拼接而成
 * sqlHandle分sql語句 與 sql值,在sql語句中值由?
 * 替代在最後執行是值將依此賦值給hibernate
 * @author 樑前武 
 * www.apkplug.com
 */
public class sqlHandle {
	public String strSql="%s";
	public Object fsql="";
	public String type="";
	public Object[] v=null;
	public List<sqlHandle> list=null;
	public sqlHandle(String strSql,Object fsql,String type,Object[] v){
		this.strSql=strSql;
		this.fsql=fsql;
		this.type=type;
		this.v=v;
	}
	public sqlHandle(Object fsql,String type,Object[] v){
		this.fsql=fsql;
		this.type=type;
		this.v=v;
	}
	public sqlHandle(){
	}
	public  SQLQuery handle(Session session){
		//拼接本sqlHandle sql字串
		String sql=addWhereSql(strSql,fsql,type);
		for (int i=0;i<list.size();i++) {
			//依此拼接子sqlHandle
			sqlHandle sqlHandle = (sqlHandle) list.get(i);
			sql+=addWhereSql(sqlHandle.strSql,sqlHandle.fsql,sqlHandle.type);
		}
		System.out.println(sql);
		SQLQuery query=session.createSQLQuery(sql);
		//賦值
		setV(query,0);
		return query;
	}
	/**
	 * 將sql中?代替的值依此賦值給hibernate
	 * @param q
	 * @param i  傳遞值索引位置
	 * @return
	 */
	public int  setV(SQLQuery q,int i){
		if(v!=null)
		for(int j=0;j<v.length;j++){
			if(v[j]!=null){
				//System.out.println("新增引數");
				setV(q,i,v[j]);
				i++;
			}
		}
		if(fsql!=null&&fsql instanceof sqlHandle)
			i=((sqlHandle)fsql).setV(q, i);
		if(list!=null)
		for (int j=0;j<list.size();j++) {
			sqlHandle sqlHandle = (sqlHandle) list.get(j);
			i=sqlHandle.setV(q, i);
		}
		return i;
	}
	/**
	 * 將sql中?代替的值依此賦值給hibernate
	 * @param q
	 * @param i   值索引位置
	 * @param v   值
	 */
	public  void setV(SQLQuery q,int i,Object v){
		if(v instanceof String){
			q.setString(i, (String)v);
		}else if(v instanceof Integer){
			q.setInteger(i, (Integer)v);
		}else if(v instanceof Float){
			q.setFloat(i, (Float)v);
		}else if(v instanceof Double){
			q.setDouble(i, (Double)v);
		}else if(v instanceof Date){
			q.setDate(i, (Date)v);
		}else if(v instanceof java.sql.Date){
			q.setDate(i, (Date)v);
		}else if(v instanceof Boolean){
			q.setBoolean(i, (Boolean)v);
		}else if(v instanceof byte[]){
			q.setBinary(i, (byte[])v);
		}else if(v instanceof Byte){
			q.setByte(i, (Byte)v);
		}else if(v instanceof Calendar){
			q.setCalendar(i, (Calendar)v);
		}
	}
	
	/**
	 * 拼接sql字串
	 * @param strSql 連線字串 如 in(%s)
	 * @param sqlOne 實體字串 如 select * user  可以是字串也可以是sqlHandle
	 * @param type   連線型別   如 and,or
	 * @return 返回 如 and in(select * user)
	 */
	private static String addWhereSql(String strSql,Object sqlOne,String type){
		return  " "+type+" "+String.format(strSql, sqlOne)+" ";	
	}
	/**
	 * 新增多個sql引數值
	 * @param fsql  sql語句段   如 name=?
	 * @param type  sql連線型別  如 and
	 * @param v                 Object[]{"liming"} 如無值便為null
	 * @return
	 */
	public  sqlHandle AddMore(Object fsql,String type,Object[] v){
		if (list==null)
			list=new ArrayList<sqlHandle>();
		sqlHandle sql=new sqlHandle(fsql,type,v);
		list.add(sql);
		return this;
	}
	/**
	 * 新增0-1個sql引數
	 * @param fsql    sql語句段   如 name=?
	 * @param type    sql連線型別  如 and
	 * @param v       "liming" 如無值便為null
	 * @return
	 */
	public  sqlHandle Add(Object fsql,String type,Object v){
		AddMore( fsql, type,new Object[]{v});
		return this;
	}
	/**
	 * 新增多個sql引數值
	 * 多一共 strSql字元 有時我們需要 in(sql...) 這種情況。
	 * 我們可以通過設定 strSql=in(%s) fsql=sql... 這種形式來實現
	 * strSql預設為"%s"
	 * @param strSql  替代副
	 * @param fsql
	 * @param type
	 * @param v
	 * @return
	 */
	public  sqlHandle AddMoreAndRep(String strSql,Object fsql,String type,Object[] v){
		if (list==null)
			list=new ArrayList<sqlHandle>();
		sqlHandle sql=new sqlHandle(strSql,fsql,type,v);
		list.add(sql);
		return this;
	}
	/**
	 * 新增多個sql引數值
	 * 多一共 strSql字元 有時我們需要 in(sql...) 這種情況。
	 * 我們可以通過設定 strSql=in(%s) fsql=sql... 這種形式來實現
	 * strSql預設為"%s"
	 * @param strSql
	 * @param fsql
	 * @param type
	 * @param v
	 * @return
	 */
	public  sqlHandle AddAndRep(String strSql,Object fsql,String type,Object v){
		AddMoreAndRep(strSql, fsql, type,new Object[]{v});
		return this;
	}
	/**
	 * 生成自身sql語句
	 */
	public String toString(){
		String sql="";
		for (int i=0;i<list.size();i++) {
			sqlHandle sqlHandle = (sqlHandle) list.get(i);
			sql+=addWhereSql(sqlHandle.strSql,sqlHandle.fsql,sqlHandle.type);
		}
		return sql;
	}
}


01 package com.sql.db;
02 /**
03 * sql拼接測試程式碼
04 * @author 樑前武
05 * www.apkplug.com
06 */
07 public class test {
08

相關推薦

javasql注入sql語句拼接工具sqlHandle

     我在做網站的時候有一個需要在不同的插入時間改變查詢的邏輯結構,這個時候用PreparedStatement就不太適合了靈活性太差。所以我就寫了一個sql拼接工具。它的原理是將sql語句段與值繫結在一起,然後在最後拼接的時候把值按順序傳人給PreparedSt

常見的SQL注入檢測語句

0x00 前言      現在很多WAF都能攔截sqlmap、havij 等注入工具的發包注入,所以這時我們需要在瀏覽器上使用hackerbar 進行手工注入,或者說是手工繞過注入攻擊 0x01 發現

SQL注入--sql server

談到SQL注入,不得不提它的本質,把使用者的輸入資料當做程式碼來執行。兩個關鍵條件,第一個是使用者能夠控制的輸入;第二個是程式要執行的程式碼,拼接了使用者輸入的資料 按照注入的技術型別可分解為: 顯錯注入和盲注入,其中盲注入可分為,聯合查詢注入,堆查詢注入,DNS查詢注入,

C# sql語句拼接時 like情況的sql注入的用法

如這樣一個sql語句:select * from game where gamename like '%張三%' 用c#表示的話: string keywords = "張三"; StringBuilder strSql=new StringBuil

C# 使用引數化SQL語句SQL注入攻擊)

“SQL注入攻擊”問題。我們在程式中存在著大量拼接產生SQL語句的程式碼,這就會導致一個比較大的安全隱患,容易遭受SQL注入攻擊。我們在程式碼中用的SQL語句是: string sqlStr = "select * from [Users] where User

JAVA WEB中處理SQL注入|XSS跨站指令碼攻擊(咋個辦呢 zgbn)

JAVA WEB中處理防SQL注入|防XSS跨站指令碼 在java web專案中,必然會涉及到從客戶端向服務端提交資料,那麼由於服務端對資料的處理等動作,會因為字串拼接和使用的特殊性,存在一些漏洞被人利用。 這篇文章,主要介紹一下在java web專案中,程

SQL注入例項:避免後端SQL語句拼接操作

1 例項-後端邏輯 以下是基於pymysql的一個例子: import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='mysql', db

javasql注入方法小結

本文對java操作資料庫的一項重點內容——防sql注入進行說明。對現有方法進行了簡單優劣討論與總結,供大家參考討論。 重點:不要將使用者輸入內容,在未經檢查的情況下,直接拼接為sql語句進行資料庫訪問操作。 防sql注入方法如下: 過濾輸入 對輸入內容

php對前臺提交的表單資料做安全處理(SQL注入和XSS攻擊等)

/** * 防sql注入字串轉義 * @param $content 要轉義內容 * @return array|string */ public static function escapeString($content) { $pa

php用於SQL注入的幾個函式

用於防SQL注入的幾個函式 不要相信使用者的在登陸中輸入的內容,需要對使用者的輸入進行處理 SQL注入: ' or 1=1 #   防止SQL注入的幾個函式:   addslashes($string):用反斜線引用字串中的特殊字元' " \ $u

Java程式設計師從笨鳥到菜鳥之(一百)sql注入攻擊詳解(一)sql注入原理詳解

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

MySQLSQL注入

1,mysql_real_escape_string()函式已經不安全,可以利用編碼的漏洞來實現輸入任意密碼就能登入伺服器的注入攻擊 2,使用擁有Prepared Statement機制的PDO和MYSQLi來代替mysql_query(注:mysql_query自 PHP 5.5.0 起已

ubuntu上安裝Apache2+ModSecurity及實現SQL注入演示

ubuntu上安裝Apache2+ModSecurity及實現防SQL注入演示 一、Apache2 的安裝 1.1、安裝環境: OS:Ubuntu 16.04.1 LTS Apache: Apache/2.4.18 (Ubuntu) 安裝命令: 更新安裝源:

SQL注入 web開發中防止SQL注入

web開發中防止SQL注入   一、SQL注入簡介 SQL注入是比較常見的網路攻擊方式之一,它不是利用作業系統的BUG來實現攻擊,而是針對程式設計師編寫時的疏忽,通過SQL語句,實現無賬號登入,甚至篡改資料庫。 二、SQL注入攻擊的總體思路 1.尋找到SQL

java hql使用count sql語句 適用於ssh框架

java hql使用count sql語句 適用於ssh框架 java hql使用count sql語句  適用於ssh框架 @PersistenceContext protected EntityManager em; public int getCountBySql(S

表名動態生成拼接到sql語句sql注入問題

背景:根據業務需要,每個月生成一張根據年份和月份的表,然後當前的資料存到當前月份的表。 關鍵程式碼如下: String tabName = "tabsaveevent" + strYear + strMonth; String sqlSave = "insert into "

回頭探索JDBC及PreparedStatementSQL注入原理

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

SqlMap自動化SQL注入測試工具簡紹

Sqlmap是一個開源的滲透測試工具,可以自動檢測和利用SQL注入漏洞並接管資料庫伺服器。它配備了強大的檢測引擎,為終極滲透測試儀提供了許多小眾功能,以及從資料庫指紋識別,從資料庫獲取資料到訪問底層檔案系統以及在作業系統上執行各種命令。 演示: # 使用SqlMap在特定目標URL上進行SQ

Python 資料庫,操作mysql,sql注入,引數化

  demo.py(防sql注入): from pymysql import * def main(): find_name = input("請輸入物品名稱:") # 建立Connection連線 conn = connect(host='local

mybatis-plus sql語句拼接

mybatis-plus可呼叫的方法: 查詢方式 說明 setSqlSelect 設定 SELECT 查詢欄位 where WHERE 語句,拼接 + WHERE 條件 and AND 語句,拼接 + AND 欄位=值 andNew AND 語句,