Java基础(37)XSS攻击、SQL注入攻击、CSRF攻击

XSS攻击(跨站脚本攻击)

定义:XSS(Cross-Site Scripting)攻击是指攻击者在目标网站上注入恶意的客户端脚本,当其他用户浏览该网站时,嵌入在网页中的这段脚本会被执行,从而达到攻击的目的,如盗取用户信息、劫持用户会话等。

演示
假设有一个简单的留言板网站,允许用户提交留言并将留言显示给所有访问者。如果网站没有对用户输入的数据进行适当的过滤或转义,攻击者可以提交包含JavaScript代码的留言:

<script>alert('XSS Attack!');</script>

当其他用户浏览含有这条留言的页面时,这段脚本就会在他们的浏览器中执行,弹出警告框。

防御措施

  • 对用户输入进行验证和过滤。
  • 使用HTTP头Content-Security-Policy限制资源的加载和执行。
  • 对输出进行编码,如使用HTML实体编码。

SQL注入攻击

定义:SQL注入攻击是指攻击者在网站输入数据的地方输入SQL命令,由于应用程序没有对输入进行恰当的处理,这些命令会被发送到数据库执行。攻击者可以利用这种攻击手段读取、修改甚至删除数据库中的数据。

演示
考虑一个网站,用户可以通过输入用户名和密码登录。后端代码直接将用户输入拼接到SQL查询中:

# 假设这是一个简化的Python后端处理登录请求的代码
username = input("Username: ")
password = input("Password: ")
sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"

如果攻击者输入用户名admin' --,密码随意,构造的SQL语句变为:

SELECT * FROM users WHERE username = 'admin' --' AND password = '任意值'

--是SQL中的注释符号,这会使得密码检验部分被注释掉,导致攻击者无需密码即可以admin身份登录。

防御措施

  • 使用预处理语句(Prepared Statements)。
  • 对用户输入进行严格的验证。
  • 限制数据库账户的权限。

CSRF攻击(跨站请求伪造)

定义:CSRF(Cross-Site Request Forgery)攻击是指攻击者诱导用户在当前已认证的Web应用中,不知不觉中发送恶意请求。这种攻击背后的原理是利用了Web应用对用户的信任。

演示
假设有个银行网站,用户登录后可以通过访问http://bank.example.com/transfer?amount=100&to=attacker来转账。

攻击者可以在另一个网站上放置以下HTML代码:

<img src="http://bank.example.com/transfer?amount=10000&to=attacker" style="display: none;">

当用户浏览该恶意网站时,上面的img标签会试图加载这个图像,实际上是发起了一个转账请求。如果用户是银行网站的登录用户,那么这个请求将以用户的身份被执行。

防御措施

  • 使用CSRF令牌:为每个用户的会话生成一个随机的请求令牌,并要求所有敏感操作的请求必须携带这个令牌。
  • 检查Referer头:验证请求是否来自合法的源。
  • 使用SameSite Cookie属性:限制第三方网站发起的请求。
  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
自定义防止XSS攻击: 可以使用过滤器Filter来对请求进行过滤,过滤掉恶意脚本。以下是一个简单的过滤器实现: ```java @Component 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 { XssHttpServletRequestWrapper wrapper = new XssHttpServletRequestWrapper((HttpServletRequest) request); chain.doFilter(wrapper, response); } @Override public void destroy() { } public static class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { public XssHttpServletRequestWrapper(HttpServletRequest request) { super(request); } @Override public String getParameter(String name) { String value = super.getParameter(name); if (value != null) { value = HtmlUtils.htmlEscape(value, "UTF-8"); } return value; } @Override public String[] getParameterValues(String name) { String[] values = super.getParameterValues(name); if (values != null) { for (int i = 0; i < values.length; i++) { values[i] = HtmlUtils.htmlEscape(values[i], "UTF-8"); } } return values; } } } ``` 自定义防止CSRF攻击: 可以使用Token来防止CSRF攻击,以下是一个简单的Token生成和验证的工具类: ```java @Component public class CsrfTokenUtils { private static final String CSRF_TOKEN = "csrf_token"; public String generateToken() { String token = UUID.randomUUID().toString(); HttpSession session = getSession(); session.setAttribute(CSRF_TOKEN, token); return token; } public boolean checkToken(HttpServletRequest request) { HttpSession session = request.getSession(false); if (session == null) { return false; } String sessionToken = (String) session.getAttribute(CSRF_TOKEN); String requestToken = request.getParameter(CSRF_TOKEN); return StringUtils.equals(sessionToken, requestToken); } private HttpSession getSession() { ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = requestAttributes.getRequest(); return request.getSession(); } } ``` 自定义防止SQL注入攻击: 可以使用Mybatis等ORM框架的参数化查询来防止SQL注入攻击。以下是一个简单的Mybatis的参数化查询示例: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE username = #{username} AND password = #{password}") User selectByUsernameAndPassword(@Param("username") String username, @Param("password") String password); } ``` 以上是一些自定义防止XSSCSRFSQL注入攻击的常见方法,具体的代码实现需要参考具体的业务场景和技术框架。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辞暮尔尔-烟火年年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值