源代码安全检测

严重安全缺陷

Command Injection(命令注入)

执行不可信赖资源中的命令,或在不可信赖的环境中执行命令,都会导致程序以攻击者的名义执行恶意命令。

Command Injection 漏洞主要表现为以下两种形式:

- 攻击者能够篡改程序执行的命令:攻击者直接控制了所执行的命令。

- 攻击者能够篡改命令的执行环境:攻击者间接地控制了所执行的命令。

修复建议

可以通过修改程序运行命令的环境来间接控制这些命令的执行。我们不应当

完全信赖环境,还需采取预防措施,防止攻击者利用某些控制环境的手段进行攻击。无

论何时,只要有可能,都应由应用程序来控制命令,并使用绝对路径执行命令。如果编

译时尚不了解路径(如在跨平台应用程序中),应该在执行过程中利用可信赖的值构建

一个绝对路径。应对照一系列定义有效值的常量,仔细地检查从配置文件或者环境中读

取的命令值和路径

Cross-Site Scripting: DOM(DOM 型跨站脚本攻击)

向一个Web浏览器发送未经验证的数据会导致该浏览器执行恶意代码。

措施

  • 自动 URL 编码:使用 URLSearchParams 对所有参数进行编码

  • 协议验证:只允许 http: 和 https:,阻止 javascript: 等危险协议

  • Hash 处理:正确处理包含 # 的 URL(如 SPA 路由)

  • 错误处理:提供 try-catch 和用户友好的错误提示

image-20260203152527562

Open Redirect(开放重定向)

通过重定向,Web 应用程序能够引导用户访问同一应用程序内的不同网页或访问外

部站点。应用程序利用重定向来帮助进行站点导航,有时还跟踪用户退出站点的方式。

当 Web 应用程序将客户端重定向到攻击者可以控制的任意 URL 时,就会发生 Open

redirect 漏洞:

攻击者可能利用 Open Redirect 漏洞诱骗用户访问某个可信赖的站点的 URL,然后将他们

重定向到恶意站点。攻击者通过对 URL 进行编码,使最终用户很难注意到重定向的恶意

目标

措施

1. 域名白名单机制

2. 域名验证函数

3. 相对路径处理

4. 开放重定向检查

高危安全缺陷

Insecure Randomness(不安全的随机数)

标准的伪随机数值生成器不能抵挡各种加密攻击

在对安全性要求较高的环境中,使用能够生成可预测值的函数作为随机数据源,会

产生 Insecure Randomness 错误

1
2
3
4
5
浏览器原生的加密安全随机数生成方案,基于 Web Crypto API 实现
随机数替换成
const array = new Uint32Array(1);
window.crypto.getRandomValues(array);
const secureRandom = array[0];

Password Management: Empty Password

Emptypassword可能会危及系统安全,并且无法轻易修正出现的安全问题

密码始终不能为空。一般来说,应对密码加以模糊化,并在外部资源中进行管理。

如果将密码以明文形式存储在网站中任意位置,会造成任何有充分权限的人读取和无意

中误用密码。对于需要输入密码的 JavaScript 引用,最好在连接时就提示用户输入密码

更新验证逻辑,添加严格非空校验和密码强度校验

低风险安全缺陷

Cross-Site Request Forgery跨站点伪装请求 (CSRF)

漏洞会在以下情况下发生:

  1. Web 应用程序使用会话 cookie。
  2. 应用程序未验证请求是否经过用户同意便处理 HTTP 请求。

前端配合后端实现 CSRF 核心防护

添加 CSRF Token 获取方法,从 Cookie 中获取(支持 XSRF-TOKEN、csrf-token、_csrf),
在请求中添加 CSRF 防护,在 fetch() 方法中添加了 CSRF token 到请求头
同时添加 X-CSRF-TOKEN 和 X-XSRF-TOKEN

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//  从 Cookie 中获取 CSRF token(支持 XSRF-TOKEN、csrf-token、_csrf)
function getCsrfToken() {
const getCookie = (name) => {
const value = `; ${document.cookie}`
const parts = value.split(`; ${name}=`)
if (parts.length === 2) return parts.pop().split(';').shift()
return null
}
return getCookie('XSRF-TOKEN') || getCookie('csrf-token') || getCookie('_csrf')
}
//在 POST 请求的 headers 中同时添加 X-CSRF-TOKEN 和 X-XSRF-TOKEN
const csrfToken = getCsrfToken()
if (csrfToken) {
headers['X-CSRF-TOKEN'] = csrfToken
headers['X-XSRF-TOKEN'] = csrfToken
}

Denial of Service拒绝服务攻击

攻击者可能通过对应用程序发送大量请求,而使它拒绝对合法用户的服务,但是这

种攻击形式经常会在网络层就被排除掉了。更加严重的是那些只需要使用少量请求就可

以使得攻击者让应用程序过载的 bug。这种 bug 允许攻击者去指定请求使用系统资源的数

量,或者是持续使用这些系统资源的时间

校验用户输入以确保它不会引起不适当的资源利用。

最大文件大小

接口请求限流 / 防抖 / 节流,防止单用户高频请求

优化资源加载

System Information Leak: Internal内部系统信息泄露

通过打印或日志记录功能将系统数据或调试信息发送到本地文件、控制台或屏幕时

,就会发生内部信息泄露。

自定义统一的错误页面 / 错误响应:应用报错时,返回无任何内部信息的通用错误(如 “系统繁忙,请稍后再试”),仅将详细错误信息记录到服务端日志(不对外展示);