當前位置:首頁 » 凈水方式 » javasql過濾

javasql過濾

發布時間: 2021-03-11 08:06:30

1. 用JAVA程序篩選MYSQL資料庫中的數據

這個不用java篩選,直接資料庫查找就可以篩選出來了。把篩選出來的數據保存到另外一個資料庫。。。

我覺我說清楚了,希望能夠幫到你。

2. java 多條件查詢的sql怎麼防止sql注入漏洞

原理,過濾所有請求中含有非法的字元,例如:, & < select delete 等關鍵字,黑客可以利用這些字元進行注入攻擊,原理是後台實現使用拼接字元串!
你的採納是我前進的動力,
記得好評和採納,答題不易,互相幫助,
手機提問的朋友在客戶端右上角評價點(滿意)即可.
如果你認可我的回答,請及時點擊(採納為滿意回答)按鈕!!

3. java中怎麼用正則表達式去掉sql代碼段的注釋

直接用程序寫也行 利用字元串匹配的方法 找到第一個「/*」和「*/」記錄他們的index值,然後利用replace()函數進行替換

4. java怎麼像sql的where條件那樣處理list裡面的數據

public static void main(String[] args){
vo vo1 = new vo("張三",12,"武漢");
vo vo2 = new vo("李四",12,"武漢");
vo vo3 = new vo("王五",12,"北京");
List<vo> list = Arrays.asList(vo1,vo2,vo3);

//條件
vo vo4 = new vo("",null,"武漢");

if(vo4.getName() != null && !"".equals(vo4.getName())){
list = list.stream().filter(vo -> vo.getName().equals(vo4.getName()))
.collect(Collectors.toList());
}
if(vo4.getAge() != null){
list = list.stream().filter(vo -> vo.getAge().equals(vo4.getAge()))
.collect(Collectors.toList());
}
if(vo4.getCity() != null && !"".equals(vo4.getCity())){
list = list.stream().filter(vo -> vo.getCity().equals(vo4.getCity()))
.collect(Collectors.toList());
}

list.stream().forEach(vo -> {
System.out.println(vo);
});
}


5. 請問大神們 ibatis配置log4J,怎麼配置只記錄insert、update、delete的sql就是把select語句都過濾掉

可以精確到類,再往下,要自己實現log4j裡面的寫LOG方法了

6. 用java編寫防止SQL注入!求java高手指點!問題解決後,一定提高懸賞!

SQL注入無非就是把對單引號和雙"-"進行轉換。

最好不要拼裝SQL語句,以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。

7. java防止SQL注入的幾個途徑

  • java防SQL注入,最簡單的辦法是杜絕SQL拼接,SQL注入攻擊能得逞是因為在原有SQL語句中加入了新的邏輯,如果使用PreparedStatement來代替Statement來執行SQL語句,其後只是輸入參數,SQL注入攻擊手段將無效,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結構,大部分的SQL注入已經擋住了,在WEB層我們可以過濾用戶的輸入來防止SQL注入比如用Filter來過濾全局的表單參數

  • 01importjava.io.IOException;

  • 02importjava.util.Iterator;

  • 03importjavax.servlet.Filter;

  • 04importjavax.servlet.FilterChain;

  • 05importjavax.servlet.FilterConfig;

  • 06importjavax.servlet.ServletException;

  • 07importjavax.servlet.ServletRequest;

  • 08importjavax.servlet.ServletResponse;

  • 09importjavax.servlet.http.HttpServletRequest;

  • 10importjavax.servlet.http.HttpServletResponse;

  • 11/**

  • 12*通過Filter過濾器來防SQL注入攻擊

  • 13*

  • 14*/

  • {

  • 16privateStringinj_str="'|and|exec|insert|select|delete|update|count|*|%

  • |chr|mid|master|truncate|char|declare|;|or|-|+|,";

  • =null;

  • 18/**

  • 19*?

  • 20*/

  • 21protectedbooleanignore=true;

  • 22publicvoidinit(FilterConfigconfig)throwsServletException{

  • 23this.filterConfig=config;

  • 24this.inj_str=filterConfig.getInitParameter("keywords");

  • 25}

  • 26publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

  • 27FilterChainchain)throwsIOException,ServletException{

  • 28HttpServletRequestreq=(HttpServletRequest)request;

  • 29HttpServletResponseres=(HttpServletResponse)response;

  • 30Iteratorvalues=req.getParameterMap().values().iterator();//獲取所有的表單參數

  • 31while(values.hasNext()){

  • 32String[]value=(String[])values.next();

  • 33for(inti=0;i<value.length;i++){

  • 34if(sql_inj(value[i])){

  • 35//TODO這里發現sql注入代碼的業務邏輯代碼

  • 36return;

  • 37}

  • 38}

  • 39}

  • 40chain.doFilter(request,response);

  • 41}

  • 42publicbooleansql_inj(Stringstr)

  • 43{

  • 44String[]inj_stra=inj_str.split("\|");

  • 45for(inti=0;i<inj_stra.length;i++)

  • 46{

  • 47if(str.indexOf(""+inj_stra[i]+"")>=0)

  • 48{

  • 49returntrue;

  • 50}

  • 51}

  • 52returnfalse;

  • 53}

  • 54}

  • 也可以單獨在需要防範SQL注入的JavaBean的欄位上過濾:

  • 1/**

  • 2*防止sql注入

  • 3*

  • 4*@paramsql

  • 5*@return

  • 6*/

  • (Stringsql){

  • 8returnsql.replaceAll(".*([';]+|(--)+).*","");

  • 9}

