xssjava,java代碼過濾

本文目錄一覽:

用JAVA做一個網站,現在要做防止XSS攻擊,請問怎麼防止這種攻擊

過濾特定符號pre t=”code” l=”java” public static String guolv(String a) {

a = a.replaceAll(“%22”, “”);

a = a.replaceAll(“%27”, “”);

a = a.replaceAll(“%3E”, “”);

a = a.replaceAll(“%3e”, “”);

a = a.replaceAll(“%3C”, “”);

a = a.replaceAll(“%3c”, “”);

a = a.replaceAll(“”, “”);

a = a.replaceAll(“”, “”);

a = a.replaceAll(“\””, “”);

a = a.replaceAll(“‘”, “”);

a = a.replaceAll(“\\+”, “”);

a = a.replaceAll(“\\(“, “”);

a = a.replaceAll(“\\)”, “”);

a = a.replaceAll(” and “, “”);

a = a.replaceAll(” or “, “”);

a = a.replaceAll(” 1=1 “, “”);

return a;

}

如何安全檢測Java Web應用網站漏洞

如何安全檢測Java Web應用網站漏洞.txt32因為愛心,流浪的人們才能重返家園;因為愛心,疲憊的靈魂才能活力如初。渴望愛心,如同星光渴望彼此輝映;渴望愛心,如同世紀之歌渴望永遠被唱下去。web開發應用程序(網站),是目前應用最廣泛的程序。但是開發者的水平參差不齊,導致了各種各樣web漏洞的出現。本文站在分層架構的角度,分析一下如何在java web程序中找到可能出現的種種漏洞。            本文討論的只是web程序上的漏洞,和其它漏洞,是相對獨立的。這句話看似廢話,實際上卻說明了時常被忽略的因素,即:“很多人認為只要我開發web程序沒有漏洞,web服務器就安全了”,事實上,並非如此。一個合格的web程序開發人員,應該時刻清楚自己開發的程序會在什麼環境中被使用,以及一旦自己的程序產生某種漏洞,最終會導致什麼後果。簡單的說,web程序被安裝在一台或多台(分布式)web服務器上,一旦安裝成功,就等於在為廣大用戶提供服務的同時,給入侵者打開了一條或N條新的思路。如果服務器管理員剛好對安全配置不了解(事實上,國內這種管理員居多),那麼只好由我們的程序來守好最後的關卡最後一道防線。            看了本文題目,一定有一部分人會認為,“不就是講JSP漏洞么,用得着披着這麼厚的包裝么?”,為了回答這個疑問,我們先看看JSP和ASP的開發有什麼不同吧。在ASP時代(ASP,PHP等語言),開發一套系統往往比修改別人已經寫好的系統痛苦的多,因為它們把所有的代碼(包括鏈接數據庫的代碼、執行SQL語句的代碼、控制頁面顯示的代碼)統統都放在%……%中,我們時常會看到如下代碼塊:        ———–代碼來自某ASP SHELL———–      Function GetFileSize(size)      Dim FileSize       FileSize=size / 1024       FileSize=FormatNumber(FileSize,2)       If FileSize  1024 and FileSize  1 then       GetFileSize=”font color=red” FileSize  “/font KB”      ElseIf FileSize 1024 then       GetFileSize=”font color=red” FormatNumber(FileSize / 1024,2)  “/font MB”      Else       GetFileSize=”font color=red” Size  “/font Bytes”      End If       End Function       —————————————-               如果客戶的需求變了,要求頁面不能使用“font color=red”等標籤,全部應用“CSS”顯示。掛了,把程序員召喚出來,一個一個的改吧。。。注意,這裡強調下,特指“召喚程序員”才能改,如果是學美工的,只會HTML、JS、CSS,完了,這活還幹不成。而這些只是簡單的頁面修改,如果客戶今天說,MYSQL服務器承擔不了這個數據量,要掛Oracle,可憐的程序員就要在一片一片的代碼海洋里尋找執行SQL語句的代碼,而每一個文件都可能存放着SQL語句,意味着每一個文件都可能在受SQL注入的威脅。  

           而JSP採用MVC模式分層架構進行開發,就可以把所有的文件分開,根據其用途,分別放在不同的文件夾下(分層),每個文件夾下的文件只負責自己的事情。例如數據訪問層的代碼就放在數據訪問層的文件夾下,業務邏輯層的代碼也都放在自己的文件夾下,當顯示層(這一層是為了把最終的運算結果顯示給用戶看)的需求發生變化,就像前面的客戶需求,我們只要修改這一層的文件就是了,其他層的代碼根本不需要動,而修改者也不需要懂得其它層的代碼。        代碼分層了,意味着漏洞也在跟着分層,我們尋找JSP漏洞的思路也要跟着分層,才能與時俱進。            下面在講述尋找漏洞的過程中,本文就拿一個簡單的分層架構例子來做樣板。樣板程序的名稱為“XX文章系統”,系統使用了STRUTS框架,和安全有關的層分為:         “DB層”,這一層存放了鏈接數據庫的字符串,以及JdbcTemplate類,直接訪問數據庫。因為在java中,執行SQL語句的函數按照返回值可以分為三類,所以在這一層定義了JDBC模版類(JdbcTemplate),每一次使用操作數據庫時都要執行這一層的三個方法其中一個。        “DAO層(Data Access Object數據訪問對象層)”,從安全角度上看,這一層存放了SQL語句(並不執行SQL語句,語句傳給DB層執行)。這一層調用“DB層”訪問數據庫,它只知道“DB層”的存在,不知道數據庫的存在。        “SERVICE層”,業務邏輯層,因為一個業務的實現,並不是一次數據庫訪問就可以完成的,所以這一層通過N次調用“DAO層的方法”實現業務邏輯,它只知道“DAO層”的存在,不知道“DB層”和數據庫的存在。  “ACTION層”,調用業務邏輯層,根據返回的結果,控制JSP頁面顯示。它只知道業務層的存在。這一層是入侵者的攻擊平台。        “Form層”,把用戶POST提交的信息封裝成Form對象,經過驗證後提交給ACTION層處理。        “JSP層”(顯示層),這一層是最終顯示給用戶看的頁面,同時也是入侵者的攻擊平台。             用戶通過訪問ACTION層,自動會發生:“ACTION調用SERVICE,SERVICE調用DAO,DAO調用DB,DB執行SQL語句返回結果給DAO,DAO返回給SERVICE,SERVICE返回給ACTION,ACTION把數據顯示到JSP里返回給用戶”。        有了樣板,我們來分析這套程序中可能出現的各種web漏洞。        1、SQL注入漏洞            從SQL注入漏洞說起吧,在web漏洞里,SQL注入是最容易被利用而又最具有危害性的。怎麼快速的找到呢?先分析流程,就拿用戶查看文章這個流程為例:用戶訪問一個

