首页 > web安全浅析

web安全浅析

就之前本人主持开发的金融产品所遇到的安全问题,设计部分请参见:http://www.cnblogs.com/shenliang123/p/3835072.html

这里就部分web安全防护就简单的交流:

1.1系统安全

1.1.1  客户端脚本安全

(1)跨站脚本攻击(XSS):

       XSS攻击,通常指黑客通过“html注入” 篡改了网页,插入了恶意的脚本,从而在用户浏览网页的时候,控制用户浏览器的一种攻击。

       最常见的XSS攻击就是通过读取浏览器的Cookie对象,从而发起“cookie劫持”,当前用户的登录凭证存储于服务器的session中,而在浏览器中是以cookie的形式进行存储的,cookie被劫持后,意味着攻击者可以不通过密码而直接登录系统。我们也可以直接在浏览器中输入脚本javascript:alert(document.cookie)来获取当前cookie值。

       目前防止“cookie劫持”的方法大致有:a. 输入检查,使用filter来过滤敏感的关键字;b. 将cookie与用户ip地址进行绑定;c. 为cookie植入HttpOnly标识。

   本系统采用的是第3种方式:为cookie植入HttpOnly标识。一旦这个HttpOnly被设置,你在浏览器的 document对象中就看不到Cookie了,而浏览器在浏览的时候不受任何影响,因为Cookie会被放在浏览器头中发送出去(包括ajax的时 候),应用程序也一般不会在js里操作这些敏感Cookie的,对于一些敏感的Cookie我们采用HttpOnly,对于一些需要在应用程序中用js操作的cookie我们就不予设置,这样就保障了Cookie信息的安全也保证了应用。

具体代码实现:在web服务器tomcat的配置文件server.xml中添加:

或者在项目的web.xml 配置如下:

复制代码
  true 
复制代码

 

图1-1 浏览器cookie截图

(2)跨站点请求伪造(CSRF):

       本系统采用了对抗CSRF最有效的防御方法:验证码。

1.1.2 服务器端应用安全

服务器端的安全相对于客户端来说显的更加的重要,因为服务器端的某个安全漏洞可能带来的是致命的危险。因此我们对服务器端的安全更为的慎重和重视。

(1)SQL注入攻击:

Sql注入的的两个关键条件:第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。

根据上面两个关键条件,系统为防止sql注入使用了以下方法:

第一:使用预编译语句,这也是防御sql注入最有效的方法,完全摒弃代码的直接拼接所带来的危险。

复制代码
public List findByPage(final String hql, final Object[] values, final int offset,final int pageSize) {List list = getHibernateTemplate().executeFind(new HibernateCallback(){public Object doInHibernate(Session session)throws HibernateException, SQLException{Query query=session.createQuery(hql);for (int i = 0 ; i < values.length ; i++){query.setParameter( i, values[i]);}if(!(offset==0 && pageSize==0)){query.setFirstResult(offset).setMaxResults(pageSize);}List result = query.list();return result;}});return list;}      
复制代码

第二:关闭web服务器的错误回显功能,这样可以防止攻击者对系统进行攻击后,通过回显的详细错误信息对攻击内容进行调整,对攻击者提供极大的便利。我们在项目的web.xml文件中添加以下示例代码:

复制代码
  400/error400.jsp
复制代码

第三:数据库自身使用最小权限原则,系统程序不使用最高权限的root对数据库进行连接,而是使用能满足系统需求的最小权限账户进行数据库连接,而且多个数据库之间使用不同的账户,保证每个数据库都有独立对应的账户。

(2)文件上传漏洞:

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过脚本文件获得了执行服务器端命令的能力,这样将会导致严重的后果。而本系统内涉及到大量的图片格式文件上传,因此对于上传问题的处理非常谨慎,并尽可能的达到安全标准。

本系统主要通过对上传文件详细的格式验证:

第一步:通过后缀名来简单判断文件的格式。

