SpringBoot 防止SQL注入、XSS攻击、CSRF/CROS恶意访问

是这样的,想请问下,SpringBoot 防止SQL注入、XSS攻击、CSRF/CROS恶意访问
最新回答
栖止你掌

2024-11-28 16:26:21

一、SQL 注入问题


SQL 注入即是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

简单来说,就是将大部分 SQL 语句当参数传入系统中,从而获取系统中的数据。下面简单举例说明

系统中有这样一条信息 SQL 语句执行,分页查询所有用户,每页查询 20 条,并且根据指定字段进行排序,也就是说排序字段也是参数传递过来的

SQL 注入问题分析:

这样很简单的一句话 SQL,就可以把系统搞炸掉,这种方式可以实现删库跑路

以上语句会把整个 test 数据库所有内容都删掉

尽量用预编译机制,少用字符串拼接的方式传参,它是 sql 注入问题的根源。

有些特殊字符,比如:%作为 like 语句中的参数时,要对其进行转义处理。

需要对所有的异常情况进行捕获,切记接口直接返回异常信息,因为有些异常信息中包含了 sql 信息,包括:库名,表名,字段名等。攻击者拿着这些信息,就能通过 sql 注入随心所欲地攻击你的数据库了。目前比较主流的做法是,有个专门的网关服务,它统一暴露对外接口。用户请求接口时先经过它,再由它将请求转发给业务服务。这样做的好处是:能统一封装返回数据的返回体,并且如果出现异常,能返回统一的异常信息,隐藏敏感信息。此外还能做限流和权限控制。

使用 sqlMap 等待代码检测工具,它能检测 sql 注入漏洞。

需要对数据库 sql 的执行情况进行监控,有异常情况,及时邮件或短信提醒。

对生产环境的数据库建立单独的账号,只分配 DML 相关权限,且不能访问系统表。切勿在程序中直接使用管理员账号。

建立代码 review 机制,能找出部分隐藏的问题,提升代码质量。

对于不能使用预编译传参时,要么开启 druid 的 filter 防火墙,要么自己写代码逻辑过滤掉所有可能的注入关键字。

XSS 攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是 JavaScript,但实际上也可以包括 Java、 VBScript、ActiveX、 Flash 或者甚至是普通的 HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和 cookie 等各种内容。

通常情况下,被用来盗用 Cookie、破坏页面结构、重定向到其他网站等

对用户输入的表单信息进行检测过滤

CSRF - Cross-Site Request Forgery - 跨站请求伪造:

攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,CORS - Cross Origin Resourse-Sharing - 跨站资源共享,恶意访问内网敏感资源。

有效的解决办法是通过多种条件屏蔽掉非法的请求,例如 HTTP 头、参数等:

防止大规模的恶意请求,niginx 反向代理可以配置请求频率,对 ip 做限制。nginx 可以很方便地做访问控制,特别是一些偶发性的大量恶意请求,需要屏蔽处理。

屏蔽 ip 地址

屏蔽 user-agent

屏蔽代理 ip

有两种情形会需要屏蔽代理 ip:一是代理 ip 访问,二是负载均衡(real-ip 请求负载均衡服务器,再代理给后端 server)

创建 XssAndSqlHttpServletRequestWrapper 包装器,这是实现 XSS 过滤的关键,在其内重写了 getParameter,getParameterValues,getHeader 等方法,对 http 请求内的参数进行了过滤