全面的安全机制

1 SQL注入检查

   ZCMS提供了全面的应用层安全机制,对主要的威胁网站安全的问题进行了系统的处理。ZCMS基于ZCF底层框架构建,在ZCF中大部分数据库操作都是 基于ORM的,不进行SQL注入的可能。少部分非ORM的SQL语句也全部是基于QueryBuilder机制的,QueryBuilder要求所有的 SQL条件都是基于参数的,不允许直接将字符串拼接到SQL语句中,例如:

  QueryBuilder qb = new QueryBuilder("select * from ZCLog where Type=? and ID=?", ArticleContentType.TypeID, articleID);

  if (StringUtil.isNotEmpty(userName)) {

  qb.append(" and AddUser like ?", "%"+userName+"%");

  }

  if (StringUtil.isNotEmpty(startDate)) {

  qb.append(" and AddTime>=?", startDate);

  }

  if (StringUtil.isNotEmpty(endDate)) {

  qb.append(" and AddTimeaddDay(DateUtil.parse(endDate), 1));

  }

  qb.append(" order by addtime desc");

  DataTable dt = qb.executeDataTable();

  QueryBuilder是对参数化的Statement的封装,它将传入的参数作为字符串传入Statement,防止传入的参数侵入到SQL逻辑中并获得执行,从而达到防止SQL注入的目的。

2 跨站脚本检查

   XSS(跨站脚本攻击Cross Site Scripting) 攻击者提交恶意HTML代码到服务器端,如果服务器端未经检查即输出到HTML页面,则其他用户浏览该页之时,嵌入其中Web里面的html代码会被执 行,从而达到攻击者的特殊目的。XSS是常见的网站安全问题。

  ZCMS通过严格的参数检查机制,对XSS进 行了周密的防范。任何传递给服务器的HTTP请求(无论是get还是post请求),请求中的参数默认只允许字母、数字、下划线等无危害字符,不允许有单 引号和双引号等特殊字符,如果参数中有特殊字符,则ZCMS自动拦截请求并重定向到错误页面。如果页面确实需要接受含有特殊字符的参数,则相应的后台方法 需要使用 @Verify 注解作特别声明,并在方法中检查参数是否合法或进行HTML转义存储。

 

3 防止非法文件上传

  ZCMS使用了基于Flash的上传控件,在文件上传前检查了文件的扩展名,只允许扩展名在指定的扩展名列表中的文件上传到服务器。同时在服务器后台在文件保存到磁盘之前也再次检查了文件扩展名,只有扩展名被允许的文件才会写入到磁盘。

  ZCMS中所有上传的文件保存之前还会检查文件路径,只允许保存在指定的目录下,该目录一般由WEB服务器负责解析,只支持静态的.html和.shtml文件,不支持PHP/JSP等动态页面执行。

  另外,ZCMS被设计成可以在低级别操作系统权限下运行,ZCMS只需要对应用目录和发布文件所有目录(通常是wwwroot)拥有读写权限即可正常运行。ZCMS建议运行在非root用户下。

  通过以上措施,ZCMS很好地防止非法上传程序到服务器,防止服务器被安装WebShell或被挂马。

4 防止越权访问

  除了防止未登录用户通过SQL注入、XSS、非法上传文件等方式破坏系统外,ZCMS还对合法登录用户的行为进行了严格的权限检查,以防止低权限用户非法越权进行高权限操作。

  ZCMS对所有的页面都加入了权限声明,例如:

  "Platform.Branch" />

  此语句限制了当前页面只有拥有 Platorm.Branch 权限项(即机构管理权限项)的己登录用户才能访问,如果未登录或者未拥有 Platform.Branch 权限项,则直接重定向权限不足页面,后续页面逻辑将不会执行。

  ZCMS不仅支持页面级别的权限检查,还支持对页面中的按钮、控件、显示区域进行细粒度的权限检查,可以方便、灵活地为不同的按钮赋予不同的权限项,只有当前用户的权限项满足按钮要求的权限项时,该按钮才对用户可见或可用。

ZCMS还对所有的后台方法进行了权限检查,后台方法被调用时,ZCF框架会检查该方法的 @Priv 注解,如果当前用户不满足 @Priv 注解中要求的权限,则该方法中的程序逻辑不会被执行,并会提示用户权限不足。