开发安全规约

  •  所有可以通过web端访问到的页面, 都需要考虑是否加上权限控制. 包括各类service & action.
1         long userID = ServiceUtils.getCurrentUserID(req);
2         if (!UserControl.getInstance().hasModulePrivilege(userID, FSConstants.MODULEID.SERVERCONFIG)) {
3             throw new NoPrivilegeException();
4         }
  • 禁止输出工程文件绝对路径到前台, 隐藏在js中的也不行, 会被扫描出来.
  • 界面中涉及到文件上传的部分, 需要对上传的文件做大小以及二进制头限制, 防止木马图片之类.
 1     /**
 2      * 校验二进制头,判断是否真的是图片。 判断图片大小,是否大于MAX_IMAGE_SIZE:20M
 3      *
 4      * @param file
 5      * @return
 6      * @throws FileNotFoundException
 7      */
 8     private boolean isValidImage(File file) throws IOException {
 9         if (file.length() > MAX_IMAGE_SIZE) {
10             return false;
11         }
12 
13         InputStream inputStream = new FileInputStream(file);
14         ImageInfo imageInfo = new ImageInfo();
15         imageInfo.setInput(inputStream);
16         boolean result = imageInfo.check();
17         inputStream.close();
18         return result;
19     }
  • 密码相关的字段密文存储与传输, 采用AES256、SHA128等加密算法. 手机号之类前端需要展示成123****789.
1 CodeUtils.sha256Encode(syncUser.getPassword())
  • 禁止使用代码拼接sql, 推荐使用参数化查询.
1 "INSERT INTO guests ( firstName, lastName, email ) VALUES ( ?, ?, ? )"
2 preparedStatement.setString( 1, "xx");
3 preparedStatement.setString( 2, "xx");
4 preparedStatement.setString( 3, "xx@xx"); 
  • 对于文件读取的请求, 限制读取范围(关联页面session, 读取特定文件 或者限制只能读取WebReport里指定文件夹).
  • 对于前端用户输入进行正则校验, 防止xss脚本攻击. 使用FR.html($xx, title)替代$xx.html()
 1 // 错误              
 2 $("#popup_title").html(title);
 3 // 正确
 4 FR.html($("#popup_title"), title);
 5 
 6 
 7         /**
 8          * 使用jquery的html()之前先将content进行去脚本处理
 9          * @param {ob} jquery对象。
10          * @param {value} 渲染的内容。
11          */
12         FR.html: function (ob, content) {
13             function transferStr (str){
14                 return str.replace(/ /gi, "&nbsp;").replace(/<script>/gi, '&lt;script&gt;').replace(/<\/script>/gi, '&lt;\/script&gt;');
15             }
16             ob.html(transferStr(content));
17             return ob;
18         }
  • 对于前端直接输出的文本, 使用StableUtils.replaceScript4Xss(op)去除脚本
1         PrintWriter writer = WebUtils.createPrintWriter(res);
2         writer.println("Unresolvable Operation:" + StableUtils.replaceScript4Xss(op) + "  in class ReportDispatcher");
  • 避免使用cookie明文存储用户敏感信息, 网站可能会设置httponly, 禁止js读取cookie. 部分数据可以存储到localstorage.
1 window.localStorage.setItem('fr_token', getTokenFromUrl(signResult.url));
  • 对于系统敏感操作, 需要校验token, 止csrf攻击.
 1     /**
 2      * 校验jwt
 3      *
 4      * @param req 请求
 5      * @return 校验结果
 6      */
 7     public static boolean checkJWT(HttpServletRequest req, HttpServletResponse res) throws Exception {
 8         PrivilegeVote vote = JwtUtils.checkJWT(req) ? PrivilegeVoteImpls.SUCCESS : FSPrivilegeVote.FS_AUTH_ERROR;
 9         boolean isPermitted = vote.isPermitted();
10         if (!isPermitted) {
11             vote.action(req, res);
12         }
13         return isPermitted;
14     }
  • 调用系统Command执行命令时, 需要打印相关命令.
1             if (FRLogger.getLogger().isLoggable(Level.CONFIG)) {
2                 FRLogger.getLogger().info(Inter.getLocText("FR-Base_Get_Machine_Info_Prompt", StringUtils.join(StringUtils.BLANK, command)));
3             }
4             process = Runtime.getRuntime().exec(command);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阿杜的世界

Spring的容器内部事件发布自定义事件机制Spring 的容器内事件发布类结构应用场景

EventListener接口的作用仅仅在于“标记”,具体要提供哪些功能需要开发者自己定义,而且,还需要为自己定义的接口提供一个默认的实现类——只有接口的话什么...

1022
来自专栏DannyHoo的专栏

XML解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

1582
来自专栏Netkiller

Linux磁盘分区加密

本文节选自《Netkiller Cryptography 手札》 出处: http://netkiller.github.io/cryptography/ind...

4444
来自专栏以南小隐-数通那些事儿

锐捷设备主程序下升级方法

1774
来自专栏用户2442861的专栏

Springmvc+uploadify实现文件上传

   网上看了很多关于文件上传的帖子,众口不一,感觉有点乱,最近正好公司的项目里用到JQuery的uploadify控件做文件上传,所以整理下头绪,搞篇文档出来...

1842
来自专栏北京马哥教育

Linux 中 fcntl()、lockf、flock 的区别

这三个函数的作用都是给文件加锁,那它们有什么区别呢?首先flock和fcntl是系统调用,而lockf是库函数。lockf实际上是fcntl的封装,所以lock...

60311
来自专栏Android 研究

OKHttp源码解析(九):OKHTTP连接中三个"核心"RealConnection、ConnectionPool、StreamAllocation

RealConnection是Connection的实现类,代表着链接socket的链路,如果拥有了一个RealConnection就代表了我们已经跟服务器有了...

5976
来自专栏魏琼东

分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

     在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于...

1180

访问数据 - 反应方式(Vert.x入门的第4部分)

原文地址:https://dzone.com/articles/accessing-data-the-reactive-way

1.2K4
来自专栏魏琼东

分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

一、分布式消息总线以及基于Socket的实现      在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给...

4197

扫码关注云+社区

领取腾讯云代金券