8. java 用正則表達式過濾 一句sql,請高人指點

so easy

\$c\{(\w+)\}

9. java防止sql注入有哪些方法

前台我們可以通過過濾用戶輸入,後台可以通過PreparedStatement來代替Statement來執行SQL語句。

10. 用java PreparedStatement就不用擔心sql注入了嗎

先感慨下,好久沒寫博客了,一是工作太忙,二是身體不太給力,好在終於查清病因了,趁著今天閑下來,迫不及待與讀者交流,最後忠告一句:身體是活著的本錢!

言歸正傳,對java有了解的同學基本上都體驗過JDBC,基本都了解PreparedStatement,PreparedStatement相比Statement基本解決了SQL注入問題,而且效率也有一定提升。

關於PreparedStatement和Statement其他細節我們不討論,只關心注入問題。無論讀者是老鳥還是菜鳥,都需要問一下自己,PreparedStatement真的百分百防注入嗎?

接下來我們研究一下PreparedStatement如何防止注入,本文以MySQL資料庫為例。

為了避免篇幅過長,我這里只貼代碼片段,希望讀者能有一定的基礎。

1 String sql = "select * from goods where min_name = ?"; // 含有參數
2 PreparedStatement st = conn.prepareStatement(sql);
3 st.setString(1, "兒童"); // 參數賦值
4 System.out.println(st.toString()); //com.mysql.jdbc.JDBC4PreparedStatement@d704f0: select * from goods where min_name = '兒童'

這段代碼屬於JDBC常識了,就是簡單的根據參數查詢,看不出什麼端倪,但假如有人使壞,想注入一下呢?

1 String sql = "select * from goods where min_name = ?"; // 含有參數
2 PreparedStatement st = conn.prepareStatement(sql);
3 st.setString(1, "兒童'"); // 參數賦值
4 System.out.println(st.toString()); //com.mysql.jdbc.JDBC4PreparedStatement@d704f0: select * from goods where min_name = '兒童\''

簡單的在參數後邊加一個單引號,就可以快速判斷是否可以進行SQL注入,這個百試百靈,如果有漏洞的話,一般會報錯。

之所以PreparedStatement能防止注入,是因為它把單引號轉義了,變成了\',這樣一來,就無法截斷SQL語句,進而無法拼接SQL語句,基本上沒有辦法注入了。

所以,如果不用PreparedStatement,又想防止注入,最簡單粗暴的辦法就是過濾單引號,過濾之後,單純從SQL的角度,無法進行任何注入。

其實,剛剛我們提到的是String參數類型的注入,大多數注入,還是發生在數值類型上,幸運的是PreparedStatement為我們提供了st.setInt(1,
999);這種數值參數賦值API,基本就避免了注入,因為如果用戶輸入的不是數值類型,類型轉換的時候就報錯了。

