- 所有可以通过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);