问题
- 使用api网关过滤器对防止xss、sql注入问题
<script>alert(‘ss’)</script> or 1=1
对我们的接口实现对称加密,抓包的时候看不到明文的数据,但是可以被破解,因为客户端与服务器都是采用同一个密钥实现加解密,可以通过反编译客户端代码得出密钥实现破解。 Des、aes
使用非对称加密RSA 公钥和私钥互换机制,客户端使用公钥实现加密,服务器端采用私钥实现解密,就算黑客破解出公钥也无法对数据实现解密。
一对密钥 两个密钥 公钥 和私
对称加解密速度比rsa要快,但是不安全。
- 可以采用MD5对我们的参数实现验证签名,但是数据还是传输明文,可以防止
篡改数据。
互联网电商项目都会采用Https协议 ssl+证书 加密传输 默认443 而我们的Http协议采用明文实现对数据传输,效率比较Https要高,但是不安全。
对我们的api接口实现黑名单和白名单控制
对我们接口实现服务保护、限流、熔断
使用图形验证码防止机器模拟请求
对我们代码使用专门扫描工具实现检测漏洞
在rpc传递参数过程中使用令牌隐藏真实的参数。
数据库表权限框架设计
如何防御xss攻击
xss脚本攻击:提交的参数带入js脚本,转发到页面执行
http://127.0.0.1:8080/getUserInfo?userName=<script type="text/javascript">
window.location.href="http://www.mayikt.com";
</script>
用户提交<script>的时候进行转义
过滤器转义
@Component
@WebFilter
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 xssHttpServletRequestWrapper = new XssHttpServletRequestWrapper((HttpServletRequest) request);
chain.doFilter(xssHttpServletRequestWrapper, response);
}
@Override
public void destroy() {
}
}
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
private HttpServletRequest request;
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
String oldValue = super.getParameter(name);
if(StringUtils.isEmpty(oldValue)){
return oldValue;
}
String newValue = StringEscapeUtils.escapeHtml4(oldValue);
return newValue;
}
}
如何防止抓包篡改数据
可以使用第三方抓包工具,对请求前后实现代理,可以修改参数请求内容和参数响应内容。
请求的时候加上md5签名,请求数据+加盐 加密,后端也加密,看看有没有变化
加密
对称加密
加密和解密都是同一个秘钥
优势:算法公开、加密快、效率高。
缺点:可以采用反编译破解客户端真实秘钥
常用对称加密框架:
1.DES****(Data Encryption Standard****)
2.3DES****(DES****加强版,使用3****次DES****计算,Triple DES****,DESede****)
3.AES****(Advanced Encryption Standard****,3DES****加强版)
加密与解密都是采用同一个秘钥,也就是客户端与服务器数据传输采用同一个秘钥实现
加解密,所以如果黑客反编译了客户端源代码就可以破解该密文。
对称加密算法: des、aes
非对称加密
公钥和私钥互换,生成一对秘钥对,分别为公钥和私钥。
公钥加密,必须私钥解密
私钥加密,必须公钥解密
所以在很多支付接口中为了保证安全性,客户端采用公钥加密,服务器端采用私钥解密,就算别人客户端的公钥,也无法解密,因为解密数据必须要私钥,而私钥存放在服务器端。
最为著名的就是RSA
UrlEncode编码/UrlDecode解码
https://tool.chinaz.com/tools/urlencode.aspx
在Http协议通讯过程中,如果传递特殊字符的情况下,比如:+!等特殊字符统一会变为空格。
所以注意需要对url参数实现UrlEncode
https://baike.baidu.com/item/urlencode/8317412?fr=aladdin
Java后端Api实现 UrlEncode与UrlDecode、
String encode = URLEncoder.encode("mayi+kt", "UTF-8");
System.out.println(encode);
String decode = URLDecoder.decode(encode, "UTF-8");
System.out.println(decode);