互联网并发与安全系列教程(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月前
|
安全 测试技术 程序员
web渗透-文件包含漏洞
文件包含漏洞源于程序动态包含文件时未严格校验用户输入,导致可加载恶意文件。分为本地和远程包含,常见于PHP,利用伪协议、日志或session文件可实现代码执行,需通过合理过滤和配置防范。
1393 79
web渗透-文件包含漏洞
|
10月前
|
存储 安全 前端开发
Web渗透-文件上传漏洞-上篇
文件上传漏洞常见于Web应用,因类型限制不严可致恶意文件执行。本文介绍前端检测、MIME类型、黑名单、.htaccess、空格、双写等多种绕过方式,并结合upload-labs靶场演示利用方法,提升安全防护认知。
2994 1
Web渗透-文件上传漏洞-上篇
|
10月前
|
安全 中间件 应用服务中间件
WEB渗透-文件上传漏洞-下篇
本文详解文件上传安全漏洞,涵盖白名单绕过(如00截断、条件竞争)、图片木马制作与利用、以及IIS、Apache、Nginx等常见解析漏洞原理与防御。结合实战案例,深入剖析攻击手法与修复方案。
763 1
|
10月前
|
存储 JavaScript 安全
Web渗透-XSS漏洞深入及xss-labs靶场实战
XSS(跨站脚本攻击)是常见的Web安全漏洞,通过在网页中注入恶意脚本,窃取用户信息或执行非法操作。本文介绍其原理、分类(反射型、存储型、DOM型)、测试方法及xss-labs靶场实战案例,帮助理解与防御XSS攻击。
2865 1
Web渗透-XSS漏洞深入及xss-labs靶场实战
|
10月前
|
安全 程序员 数据库连接
web渗透-CSRF漏洞
CSRF(跨站请求伪造)是一种常见的Web安全漏洞,攻击者通过伪造用户请求,诱使其在已登录状态下执行非意愿操作。本文介绍CSRF原理、分类(站外与站内)、DVWA靶场搭建及防御措施,如同源策略与Token验证,提升安全防护意识。
702 0
web渗透-CSRF漏洞
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
629 4
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
|
前端开发 JavaScript Shell
鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。
|
JSON 开发框架 自然语言处理
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
387 104