action,告訴它用戶想看ID為7的文章,這個action就會繼續完成前面所說的流程。            如果是ASP程序,這就是最容易產生問題的時候,ASP是弱類型,接到參數後不需要轉換類型,就和SQL語句連加起來。但是JSP就不一樣,JSP是強類型的語言,接受有害的參數後:對於GET請求(直接在地址欄訪問頁面),如果這裡要的是int型,即使不懂安全的程序員,也會把它(文章的ID)立刻轉換成int,因為這裡轉換後在後面的處理中會更容易操作,而這時程序就出錯了;對於POST請求,如果這裡要的是int型,程序會在把它封裝成Form對象時,因為自動要進行類型轉化,同樣發生錯誤,這兩種錯誤發生後,根本不會訪問後面的流程就跳出了,或許這就是JSP天生的安全性。所以,通常提交的變量是int時,不會發生問題,問題會出現在string參數這裡,如果要查看某用戶的信息,程序可能會讓你提交如下參數:showuser.do?    username=kxlzx。問題來了,因為這裡是string類型,所以不懂安全的程序員頂多會判斷一下是不是空,就連加成為SQL語句。有漏洞的程序大概會寫成這個樣子:        ACTION的代碼: showuser.do      String username = null;       username = request.getParameter(“username”);      Service service = new Service();      service.findByUsername(username);       得到參數後調用service,service層直接交給了Dao層,dao的代碼:      public Object findByUsername(String username)       {       JdbcTemplate jt=new JdbcTemplate();       String sql = “select * from Users where username=’”+username”’”;      List list = jt.query(sql);      ……………….       }             dao調用了DB層的JdbcTemplate,把SQL語句拼好後,傳給了JdbcTemplate去執行。不用再看這裡的JdbcTemplate,就可以知道裡面的代碼使用了Statement的executequery()方法執行,導致了SQL注入。           分析了這麼半天,有讀者會問:“難道我要費這麼大的力氣才能找到漏洞么?”。的確,通常在ASP程序里找注入時的思路就是這樣子,但是我們現在是在使用了開發模式分層架構的JSP程序里,應該按照分層架構的思維去找漏洞。在回答這個問題之前,我們還得繞個彎子,看看怎麼在這裡預防SQL注入(java始終都是這麼優美,它不會直接告訴你答案,而是一層一層的讓你撥開雲霧)。            剛才分析流程,是從正向分析的,從用戶輸入到產生漏洞,我們在防禦的時候,不妨倒過來看看,從DB層入手。JdbcTemplate調用執行SQL語句,可以有兩個類供我們選擇,一個是Statement,另一個就是預處理的Statement,兩者有着效率上和安全上的顯著差別。在效率上,只要數據庫支持預處理技術(sqlserver,mysql,oracle等都支持,只有少數access等不支持),就會在大量執行SQL語句時增加速度;在安全上,使用預處理,會把接受的參數也經過預處理,從而不會作為SQL語句的一部分執行,而是僅僅作為SQL語句中的參數部分

