1.sql注入
用户通过输入恶意代码段作为参数传输到服务器,在服务器后端这个代码段会作为参数拼接成一条sql,从而造成安全问题。
例如,在登录表单,用户名填写:zhangsan,密码填写: ' ' or '1' = '1'
这样子,当参数传到服务器,拼接成的sql就成了
select * from user where username ="zhangsan" and password =" ' ' or '1' = '1' " ,这样子,就会绕过了登录的判断。
解决方法:
①在前端对参数进行长度限制,合法性判断
②使用预编译PrepareStatement,在mybatis中使用#{}作为传参,不要使用${},后者不会进行预编译。
③过滤sql参数中的特殊符号
为什么预编译可以解决这个问题?
因为,sql经过预编译之后,sql并不是用参数简单地拼接而成,而是把参数的位置先用一个占位符替代,然后处理参数(在参数两端加上引号,把参数当做一个整体,然后过滤掉一些特殊字符),然后再把参数替换掉占位符。
就像上边的sql,经过预编译之后,会变成这样
select * from user where username ="zhangsan" and password =" ' 'or'1'= '1' "
这样子,就会去查找 ' 'or'1'='1' 等于这个字符串的密码
2.文件上传
用户上传一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力。
解决方式:
①限制文件上传的大小
②判断文件类型,不能简单地根据后缀名去判断,还要根据MIME Type去判断
③上路的路径目录设置成不可执行的权限
④文件类型的白名单,只允许上传可靠类型的文件。
3.xss:跨域脚本攻击。
恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。例如,用户在浏览一个页面的时候,加载了一张图片<IMG SRC=http://3w.org/XSS/xss.js/> 这个时候,在加载图片的时候就会执行一段js代码,从而造成安全问题。
解决方法:
①对输入字符串进行长度限制
②对HTML转义处理,将其中的”<”,”>”等特殊字符进行转义编码。
4.csrf:跨站请求伪造。
在客户登录了一个安全的网站A生成本地cookie之后,没有登出,然后访问到一个恶意网站,从而被恶意网站拿到cookie等信息发起一个向安全网站a的请求。
贴一张流程图片:
核心是这两步骤
1,登录了一个安全的网站A并没有登出
2.访问了一个恶意网站B
其实恶意网站b是拿不到用户的cookie的,只是因为用户没有登出,cookie还存在,那么网站B发起一个网站A的请求是可以绕过登录等验证权限的。
解决方式
①验证码,虽有有效,但是每一个请求都要输入一个验证码也不是很合理。
②token:服务器发送给客户端一个token,客户端提交的表单中带着这个token,如果这个 token 不合法,那么服务器拒绝这个请求。
③referer识别。在HTTP Header中有一个字段Referer,它记录了HTTP请求的来源地址。如果Referer是其他网站,就有可能是CSRF攻击,则拒绝该请求。