概述:当我们使用jquery在页面渲染数据时,可能会用到以下几个方法:$('xxx').html();$('xxx').text();$('xxx').append();其中有可能发生XXS注入。
示例:用户提交的内容为<script>alert("被Kyle注入");</script>这时如果你用text()方法渲染那自然没有问题, 但是如果你用html()和append()去渲染就会被注入,不相信自己可以去试下.
危害:
1.轻危就弹你一个提示窗口
2.可以获取到当前登录用户的所有cookie信息及登录后的所有信息
3.可以暗地操作当前登录用户的相关操作等
解决方法:
1.渲染时我们尽量用text()方法渲染
2.如果一定需要用html()和append()渲染用户提交的相关数据,那么我就必需用到相关过滤的方法处理
3.jsp页面里面的渲染可以使用自定义方法进行相关过滤处理
2.SQL注入
概述:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力。
示例:如果判断Web环境是否可以SQL注入。如果URL仅是对网页的访问,不存在SQL注入问题,如:http://*.xxxx.com就是普通的网页访问。只有对数据库进行动态查询的业务才可能存在SQL注入, 如:http:// *.xxxx.com /xxxx?val=,其中val=1表示数据库查询变量,这种语句会在数据库中执行,因此可能会给数据库带来威胁。 String sql = "select * from where id = ?",如果id的值是1 or 1=1;或者1";"delete .....
危害:
1.未经授权状况下操作数据库中的数据
2.恶意篡改网页内容
3.私自添加系统帐号或者是数据库使用者帐号
4.网页挂木马
解决方法:
1.java用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setxxx方法传值即可
String sql= "select* from users where username = ? and password=?;
PreparedStatement preState= conn.prepareStatement(sql);
preState.setString(1, userName);
preState.setString(2, password);
ResultSet rs= preState.executeQuery();
2.后台过滤,简单的验证数据格式/长度正确,过滤/转义各种特殊符号;包含有 单引号('),分号(;) 双引号(")和 注释符号(--)等
3.前台过滤,对于必要的input输入信息进行格式验证;尤其有对于用户名、密码之类的页面最好设置验证码(防止猜测的注入,减轻服务器压力)
3.传输/存储加密
概述:数据的重要性大家应该都清楚,由其用户的隐私数据安全问题越来越受到重视(如:CSDN事件),所以我们需要对自己的关键数据进行有效的保护.
危害:
1.泄漏用户隐私数据
2.泄漏服务器的相关重要信息.如:数据库用户名和密码等
3.重要数据在通信中被篡改
解决方法:
1.合理设置每个接口,查询出来的数据过滤掉用户的相关隐私数据
2.重要的通信传输应该进行加密处理,比如通过https
3.数据库字段存储,重要信息字段应当加密存储。
4.程序中连接数据库的密码不能保存为明文,需要进行加密处理防止被泄露,合理分配数据库用户权限(越细越安全)
5.数据库服务器设置IP访问限制.(跟运维或者DBA进行是否已设置)
6.用户的重要信息都不应该出现在日志当中,密码等重要信息不管是否加密都不应该出现在日志出中。
4.权限验证
概述:就是为了控制权限的,每种角色都有自己特定的与公共的权限,这些权限的逻辑关系是相当复杂的,如果一个Web应用在角色上没有一个详细的合理的设计, 将会给开发人员带来无限接下来的痛苦和麻烦。
示例:某网站用户有这些角色:其一可以说是游客,就是浏览者没有登录的角色;其二就是注册用户;其三就是VIP用户;根据业务扩展,可能还会出现更多用户角色
危害:
1.导致A用户可以篡改B用户的相关数据
2.可以操作自己没有权限的相关请求
3.不需要登录就可以任意操作相关请求
解决方法:
1.合理验证每个用户的权限
2.即使是登录用户在执行相关重要操作时必需要再次验证。如:添加,删除相关操作
3.付费等相关重要操作,都要通过远程验证方法验证等
4.服务器对请求方需要永远保持不信任原则,都需要进行相关的验证