內容被執行。一旦DB層使用了預處理,DAO層的SQL語句也會發生變化,成為這個樣子:      public Object findByUsername(String username)       {       JdbcTemplate jt=new JdbcTemplate();       String sql = “select * from Users where username=?”;      List list = jt.query(sql,new Object[1]{username});      ……………….      }              這樣,SQL注入就和我們的程序幾乎無關了,注意我說的是幾乎,而不是全部。知道了怎麼防禦,於是一切在這裡變的簡單極了,我們應該直接去DB層找到JdbcTemplate,看看代碼,一旦使用了Statement,很好,這個系統十有八九有漏洞,下面要做的是使用Editplus搜索“request.getParameter”。沒有使用預處理的系統,可能會在action層進行防禦,對參數過濾,但總有防禦不到的時候,因為戰線拉的太長了,每一個action里都可能接受參數並存在漏洞。            還有一種情況,系統一部分使用了預處理,一部分沒有,這樣的情況可能是因為項目趕的比較倉促,人員沒有經過正規培訓,最後艱難的整合到了一起。這種情況也好辦,直接在DAO層搜索(”’)或(’”),這些符號用於和字符串變量連加,拼SQL語句,肯定是這些語句之後的代碼使用了Statement。然後再往上層找,看看哪個action調用了這個有問題的dao類,也可能發生SQL注入。          即使系統使用了預處理,別忘了,程序給客戶使用後,客戶有權利去擴展的。程序拿到客戶那裡,客戶有了新的需求,而這個需求又不大,很可能不願意花錢重新僱人來實現擴展功能,在這個時候也可能出現問題,客戶使用自己的程序員擴展AJAX功能,這個程序員因為怕出問題,不敢動源程序,就在web.xml里加了一個servlet,這個servlet直接去調用conn。可怕的事情發生了。所以,我們的搜索漏洞規則中又加上了一條,在非dao層的文件中,搜索“select,update,delete”等字符串。        2、暴露程序信息漏洞            這個漏洞是怎麼來的呢?我們需要從異常說起。有經驗的入侵者,可以從JSP程序的異常中獲取很多信息,比如程序的部分架構、程序的物理路徑、SQL注入爆出來的信息等,這個漏洞很容易防禦,卻很難快速定位漏洞文件。出現這樣漏洞的時候,通常是我們在寫代碼的時候,少了一些可能性的考慮而導致的。這樣的問題都是經驗造成的,而尋找漏洞也要通過經驗加運氣(要有仙緣。。。),我個人技術有限,就不多說了。防禦的方法就是在程序中加上“Exception層”,自定義異常,把系統產生的異常統統包裝起來,不要放過任何一個可能產生異常的地方。像騰訊的異常就包裝的很好“對不起,今天的註冊人數已經達到十萬,請您明天再來。。。”,廢話,日註冊量都十萬,還讓不讓人活啦,鐵定是程序發生了異常,不敢讓各位大大們看到真實的面孔。

java web開發如何有效的防止xss攻擊

配置過濾器,再實現 ServletRequest 的包裝類。

將所有的編程全角字符的解決方式。首先添加一個jar包:commons-lang-2.5.jar ,然後在後台調用函數。

Struct2+Spring 架構JavaWeb項目,出現xss跨站腳本攻擊漏洞解決方案??

沒用到富文本的話可以用spring里的HtmlUtils.htmlEscape(string str)來對parameter轉碼。是用filter還是其他方式都可以

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/200847.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-06 11:28
下一篇 2024-12-06 11:28

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29

發表回復

登錄後才能評論