好,現在讀者已經了解PreparedStatement會對參數做轉義,接下來再看個例子。

1 String sql = "select * from goods where min_name = ?"; // 含有參數
2 PreparedStatement st = conn.prepareStatement(sql);
3 st.setString(1, "兒童%"); // 參數賦值
4 System.out.println(st.toString()); //com.mysql.jdbc.JDBC4PreparedStatement@8543aa: select * from goods where min_name = '兒童%'

我們嘗試輸入了一個百分號,發現PreparedStatement竟然沒有轉義,百分號恰好是like查詢的通配符。

正常情況下,like查詢是這么寫的:

1 String sql = "select * from goods where min_name like ?"; // 含有參數
2 st = conn.prepareStatement(sql);
3 st.setString(1, "兒童" + "%"); // 參數賦值
4 System.out.println(st.toString()); //com.mysql.jdbc.JDBC4PreparedStatement@8543aa: select * from goods where min_name like '兒童%'

查詢min_name欄位以"兒童"開頭的所有記錄,其中"兒童"二字是用戶輸入的查詢條件,百分號是我們自己加的,怎麼可能讓用戶輸入百分號嘛!等等!如果用戶非常聰明,偏要輸入百分號呢?

String sql = "select * from goods where min_name like ?"; // 含有參數
st = conn.prepareStatement(sql);
st.setString(1, "%兒童%" + "%"); // 參數賦值
System.out.println(st.toString()); //com.mysql.jdbc.JDBC4PreparedStatement@8543aa: select * from goods where min_name like '%兒童%%'

聰明的用戶直接輸入了"%兒童%",整個查詢的意思就變了,變成包含查詢。實際上不用這么麻煩,用戶什麼都不輸入,或者只輸入一個%,都可以改變原意。

雖然此種SQL注入危害不大,但這種查詢會耗盡系統資源,從而演化成拒絕服務攻擊。

那如何防範呢?筆者能想到的方案如下:

·直接拼接SQL語句,然後自己實現所有的轉義操作。這種方法比較麻煩,而且很可能沒有PreparedStatement做的好,造成其他更大的漏洞,不推薦。

·直接簡單暴力的過濾掉%。筆者覺得這方案不錯,如果沒有嚴格的限制,隨便用戶怎麼輸入,既然有限制了,就乾脆嚴格一些,乾脆不讓用戶搜索%,推薦。

目前做搜索,只要不是太差的公司,一般都有自己的搜索引擎(例如著名的java開源搜索引擎solr),很少有在資料庫中直接like的,筆者並不是想在like上鑽牛角尖,而是提醒讀者善於思考,每天都在寫著重復的代碼,卻從來沒有停下腳步細細品味。

有讀者可能會問,為什麼我們不能手動轉義一下用戶輸入的%,其他的再交給PreparedStatement轉義?這個留作思考題,動手試一下就知道為什麼了。

注意,JDBC只是java定義的規范,可以理解成介面,每種資料庫必須有自己的實現,實現之後一般叫做資料庫驅動,本文所涉及的PreparedStatement,是由MySQL實現的,並不是JDK實現的默認行為,也就是說,不同的資料庫表現不同,不能一概而論。

熱點內容
丁度巴拉斯情人電影推薦 發布:2024-08-19 09:13:07 瀏覽:886
類似深水的露點電影 發布:2024-08-19 09:10:12 瀏覽:80
《消失的眼角膜》2電影 發布:2024-08-19 08:34:43 瀏覽:878
私人影院什麼電影好看 發布:2024-08-19 08:33:32 瀏覽:593
干 B 發布:2024-08-19 08:30:21 瀏覽:910
夜晚看片網站 發布:2024-08-19 08:20:59 瀏覽:440
台灣男同電影《越界》 發布:2024-08-19 08:04:35 瀏覽:290
看電影選座位追女孩 發布:2024-08-19 07:54:42 瀏覽:975
日本a級愛情 發布:2024-08-19 07:30:38 瀏覽:832
生活中的瑪麗類似電影 發布:2024-08-19 07:26:46 瀏覽:239