日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

闭关修炼(二十五)基础web安全

發(fā)布時(shí)間:2023/12/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 闭关修炼(二十五)基础web安全 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

不是特別難,主要是積累經(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。