互联网并发与安全系列教程(05) - 常见的Web安全漏洞(XSS攻击、SQL注入、防盗链)

简介: 互联网并发与安全系列教程(05) - 常见的Web安全漏洞(XSS攻击、SQL注入、防盗链)

1. XSS攻击

XSS攻击使用Javascript脚本注入进行攻击

例如在提交表单后,展示到另一个页面,可能会受到XSS脚本注入,读取本地cookie远程发送给黑客服务器端。

<script>alert('sss')</script>
<script>window.location.href='http://www.xxx.com';</script>

对应html源代码:

&lt;script&gt;alert('sss')&lt;/script&gt;
1.1 如何防御XSS攻击?

将脚本特殊字符,转换成html源代码进行展示。

汉字编码:http://www.mytju.com/classcode/tools/encode_gb2312.asp

步骤:编写过滤器拦截所有getParameter参数,重写httpservletwrapp方法

将参数特殊字符转换成html源代码保存。

// 重写HttpServletRequestWrapper 防止XSS攻击
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
  private HttpServletRequest request;
  /**
   * @param request
   */
  public XssHttpServletRequestWrapper(HttpServletRequest request) {
    super(request);
    this.request = request;
  }
  @Override
  public String getParameter(String name) {
    // 过滤getParameter参数 检查是否有特殊字符
    String value = super.getParameter(name);
    System.out.println("value:" + value);
    if (!StringUtils.isEmpty(value)) {
      // 将中文转换为字符编码格式,将特殊字符变为html源代码保存
      value = StringEscapeUtils.escapeHtml(value);
      System.out.println("newValue:" + value);
    }
    return value;
  }
}

SpringBoot启动加上 @ServletComponentScan:

@SpringBootApplication
@ServletComponentScan
public class App {
  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }
}

2. SQL注入攻击

SQL注入指的是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作作。

造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。

2.1 如何防御SQL注入?

不要使用拼接SQL语句方式、最好使用预编译方式,在mybatis编写sql语句的时候,最好使用?传参数方式,不要使用#传参数,因为#传参数方式,可能会受到sql语句攻击。

演示案例:

http://127.0.0.1:8080/login?userName=‘liusi’&password=‘123’

http://127.0.0.1:8080/login?userName=‘liusi’&password=‘123’ or 1=1

@RestController
public class LoginController {
  @Autowired
  private UserMapper userMapper;
  @RequestMapping("/login")
  public String login(UserEntity userEntity) {
    System.out.println("账号密码信息:userEntity:" + userEntity.toString());
    UserEntity login = userMapper.login(userEntity);
    return login == null ? "登陆失败!" : "登陆成功!";
  }
}
public interface UserMapper {
  @Select(" SELECT  * FROM user_info where userName=${userName} and password=${password}")
  public UserEntity login(UserEntity userEntity);
}

3.MyBatis #与?区别

  • #{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符,可以防止SQL注入问题。
  • ${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。

3. HTTP请求防盗链

比如A网站有一张图片,被B网站直接通过img标签属性引入,直接盗用A网站图片展示。

3.1 如何防御防盗链?

判断http请求头Referer域中的记录来源的值,如果和当前访问的域名不一致的情况下,说明该图片可能被其他服务器盗用。

代码实现:

@WebFilter(filterName = "imgFilter", urlPatterns = "/imgs/*")
public class ImgFilter implements Filter {
  @Value("${domain.name}")
  private String domainName;
  public void init(FilterConfig filterConfig) throws ServletException {
  }
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    String referer = req.getHeader("Referer");
    if (StringUtils.isEmpty(referer)) {
      request.getRequestDispatcher("/imgs/error.png").forward(request, response);
      return;
    }
    String domain = getDomain(referer);
    if (!domain.equals(domainName)) {
      request.getRequestDispatcher("/imgs/error.png").forward(request, response);
      return;
    }
    chain.doFilter(request, response);
  }
  /**
   * 获取url对应的域名
   *
   * @param url
   * @return
   */
  public String getDomain(String url) {
    String result = "";
    int j = 0, startIndex = 0, endIndex = 0;
    for (int i = 0; i < url.length(); i++) {
      if (url.charAt(i) == '/') {
        j++;
        if (j == 2)
          startIndex = i;
        else if (j == 3)
          endIndex = i;
      }
    }
    result = url.substring(startIndex + 1, endIndex);
    return result;
  }
  public void destroy() {
  }
}

