闭关修炼(二十五)基础web安全
不是特別難,主要是積累經(jīng)驗(yàn)
趕緊學(xué)springboot去了,好拖延啊。捂臉
文章目錄
- 表單重復(fù)提交
- 前端解決方法
- 接口如何防止模擬http請(qǐng)求
- 使用Filter防止XSS攻擊
- SQL注入
常見(jiàn)的攻擊有哪些?
SQL注入,XSS,CSRF(和表單重復(fù)提交是一個(gè)類型)
最基本的WEB安全防范:密碼設(shè)為英文+數(shù)字+特殊符號(hào),訪問(wèn)白名單
表單重復(fù)提交
表單重復(fù)提交十分常見(jiàn),
表單重復(fù)提交主要原因是網(wǎng)絡(luò)延遲
簡(jiǎn)單的處理辦法是前端使用token
但是無(wú)法防止模擬http請(qǐng)求
先模擬問(wèn)題發(fā)生
寫一個(gè)form.jsp
<html><head><title>$form$</title></head><form action="${pageContext.request.contextPath}/DoFormServlet" method="post">用戶名:<input type="text" name="userName"><input type="submit" value="提交" id="submit"></form><body></body> </html>寫個(gè)servlet用于調(diào)用
@WebServlet("/DoFormServlet") public class DoFormServlet extends HttpServlet {@SneakyThrows@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");String username = req.getParameter("userName");Thread.sleep(3000);System.out.println("插入數(shù)據(jù)..");resp.getWriter().println("success");} }啟動(dòng)頁(yè)面
輸入123提交,Thread.sleep(3000);延遲了3秒,模擬網(wǎng)絡(luò)延遲,頁(yè)面不會(huì)立即進(jìn)行跳轉(zhuǎn),這時(shí)就可以多次點(diǎn)擊點(diǎn)擊提交按鈕,造成表單重復(fù)提交
后臺(tái)打印
前端解決方法
提交后,按鈕變灰,多一個(gè)標(biāo)識(shí)判斷,這種做法可以,但是有局限性,不能防止刷新重新加載的重復(fù)提交
<html> <head><title>form</title> </head><script type="text/javascript">let submitFlag = false // 沒(méi)有點(diǎn)擊為falsefunction isNoSubmit() {// 還沒(méi)提交返回trueif (!submitFlag) {submitFlag = truereturn true}// 提交了返回falsereturn false}</script> <form action="${pageContext.request.contextPath}/DoFormServlet"method="post"onsubmit="return isNoSubmit()">用戶名:<input type="text" name="userName"/><input type="submit" value="提交" id="submit"/></form> <body> </body> </html>使用token來(lái)解決
token身份令牌,證明有效期和身份
思路:
請(qǐng)求一個(gè)Sevlet生成token存放在session中,轉(zhuǎn)發(fā)到form.jsp,此時(shí)jsp攜帶一個(gè)token并附著表單進(jìn)行提交,到DoFormServlet,判斷token是否有效,DoFormServlet判斷步驟如下:
如果從session中獲取到的token,和表單發(fā)來(lái)的一致,說(shuō)明是第一次的發(fā)來(lái)請(qǐng)求,處理業(yè)務(wù)完畢后刪除sessiom的token,表示這個(gè)token已失效。
如果seesion中沒(méi)有這個(gè)token,說(shuō)明token已經(jīng)被用過(guò)了。
如果傳來(lái)的token為空或者和session的token不一致,說(shuō)明被惡意偽造了token
寫ToFromServlet生成token并作轉(zhuǎn)發(fā)
@WebServlet("/ToFromServlet") public class ToFromServlet extends HttpServlet {@SneakyThrows@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String token = UUID.randomUUID().toString();System.out.println("生成Token:"+token);req.getSession().setAttribute("sessionToken", token);req.getRequestDispatcher("form.jsp").forward(req, resp);} }修改form.jsp,添加一個(gè)hidden域
<html> <head><title>form</title> </head><script type="text/javascript">let submitFlag = false // 沒(méi)有點(diǎn)擊為falsefunction isNoSubmit() {// 還沒(méi)提交返回trueif (!submitFlag) {submitFlag = truereturn true}// 提交了返回falsereturn false}</script><form action="${pageContext.request.contextPath}/DoFormServlet"method="post"onsubmit="return isNoSubmit()"><input type="hidden" value="${sessionToken}" name="sessionToken">用戶名:<input type="text" name="userName"/><input type="submit" value="提交" id="submit"/></form> <body> </body> </html>最后在doFormServlet添加session判斷
@WebServlet("/DoFormServlet") public class DoFormServlet extends HttpServlet {@SneakyThrows@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {if (!isFlag(req,resp)){resp.getWriter().println("fail");System.out.println("已經(jīng)提交了...");return;}req.setCharacterEncoding("utf-8");String username = req.getParameter("userName");Thread.sleep(3000);System.out.println("插入數(shù)據(jù)..");resp.getWriter().println("success");}public boolean isFlag(HttpServletRequest req, HttpServletResponse resp){String sessionToken = req.getParameter("sessionToken");String sessionToken1 = (String) req.getSession().getAttribute("sessionToken");if(StringUtils.isNullOrEmpty(sessionToken)){System.out.println("sessionToken為null");return false;}if (StringUtils.isNullOrEmpty(sessionToken1)){System.out.println("sessionToken1為null");return false;}if(!sessionToken1.equals(sessionToken)){System.out.println("偽造token");return false;}req.getSession().removeAttribute("sessionToken");return true;} }訪問(wèn)/ToFromServlet即可
測(cè)試,后臺(tái)打印:
接口如何防止模擬http請(qǐng)求
帶上token,保證唯一性,難以偽造。但是生成token方式可以破解的,還是可以模擬請(qǐng)求,這時(shí)如何解決呢?
使用驗(yàn)證碼,證明自己不是機(jī)器人
token+驗(yàn)證碼完整解決防止模擬請(qǐng)求
使用Filter防止XSS攻擊
什么是XSS攻擊?
XSS也叫腳本注入
XXSS攻擊常發(fā)生在:有個(gè)表單在頁(yè)面中,當(dāng)提交時(shí),參數(shù)提交,讓數(shù)據(jù)展示在頁(yè)面時(shí),突然彈窗或者頁(yè)面發(fā)生了跳轉(zhuǎn)
如我注入的內(nèi)容是location.href,當(dāng)你訪問(wèn)一個(gè)頁(yè)面立馬跳轉(zhuǎn)到釣魚網(wǎng)站了,用戶登陸界面完全一樣。(我全防去出去了啊)
模擬XSS攻擊
我們寫腳本進(jìn)行注入
一點(diǎn)提交就彈窗
想想如果這個(gè)腳本是在留言區(qū)/評(píng)論區(qū)的話,別的用戶點(diǎn)進(jìn)來(lái)就被彈窗。
XSS頁(yè)面跳轉(zhuǎn)也寫進(jìn)來(lái)
<script>alert('攻擊成功');window.location.href='http://www.baidu.com';</script>"
別人在一個(gè)頁(yè)面訪問(wèn)好端端,然后突然跳轉(zhuǎn)到了登陸界面,界面一模一樣,這就是釣魚網(wǎng)站攻擊,也是XSS的一種
如何防范?
原理是XSS的標(biāo)簽被html解析了,我們轉(zhuǎn)義標(biāo)簽即可。
繼承HttpServletRequest重寫getParameter方法
public class XssHttpServletRequest extends HttpServletRequestWrapper {HttpServletRequest request;public XssHttpServletRequest(HttpServletRequest request) {super(request);this.request = request;}@Overridepublic String getParameter(String name) {String value = request.getParameter(name);if (!StringUtils.isEmpty(value)){value = StringEscapeUtils.escapeHtml4(value);}return value;} }寫Filter,將我們的XssHttpServletRequest傳過(guò)去,這樣getParameter會(huì)轉(zhuǎn)義字符
@WebFilter(filterName = "XSSFilter", urlPatterns = { "/*" }) public class XSSFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;XssHttpServletRequest xssHttpServletRequest = new XssHttpServletRequest(req);chain.doFilter(xssHttpServletRequest, response);}public void destroy() {} }再次測(cè)試,這樣<>就被轉(zhuǎn)義了,破壞了標(biāo)簽
SQL注入
沒(méi)啥好講的了,
有那么幾種辦法防范:
1、PreparedStatement
2、使用正則表達(dá)式過(guò)濾傳入的參數(shù)
3、字符串過(guò)濾
4、檢查是否包函非法字符
然后他啪的一下就站起來(lái)了啊,很快啊,然后上來(lái)就是一個(gè)端口掃描,一個(gè)密碼暴力破解,一個(gè)大殺四方。我全都防出去,防出去了,啊。防出去了以后自然是傳統(tǒng)以點(diǎn)到為止,我大意了啊,沒(méi)有閃。
后面開(kāi)個(gè)新專欄吧,閉關(guān)修煉專欄這都到25了都。
總結(jié)
以上是生活随笔為你收集整理的闭关修炼(二十五)基础web安全的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ie浏览器设置代理
- 下一篇: 解决Zabbix用snmp监控网络流量不