zoukankan      html  css  js  c++  java
  • 开发安全规约

    •  所有可以通过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);
  • 相关阅读:
    avuex
    vue与avuex
    前端上班第十天
    echarts使用心得
    json转化技巧
    前端上班第一天
    声明函数的提升,声明变量与声明函数之间的区别有什么
    王屋山黑加仑
    微信小程序1
    js-基础
  • 原文地址:https://www.cnblogs.com/xdecode/p/8244118.html
Copyright © 2011-2022 走看看