程序员之网络安全

程序员为什么要了解一些网络安全的知识呢?了解如何防御常见的网络攻击有助于提高代码的健壮性和安全性。甚至有些公司在支付业务,涉及到钱这方面的业务的时候,项目必须经过安全性测试意思就是项目具备抵御攻击的能力的之后才能上线。知道攻击的原理之后才能更好的做出解决方案去抵御攻击,下面了解一些Web安全常见的攻击手段。

Web安全常见攻击手段

  • XSS
  • SQL注入
  • 防盗链
  • CSRF
  • 上传漏洞

XSS攻击原理

使用JS脚本语言,因为浏览器默认支持脚本语言执行,如果在表单提交的时候,提交一些脚本参数,可能浏览器直接进行执行。
XSS攻击漏洞常见场景:
论坛,评论XSS
比如说一个表单提交,用户需要输入框中输入内容点击按钮进行提交内容,非常规操作是 输入一段JavaScript脚本,然后你的项目会把输入的这段JavaScript脚本当成项目中的代码也一起执行了,这样的异常操作就会导致意想不到的后果。
例如一个支付业务,前面需要用户填好信息,填完信息之后要跳转到一个支付页面,网络攻击的人可能会在表单的输入框中输入这样一段JavaScript脚本如:
<script>window.href="www.heike.com"</script>
这样点击提交的时候页面就会跳转到其他网站上,此时网络攻击的人会把跳转到的这个网站做的和你要支付的页面长得一样,你继续支付的话钱就到别人的账户上了,这就是典型的XSS攻击。
不过有些浏览器厂商在做浏览器的时候就考虑到了这一点提供了一些防御XSS攻击的手段比如说谷歌浏览器,但是有一些浏览器并不能提供这样的功能,所以就需要程序员考虑到这一点。

XSS攻击防御手段

像一些特殊字符,比如 < 、> 如果不进行特殊字符处理的话,很有可能受到XSS攻击,用户如果提交

package com.itheima.util;

import org.apache.commons.lang3.StringEscapeUtils;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private HttpServletRequest request;

    public XssHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        this.request=request;
    }

    @Override
    public String getParameter(String name){
        //获取之前的参数值
        String oldValue=super.getParameter(name);
        System.out.println("原来的参数:"+oldValue);
        if(!StringUtils.isEmpty(oldValue)){
            //将特殊字符转换成HTML展示
            oldValue= StringEscapeUtils.escapeHtml3(oldValue);
            System.out.println("转换后:"+oldValue);
        }
        return oldValue;
    }
}

XssFilter类:

package com.itheima.util;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter(filterName = "xssFilter",urlPatterns = "/*")
public class XssFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //程序防止XSS攻击原理
//        1、使用过滤器拦截所有参数
        HttpServletRequest req=(HttpServletRequest)request;
//        2、重新getParameter方法
        XssHttpServletRequestWrapper xssHttpServletRequestWrapper=new XssHttpServletRequestWrapper(req);
//        3、使用(StringEscapeUtils.escapeHtml(name))转换特殊参数
//        放行程序,继续往下执行
        chain.doFilter(xssHttpServletRequestWrapper,response);
    }

    @Override
    public void destroy() {

    }
}

SQL 注入原理

SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
程序代码中,dao层的SQL语句如果使用拼接方式,那么可能会有SQL注入的问题,拼接语句,成立让SQL进行成立进行。

#与 $ 符号区别:

使用mybatis的时候,SQL语句传递参数最好使用# 号,因为 # 会预编译SQL语句,可以有效的防止SQL语句攻击,
$ 需要SQL语句拼接,可能会受到SQL语句攻击。

容易引发SQL注入的语句:
在这里插入图片描述提倡使用:
在这里插入图片描述
地址栏参数的SQL注入情况:
正常情况:地址栏参数需要有账号密码参数去验证登录才可以
在这里插入图片描述
SQL注入情况:由于SQL语句中使用了$拼接的方式,引发了SQL注入的问题,地址栏参数把密码去掉加上一个恒等式也能实现登录验证成功
在这里插入图片描述

发布了176 篇原创文章 · 获赞 185 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Sophia_0331/article/details/104752932