安全
快来分享你的内容吧~
- 2024-11-16·前端开发
知识点记录-前端安全
- xss攻击(跨站脚本攻击):攻击者将恶意代码注入合法网站的页面中,使得用户在访问页面时,执行脚本,达到攻击的恶意目的 解决方式: 1. 防止注入:使用正则替换掉<> 2. 防止执行:**DOMPurify**从HTML中删除所有危险元素和属性,只保留安全问题 *DOMPurify 是一个用于清理 HTML、防止 XSS(跨站脚本攻击)的安全库。它是由 Cure53 开发的一个 JavaScript 库,可以非常有效地帮助开发者在 Web 应用中安全地处理用户输入的 HTML 内容。* - CRRF(跨站请求伪造):利用用户已经登录了目标网站的身份,在用户毫不知情的情况下,完成非法操作 过程: 1. 用户登录一个网站,并在本地保存了登录信息(例如cookie) 2. 攻击者构造一个恶意网站,该网站包含恶意代码(例如表单) 3. 受害者在已经登录的情况下,访问了恶意网站,这时浏览器会携带本站的cookie,请求发送到目标网站 4. 目标网站会认为该请求是合法的,并执行攻击者的操作 解决:使用Token安全令牌 - 点击劫持:当用户点击的时候,网站劫持了用户的点击操作,执行了其他事情 解决:不共享登录状态(在服务端进行) - 其他安全防护方式:内容安全策略CSP和HSTS
初识 Spring Security
### 前言 Spring Security 是什么呢,在官网里时这样描述的 > Spring Security是一个框架,提供 认证(authentication)、授权(authorization) 和 保护,以抵御常见的攻击。它对保护命令式和响应式应用程序有一流的支持,是保护基于Spring的应用程序的事实标准。 简而言之就是一个安全框架,能够很好的保护我们的 Spring 应用 ### Spring Security执行流程(简化)  (图来自B站:三更草堂) 从图中可以看到,用户输入的用户名密码会被一路传到 DaoAuthenticationProvider(后文简称 DAP ), 然后由 InMemoryUserDetailsManager (实现了 UserDetailsService 接口)根据用户名从内存中查找到对应的用户信息并返回给 DAP 。 DAP 将查到的信息与用户输入的信息进行比对,如果正确则返回并存储认证对象(没有json返回值)。 ### 整合数据库 上面提到,Spring Security 默认是在内存中查找用户信息,这是不符合我们实际开发的场景的。我们需要从数据库中查到真实的用户信息。 这时候就需要用到 UserDetailsService 接口,因为最后查找用户的操作是由该接口定义的,我们只需要实现该接口并实现 loadUserByUsername 方法,即可实现从数据库中查找用户信息。 ```java @Resource private SysUserService sysUserService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { SysUser user = sysUserService.getUserByUserName(username); if (user == null) { throw new RuntimeException("账号或密码错误"); } LoginUser loginUser = new LoginUser(user); return loginUser; } ``` loadUserByUsername 方法要求返回的 UserDeatils 对象是 Spring Security 的内置用户对象,我们可以通过组合的方式将查出的用户封装为 UserDeatils 对象。 ```java package com.cowz.databasedemo.entity.security; import com.cowz.databasedemo.entity.SysUser; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.util.Collection; @NoArgsConstructor @AllArgsConstructor public class LoginUser implements UserDetails { private SysUser user; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return null; } @Override public String getPassword() { return user.getPassword(); } @Override public String getUsername() { return user.getUsername(); } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } } ``` 其中 SysUser 就是我们系统中的用户对象。 ### 密码加密器 做完以上操作在进行测试时,会报一个异常 ```java java.lang.IllegalArgumentException:There is no PasswordEncoder mapped for the id "null" ``` 这是由于没有配置密码加密器所引起的,密码加密器确保我们的密码在数据库中是以密文而不是明文存储的。为此我们需要进行以下的配置 ```java @Configuration public class SpringSecurityConfig { @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } } ```
网络安全
有没有了解过网络安全问题,常见的网络攻击有哪些,原理是什么,可以怎么解决。