总结

目录
相关文章
|
10月前
|
安全 网络协议 NoSQL
Web渗透-常见的端口及对其的攻击思路
本文介绍了常见网络服务端口及其安全风险,涵盖FTP、SSH、Telnet、SMTP、DNS、HTTP、SMB、数据库及远程桌面等20余个端口,涉及弱口令爆破、信息泄露、未授权访问、缓冲区溢出等典型漏洞,适用于网络安全学习与渗透测试参考。
1862 59
|
缓存 移动开发 安全
Web安全-HTTP响应拆分(CRLF注入)漏洞
Web安全-HTTP响应拆分(CRLF注入)漏洞
1849 1
|
SQL 存储 安全
Web 常见攻击方式及防御方法
【10月更文挑战第25天】Web 安全是一个复杂而重要的领域,攻击者不断寻找新的攻击方法,我们需要不断加强防御措施,提高安全意识,以保障 Web 应用的安全运行。通过采取多种防御手段的综合运用,我们可以有效地降低 Web 攻击的风险,保护用户的信息和财产安全。同时,随着技术的不断发展,我们也需要持续关注和研究新的安全威胁和防御方法,以应对不断变化的安全形势。
1846 56
|
存储 消息中间件 缓存
构建互联网高性能WEB系统经验总结
构建互联网高性能WEB系统经验总结
242 16
|
存储 消息中间件 缓存
构建互联网高性能WEB系统经验总结
如何构建一个优秀的高性能、高可靠的应用系统对每一个开发者至关重要
227 2
|
Web App开发 网络协议 安全
基于Web攻击的方式发现并攻击物联网设备介绍
基于Web攻击的方式发现并攻击物联网设备介绍
322 4
|
SQL 安全 前端开发
Web学习_SQL注入_联合查询注入
联合查询注入是一种强大的SQL注入攻击方式,攻击者可以通过 `UNION`语句合并多个查询的结果,从而获取敏感信息。防御SQL注入需要多层次的措施,包括使用预处理语句和参数化查询、输入验证和过滤、最小权限原则、隐藏错误信息以及使用Web应用防火墙。通过这些措施,可以有效地提高Web应用程序的安全性,防止SQL注入攻击。
949 2
|
安全 前端开发 Java
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第26天】Web安全是现代软件开发的重要领域,本文深入探讨了XSS和CSRF两种常见攻击的原理及防御策略。针对XSS,介绍了输入验证与转义、使用CSP、WAF、HTTP-only Cookie和代码审查等方法。对于CSRF,提出了启用CSRF保护、设置CSRF Token、使用HTTPS、二次验证和用户教育等措施。通过这些策略,开发者可以构建更安全的Web应用。
1130 4
|
存储 安全 Go
Web安全基础:防范XSS与CSRF攻击的方法
【10月更文挑战第25天】Web安全是互联网应用开发中的重要环节。本文通过具体案例分析了跨站脚本攻击(XSS)和跨站请求伪造(CSRF)的原理及防范方法,包括服务器端数据过滤、使用Content Security Policy (CSP)、添加CSRF令牌等措施,帮助开发者构建更安全的Web应用。
759 3
|
安全 Go PHP
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第27天】本文深入解析了Web安全中的XSS和CSRF攻击防御策略。针对XSS,介绍了输入验证与净化、内容安全策略(CSP)和HTTP头部安全配置;针对CSRF,提出了使用CSRF令牌、验证HTTP请求头、限制同源策略和双重提交Cookie等方法,帮助开发者有效保护网站和用户数据安全。
972 2