首页 文章 精选 留言 我的

精选列表

搜索[安全审查],共10009篇文章
优秀的个人博客,低调大师

SQLE —— SQL 审查工具

SQLE 是一款支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。 产品特色 支持通过插件的形式扩展可审核上线的数据库类型,无需升级软件,导入审核插件即可获对应数据库类型的审核上线能力,使用平台所有功能; 支持标准的 HTTP API,可与其他内部流程系统对接; 支持 DDL,和 DML 同时审核,并实现同工单内语句上下文关联; 支持在审核规则外对语句做必要的对象验证,防止实际执行时库表不存在等情况。 主要功能 平台管理 支持用户和角色管理; 支持配置上线数据库; 支持基于角色的资源隔离; 支持配置审核规则模板; 支持对不同的数据库应用不同的规则模板。 SQL 审核 支持工单审批流程,支持工单隔离; 支持邮件推送审批事件; 支持 SQL 上线; 支持生成回滚语句; 支持审核 MyBatis XML 文件; 支持审核建议按 SQL 归类去重展示; 支持审核报告下载。 SQL 审核计划 支持通过标准接口收集来自业务的 SQL 统计信息; 提供 MyBatis 文件扫描上传程序(scanner),可集成CI/CD; 支持静态审核,即脱离上线数据库审核; 支持定时审核,既有 SQL 进行生成审核报告。

优秀的个人博客,低调大师

Java集成人企关联实现精准合规审查

在现代大型B2B采购与供应链管理中,确保供应商资质的真实性和关联关系的透明度是防控履约风险的核心环节。传统模式下,采购方往往需要供应商提交繁琐的纸质营业执照、法人身份证件以及授权委托书,随后由法务或合规专员进行人工比对。这种方式不仅流程冗长、效率低下,且难以实时防范信息不匹配资质或非存续异常主体带来的合约隐患,极易在后续履约中引发信用合规问题。

优秀的个人博客,低调大师

代码审查,异步调用的常见问题剖析

先来看一段代码,就是一小段而已: export function loginWithWx() { wx.showLoading({ title: "登录中..." }); wx.login({ success: res => { wx.request({ url: `${apiRoot}wx/${res.code}`, method: "get", success: res => { const { data } = res; const jwt = app.globalData.jwt = data?.jwt; if (jwt) { wx.reLaunch({ url: "../index/index" }); wx.hideLoading(); } else { showMessage(data.message || "登录时发生错误"); wx.hideLoading(); } }, fail: res => { showMessage("请求超时,请稍后重试"); } }); wx.hideLoading(); }, fail: res => { console.log(res); } }); wx.hideLoading(); } 这段代码乍一看,似乎没毛病。但是稍微思考一下,就能发现问题了。 首先,最直观的问题:缩进太深。缩进最深的地方是 24 个空格,也就是 6 层。一般我们认为 3 层以内的缩进比较容易阅读,超过 3 层应该考虑使用“Extract Method”方法进行重构。 接下来,看外层逻辑: wx.showLoading() wx.login() wx.hideLoading() 这是期望的执行顺序。 注意到 wx.login 是一个异步过程,所以实际上 hideLoading() 并不会等登录过程结束就关闭了加载提示。所以第 2 个问题是忽略了异步执行的顺序。 马上可以想到使用 wx.login() 的 complete 参数来解决: wx.showLoading(); wx.login({ complete: () => wx.hideLoading() }); 不过马上就引出了下一个问题:complete 还是太快! 为什么?我们再把内部的逻辑结构清理出来: wx.login({ success: () => { wx.request({ success: () => { }, fail: () => { } }) }, fail: () => { } }) 注意到 wx.request 仍然是一个异步过程,所以 wx.login 的 success 会立即结束,触发 complete。而这时候 wx.request 可能还在等待服务器响应。 那么是不是应该把 wx.hideLoading() 放到内部逻辑中去?理论上来说,是的! 但实际情况是,内部逻辑分支较多,深次较深,既有同步逻辑,也有异步逻辑……考虑应该放在哪些地方,需要非常的谨慎。实际上,案例中的代码就已经在内部逻辑中放了一些 wx.hideLoading(),只不过 覆盖不全; 因为最外层的 hideLoading() 提前执行,失效了。 违反了规范性约束:成对逻辑应该尽量避免一对多的情况。 解释一下第 3 点,就是说:一个 showLoading() 最好只对应一个 hideLoading()。考虑到逻辑的复杂性,这不是强制约束规则,但应该尽量去避免。 处理的办法是,重构,将内部逻辑拆分出来;然后,将完成事件处理逻辑作为一个参数,一层层的往里传: 显然在当前的技术环境中,这并不是最优方案,还可以继续优化——反正都要封装,干脆封装成 Promise。然后通过 await 调用转换成同步语法,处理起来会轻松得多。封装的具体过程在前两篇文章中有详细的讲解,这里就不赘述了。总之,我们封装了 wx 的异步版本 awx,在这里用就好: export async function asyncLoginWithWx() { wx.showLoading({ title: "登录中..." }); try { return await internalProcess(); } catch (err) { showMessage("请求超时,请稍后重试"); } finally { wx.showLoading(); } // 把内部逻辑用个局部函数封装起来, // 主要是为了让 try ... catch ... 看起来清晰一些 async function internalProcess() { const { code } = await awx.login(); const { data } = awx.request({ url: `${apiRoot}wx/${code}`, method: "get", }); const jwt = app.globalData.jwt = data?.jwt; if (jwt) { wx.reLaunch({ url: "../index/index" }); } else { showMessage(data.message || "登录时发生错误"); } } } 喜欢此文,点个赞 ⇙ 支持作者,赏个咖啡豆 ⇓

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册