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的请求。

贴一张流程图片:

javaweb安全相关的问题

核心是这两步骤

1,登录了一个安全的网站A并没有登出

2.访问了一个恶意网站B

其实恶意网站b是拿不到用户的cookie的,只是因为用户没有登出,cookie还存在,那么网站B发起一个网站A的请求是可以绕过登录等验证权限的。

解决方式

①验证码,虽有有效,但是每一个请求都要输入一个验证码也不是很合理。

②token:服务器发送给客户端一个token,客户端提交的表单中带着这个token,如果这个 token 不合法,那么服务器拒绝这个请求。

③referer识别。在HTTP Header中有一个字段Referer,它记录了HTTP请求的来源地址。如果Referer是其他网站,就有可能是CSRF攻击,则拒绝该请求。

 

相关文章: