Web系统安全常见问题及处理方案(SQL注入、XSS、CSRF、固定session攻击、暴力破解密码等)

主要记录以下常见问题及处理方案
SQL注入、XSS、权限控制、Cookie记录敏感信息、CSRF、固定session攻击、服务器响应中返回关键信息、全局异常拦截、暴力破解密码、单一用户登录

SQL注入

目的: 防止SQL注入攻击
SQL注入式攻击定义:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
防护方法:消除系统中动态SQL拼接方式,使用参数化的sql进行数据查询存取

实例:
HQL拼接:

修改后:

XSS跨站点脚本攻击

目的: 防止XSS(跨站脚本攻击)
XSS(跨站脚本攻击)定义: XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。

防护方法: 新增拦截器,对所有的输入、输出进行编码过滤,该拦截器需实现如下功能:
1.对所有用户的输入进行HTML编码,防止XSS攻击脚本存储到服务器中。
2.对所有服务端的输出进行HTML编码,防止已存在的XSS攻击脚本继续扩大影响。
例:编码前:<script>alert('xss');</script> 编码后:&lt;script&gt;alert('xss');&lt;/script&gt;

权限控制

目的: 防止用户越权访问资源
越权访问
系统中现有的权限控制只能做到: 匹配用户权限,显示权限应有的功能菜单。而对于用户直接通过URL访问的情况没有加以权限认证。
防护方法:
1.新增资源表(ITM_SYS_RESOURCE),将系统中所有的jsp和action请求视作资源保存到资源表中
2.新建资源与角色对应表(ITM_SYS_ROLE_RESOURCE),关联角色可操作的资源
3.新建资源权限过滤器,该过滤器需要实现功能如下:
a.获取用户请求资源的路径,查询资源表中是否存在该路径,如不存在表示该资源不受权限所制约,可供用户访问;
b.如资源表中存在,则级联查询资源与角色关联表(ITM_SYS_ROLE_RESOURCE)和角色与用户关联表(SYS_USERROLE),查询用户是否拥有使用该资源的权限;
c.如用户没有使用该资源的权限,则提示用户无权限;提示方法如下
Ⅰ.对应ajax请求抛出异常(需要与其他异常区分开),页面执行统一ajaxError事件,如异常为无权限异常,则提示用户没有权限
Ⅱ.其他请求统一跳转至“无操作权限”页面

Cookie记录敏感信息

目的:Cookie不能明文记录敏感信息,如用户登陆信息
Cookie明文记录敏感信息:在登陆系统时,选择“记住用户名和密码”后,客户端会明文记录用户的登陆信息。
防护方法:
1.在系统中,所有需要将信息(用户名,密码,记住用户,cookie过期时间)保存到cookie时,先将需要保存到cookie的信息使用对称加密后,将密文保存到cookie中;
2.在需要使用cookie中的信息时,先由服务端将密文解密后使用;

CSRF跨站点请求伪造

目的: 防止CSRF(跨站点请求伪造)
CSRF(跨站点请求伪造)定义:攻击者盗用了用户的身份,以用户的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以用户的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
防护方法:验证 HTTP Referer 字段,根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。
验证步骤:
1.新建过滤器,过滤器拦截所有请求路径;
2.过滤器中,对不需要身份认证的路径不做Referer验证,不需要验证的路径有:"login.action", "login.jsp", "logintop.jsp", "activationAccount.action"
3.对于需要验证Referer请求头的路径,在请求头中取出Referer字段;、
4.如Referer字段的值是以网站域名开头,则是合法请求,否则重定向到登陆页面

固定session攻击

目的:防止固定session攻击
Session Fixation(固定session攻击)定义:在计算机网络安全性中,会话固定攻击试图利用允许一个人固定(查找或设置)另一个人的会话标识符的系统的漏洞。大多数会话固定攻击都是基于Web的,并且大多数依赖于从URL(查询字符串)或POST数据接受的会话标识符。
防护方法:
1.系统需要在登陆时,为登陆成功的用户注销登陆前的session,并重新创建登陆后的session
2.设置httponly属性,在tomcat配置文件 conf/context.xml里面加上httpOnly属性设置<Context useHttpOnly="true"> ... </Context>

服务器响应中返回关键信息

目的:防止泄露用户登陆凭证
服务器响应中包含用户凭证的功能点:目前系统中,用户登陆时选择记住登陆信息后,当用户再次进入登陆页面时,服务器会读取cookie中的用户登陆凭证,通过JS回显到登陆输入框中。
防护方法:

1.对记住登陆信息的用户,回显到登陆输入框时,密码不回显真实的密码
2.在用户提交登陆信息后,进行两步验证登陆信息,
a.读取cookie,如cookie中能读取用户登陆信息,则使用cookie中的信息进行登陆验证
b.如cookie中没有用户登陆信息,则使用用户在登陆输入框中提交的信息进行登陆验证

全局异常拦截

目的: 如发生系统错误,显示友好的错误界面给用户。
防护方法:
1.新增错误界面
2.在struts配置文件中,定义全局异常映射

网络安全G1

目的: 防止暴力破解密码一
防止暴力破解密码定义: 穷举法是一种针对于密码的破译方法。这种方法很像数学上的“完全归纳法”并在密码破译方面得到了广泛的应用。简单来说就是将密码进行逐个推算直到找出真正的密码为止。比如一个四位并且全部由数字组成其密码共有10000种组合,也就是说最多我们会尝试9999次才能找到真正的密码。利用这种方法我们可以运用计算机来进行逐个推算,也就是说用我们破解任何一个密码也都只是一个时间问题。
防护方法:
1.设置密码长度,对密码长度进行最短和最长长度的控制(最小长度为8,最大长度为18);
2.对设置的密码要求密码包含字母、数字以及特殊的字符
3.设置密码的有效期,在规定的时间内提示用户强制性的修改密码
4.找回密码的时候用户发送邮件到用户邮箱,用户输入邮箱验证码即可找回,找回后的密码下一次登录的时候强制用户修改密码.
5.修改后的密码必须符合修改规则

网络安全G2

目的:防止暴力破解密码二
防止暴力破解密码定义:穷举法是一种针对于密码的破译方法。这种方法很像数学上的“完全归纳法”并在密码破译方面得到了广泛的应用。简单来说就是将密码进行逐个推算直到找出真正的密码为止。比如一个四位并且全部由数字组成其密码共有10000种组合,也就是说最多我们会尝试9999次才能找到真正的密码。利用这种方法我们可以运用计算机来进行逐个推算,也就是说用我们破解任何一个密码也都只是一个时间问题。
防护方法:
1.当用户密码错误时,提示用户已错误次数和总允许的错误次数
2.当用户错误次数达到总允许的错误次数时,锁定该账户24小时,提示用户“账号已锁定,请在xxx时间后重试!”
3.当用户在锁定时间过后重试时,清空锁定时间,重置错误次数信息
4.如用户在允许最多次数中登陆成功,则重置用户已错误次数

网络安全G3

目的:防止暴力破解密码三
防止暴力破解密码定义:穷举法是一种针对于密码的破译方法。这种方法很像数学上的“完全归纳法”并在密码破译方面得到了广泛的应用。简单来说就是将密码进行逐个推算直到找出真正的密码为止。比如一个四位并且全部由数字组成其密码共有10000种组合,也就是说最多我们会尝试9999次才能找到真正的密码。利用这种方法我们可以运用计算机来进行逐个推算,也就是说用我们破解任何一个密码也都只是一个时间问题。
防护方法:1.用户首次登录时候,校验用户输入密码信息,如果密码不符合校验规则,则强制要求修改密码

网络安全G6

目的:单一用户登录
单一用户登录定义:对于一个账号在同一时间只能一个人登录。

防护方法:在处理登录的login方法中,先查询数据库验证下该用户是否存在,如果存在判断该用户账户是否已经锁定了,然后从application内置作用域对象中取出所有的登录信息,查看username账户是否已经登录,如果登录了就友好提示下,反之表示可以登录,将改登录信息以键值对的方式保存在application中。

posted @ 2023-06-19 10:32  未来的羁绊  阅读(522)  评论(0编辑  收藏  举报