灰盒测试时如何验证Vue组件中的API调用是否安全?
我在做灰盒测试,手上有部分源码和访问权限,但不确定该怎么检查Vue组件里调用的后端接口有没有安全风险。比如下面这个组件直接把用户输入拼接到URL里发请求,会不会有漏洞?
<template>
<input v-model="userId" />
<button @click="fetchUser">查用户</button>
</template>
<script>
export default {
data() {
return { userId: '' }
},
methods: {
async fetchUser() {
const res = await fetch(/api/user/${this.userId});
// ...
}
}
}
</script>
我试过在userId里输入' OR '1'='1之类的字符串,但后端好像做了过滤。问题是:这种场景下,我该重点测什么?参数校验?路径遍历?还是别的?
前端把用户输入直接拼到URL里这种事确实看着膈应,但后端如果做了过滤,SQL注入这块你基本不用操心了。灰盒测试的重点应该转移到这几个方向:
1. 越权测试(IDOR)
这是最关键的。你用A用户的userId发请求拿到数据后,尝试把userId改成B用户的标识(比如递增ID、猜测其他用户名),看能不能拿到别人的数据。后端有没有做当前用户和目标资源的权限校验,一测便知。
2. 路径遍历
虽然你演示的是userId,但实战中要测试输入里出现
../、..这类字符会不会导致服务端路径穿越。上次我测过一个类似场景,用户名参数里传../../../etc/passwd居然真被后端执行了。3. 类型和边界值
如果userId预期是数字,试试传0、负数、超大数值、浮点数、null、undefined、数组对象之类的。看后端有没有做严格类型校验。
4. 敏感信息泄露
看请求响应里有没有返回不该暴露的字段,比如密码hash、内部ID、敏感业务数据。
你那个组件的写法确实不规范,正经做法应该是用查询参数或者请求体传值,别直接拼URL。不过前端的"安全"都是纸老虎,重点测后端就对了。