开发安全规约
时间:2022-04-24
本文章向大家介绍开发安全规约,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 所有可以通过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, " ").replace(/<script>/gi, '<script>').replace(/</script>/gi, '</script>');
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);
- $.each()与$(selector).each()区别详解
- javascript typeof
- php中json_encode
- Java高级进阶:自定义ClassLoader
- 字符串拼接+和concat的区别
- Spring Boot Runner启动器
- Spring Boot自动配置原理、实战
- Spring Aware容器感知技术
- 深入探究frame和bounds的区别以及setbounds使用
- 如何生成二维码过程详解
- hashCode和identityHashCode的区别你知道吗?
- SpringCloud注册中心高可用搭建
- SpringMVC表单验证器的使用
- Hadoop作业提交与执行源码分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 搭建简易的物联网服务端和客户端-邮件通知(十九)
- LeetCode37|两颗二叉搜索树中所有元素
- LeetCode45|数组中重复的数据
- 搭建简易的物联网服务端和客户端-网络控制(二十)
- LeetCode44|在每个树行中找最大值
- LeetCode43|最大层内元素和
- 搭建简易的物联网服务端和客户端-Maibu控制(二十一)
- LeetCode42|层数最深叶子节点的和
- LeetCode41|数组中数组出现的次数
- Django后台管理界面修改(源文件修改)
- 前端工程师不可不知的Nginx知识
- Django1.11 简单登录注册
- 基因表达聚类分析之初探SOM - 自组织特征图
- JMH - Java 代码性能测试的终极利器、必须掌握
- 从零搭建Spring Boot脚手架(6):整合Redis作为缓存