复制代码
public static boolean isPicture(String pInput) throws Exception{// 获得文件后缀名String tmpName = pInput.substring(pInput.lastIndexOf(".") + 1,pInput.length());// 声明图片后缀名数组String imgeArray [] = { "jpg", "png", "jpeg" };// 遍历名称数组for(int i = 0; i 
复制代码

第二步:通过读取文件的前两个字符进行对比,例如png格式图片的前两个字符为8950,而jpg格式的图片前两个字符为ffd8。

复制代码
public static String bytesToHexString(byte[] src) {StringBuilder stringBuilder = new StringBuilder();if (src == null || src.length <= 0) {return null;}for (int i = 0; i < src.length; i++) {int v = src[i] & 0xFF;//byte to intString hv = Integer.toHexString(v);if (hv.length() < 2) {stringBuilder.append(0);}stringBuilder.append(hv);}return stringBuilder.toString();}  
复制代码

第三步:如果上传的为图片,则获取相应的高度和宽度,如果存在相应的宽度和高度则可认为上传的是图片。

复制代码
public static boolean isImage(File imageFile) {if (!imageFile.exists()) {return false;}Image img = null;try {img = ImageIO.read(imageFile);if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) {return false;}return true;} catch (Exception e) {return false;} finally {img = null;}}
复制代码

 

如果以上验证都成功通过,本系统在对文件进行存储时会将文件名进行重命名处理,并且设置相应的web服务器,默认不显示目录。因为文件上传如果需要执行代码,则需要用户能够访问到这个文件,因此使用随机数改写了文件名,将极大的增加攻击的成本,甚至根本无法成功实施攻击。

//对文件的名称进行重命名StringBuilder sb = new StringBuilder().append(new Date().getTime()).append(".").append(fileMsg[1]);

(3)认证与会话管理:

  认证实际上就是一个验证凭证的过程,因此我们对登录密码有着严格的规定:密码要求长度在8位以上并且包含字母,数字,符号两种以上的组合。并将密码加密后再进行数据库的存储。为防止一些暴力破解手段,又出于用户体验的考虑,本系统采用用户登录时默认不进行验证码的输入,但密码三次输入失败后需要进行验证码的输入,连续五次输入错误后,该用户的ip地址将被封,可以在一段时间后自动解封或者后台管理员手动解封。涉及到系统资金有关的操作,例如投标,我们还需要用户设置并提供支付密码,而提现等操作我们还配备短信验证码功能。以此来增强验证的可靠性。

  当用户登录完成后,在服务器端会创建一个新的会话(Session),会话中保存着用户的状态和相关信息,服务器端维护所有在线用户的Session,而浏览器则是将SessionId加密后保存在cookie中,这里就出现了前面提到了“cookie劫持“问题,本系统通过将cookie中植入HttpOnly成功解决该问题。本系统还给Session设置了一个有效时间,来保证在有效时间后Session将自动销毁,以防止Session长连接所带来的安全隐患。在web.xml文件中添加以下代码:

30

(4)访问控制:

访问控制实际上就是建立用户和权限之间的对应关系,本系统采用的是“基于角色的访问控制”,根据相应功能模块的划分相应的权限,并将相应的权限分配给不同的角色,再将角色分配给用户,用户就拥有了该角色所持有的权限。具体的设计与实现分析请见1.2 Annotation和Struts2拦截器实现基于角色的垂直权限管理。

1.2 Annotation和Struts2拦截器实现基于角色的垂直权限管理

1.2.1 模块的设计

以下是本系统的垂直权限管理模块的物理模型设计:

 

图1-2 权限管理模块物理模型

管理员与角色之间是多对多的关系,这样可以实现为一个管理员分配多个角色进行管理,而角色与权限之间也是多对多的关系,权限是根据功能模块进行划分的,使得角色可以进行细粒度的权限分配。

4.3.2 模块的代码实现

首先声明一个注解类,该注解类是自定义的,根据我们需要的实现的功能进行相应注解的定义,使得在之后需要注释的方法上使用相应注解,代码如下:

复制代码
@Retention(RetentionPolicy.RUNTIME)           //注解的存活时间,整个运行时都存活 @Target(ElementType.METHOD)               //此注解表示只能在方法上面有效 public @interface Permission { /** 模块名 **/ String model(); /** 权限值 **/ String privilegeValue();/*用于区分当前页面是dialog还是navTab*/String targetType();}然后定义相应的拦截器类,并在struts2的配置文件struts.xml中进行拦截器的配置,为相应需要的类进行拦截验证,定义拦截器部分的核心代码如下:/*** 校验控制在方法上的拦截*/@SuppressWarnings("unchecked")public boolean validate(Admin admin, ActionInvocation invocation, List roleList,Map session) {String methodName= "execute";                                  //定义默认的访问方法Method currentMethod = null;methodName = invocation.getProxy().getMethod();                //通过actionProxy,得到当前正在执行的方法名try {//利用反射,通过方法名称得到具体的方法currentMethod = invocation.getProxy().getAction().getClass().getMethod(methodName, new Class[] {});} catch (Exception e) {e.printStackTrace();}if (currentMethod != null && currentMethod.isAnnotationPresent(Permission.class)) {//得到方法上的Permission注解Permission permission = currentMethod.getAnnotation(Permission.class);//通过Permission注解构造出系统权限Systemprivilege privilege = new Systemprivilege(new SystemprivilegeId(permission.privilegeValue(), permission.model()));session.put("targetType", permission.targetType());//迭代用户所具有的具体权限,如果包含,返回truefor (Role role : roleList) {                 RolePrivilege rolePrivilege = new RolePrivilege(privilege, role);if (role.getRolePrivileges().contains(rolePrivilege)) {return true;}}return false;}return true;}
复制代码

本系统需要向权限表中添加相应的功能模块,为了有一个比较细的粒度,模块将根据功能进行划分,而权限则根据按钮来进行细分:

 

图1-3 数据库截图

在定义了相应的权限后,我们需要在相应的执行方法体上面进行注释,使得拦截器进行拦截验证时能根据注释获取该执行方法体的模块和权限类型:

@Permission(model="recharge", privilegeValue="recharge" ,targetType="dialog")

4.3.3 模块的实现效果

首先添加相应的员工:

 

然后新增相应的角色,填写角色名称并勾取相应的权限:

 

然后新增相应的用户,勾选该用户相应的角色,可以选择多个角色,并且选择相应用户对应的员工:

 

相关文件主要来自网络和个人编程。支持转载

转载于:https://www.cnblogs.com/GmrBrian/p/6241945.html

更多相关:

  •     注意,前情提示: 本代码基于《Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)》 传送门Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)_你挚爱的强哥❤给你发来1条消息❤-CSDN博客   在/api/demo/文件夹下面创建CURD.js...

  • 第一:在map端产生join mapJoin的主要意思就是,当链接的两个表是一个比较小的表和一个特别大的表的时候,我们把比较小的table直接放到内存中去,然后再对比较大的表格进行map操作。join就发生在map操作的时候,每当扫描一个大的table中的数据,就要去去查看小表的数据,哪条与之相符,继而进行连接。这里的join并不会涉...

  • ** 0x01 原理分析 ** 还是很早之前爆出来的漏洞,现在拿出来学习一下,参考阿里巴巴:https://security.alibaba.com/... 漏洞发生在/inc/common.inc.php页面中。首先看这个函数: 首先使用ini_get来获取php.ini中变量'register_globals'的值,而r...

  • 一、活动目录灾备简介  本次演练我们将讨论如何让域控制器从灾难状态(例如由于硬件或软件故障引起的数据库故障)进行恢复的步骤。此类灾难通常会导致域控制器失效,而且会使计算机无法正常引导;将只提供对运行 Active Directory 的域控制器(不运行其它服务)进行恢复的信息。如果该计算机上还安装有其它服务,例如域名系统 (DNS)...

  • setuid 和 setgid (全称分别是:set user ID upon execution 和 set group ID upon execution)是Unix的访问权限标志位,它允许 用户以可执行文件owner或group的权限来运行这个可执行文件。它们经常适用于:为了运行特定的任务,可以允许用户暂时的提高权限。用处: 暂...

  • 1. 权限管理命令:chmod 命令名称:chmod命令英文原意:change the permissions mode of a file命令所在路径:/bin/chmod执行权限:所有用户语法: chmod [{ugoa} {+-=} {rwx}] [文件或目录] [mode=421] [文件或目录]功能描述:改变文件或目录权限...

  • 权限系统通常包括如下基本元素:用户、角色、权限、资源、操作。 角色分类:总经理、部长、员工。(在实际中一个用户可能存在多个角色,这就要考虑到权限累加处理) 权限分类:如”员工考勤权限”、”审核权限”等等。 在给角色分配权限过程中,可以批量分配权限,也可以单一处理,比如网站首页,这就应该开放给所有角色,而审核考勤就只能给部分角色有开放...

  • 创建用户create user –概述:在oracle中要创建一个新的用户使用 create user 语句,一般是具有dba(数据库管理员)的权限才能使用。 –基本语法:create user 用户名 identified by 密码 create user dbuser1 identified by dbuser1;   用户赋权...

  • 本节讲解一下Windows下SVN权限配置说明,针对的是一个目录下多库的情况,下面是具体的介绍,希望通过本文的学习,你能够对SVN权限配置问题有更加深刻的认识。 1、本文档适用于对Subvesion的自带服务svnserve进行权限配置,全部在authz文件中完成。 2、如果要对含有中文的目录或文件进行管理或分配时,需要将该文件保存为...

  •   同学们大家好,我是小伊同学,上一节我们介绍了一些常用API,今天我们接着来学习一组API,那就是获取用户身份信息的API。  在微信小程序中,我们往往需要获取用户的身份信息,比如昵称、头像、性别、地区等。要得到这些信息,就需要我们调用获取用户信息的api了。在小程序中,微信非常重视对用户隐私的保护,因此有很多关于获取用户信息的...

  • UTRAN接口的通用协议模型如下图: 通俗地讲,通讯网络由终端(terminal)、连接(links)、网络节点(nodes)组成, links将nodes 关联起来。源终端(MO)发送的消息是怎样才能到目的终端(MT)呢? 消息经过links 和nodes,直至到达MT,其中关键是nodes怎么路由(route)消息到最终...

  •        Linux是一个多用户的操作系统,用户要使用该系统,首先必须登录系统,使用完系统后,必须退出系统。用户登录系统时,为了使系统能够识别自己,必须输入用户名和密码,经系统验证无误后方能进入系统。在系统安装过程中可以创建两种帐号:        1、root--超级用户帐号,使用这个帐号可以在系统中做任何事情。      ...

  • 1.用户基本概述 1.1.什么是用户? 用户指的是能够正常登录Linux或Windows系统(可以理解为你租了房⼦,能够正常入驻) F:那Linux与Windows系统的用户有什么区别? Q:本质都是登陆系统,只不过Linux⽀持多个用户 同时登陆。 F:难道Windows就不算多用户操作系统吗? Q:其实不是,在Windows...

  • 背景信息 用户通过Telnet登录设备时,设备上必须配置验证方式,否则用户无法成功登录设备。设备支持不认证、密码认证和AAA认证三种用户界面的验证方式,其中AAA认证方式安全性最高。 采用AAA本地认证方式实现用户通过Telnet登录设备的身份认证,设备上需要开启Telnet服务,将用户界面(以VTY用户界面为例)的验证方式设...