怎么防止用户自己调用网站 API 发送 POST 请求篡改数据
source link: https://www.v2ex.com/t/806211
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
譬如我有一个 API 节点, 这个 API 接收包含 1 个参数 "address" 的 POST 请求
正常来说这个 address 是客户端在发送 POST 请求的时候程序自动获取的, 用户无法自己更改 但是如果用户自己用开发者工具之类的 call 这个 API, 在请求中传入自己有效的 Token 绕过鉴权, 和一个篡改的 address 参数, 那岂不是可以随意滥用这个 API 私自修改 address 了吗?
刚刚接触 web 开发不是很懂,请问该如何防止这个情况的发生?
xiaopc 18 小时 48 分钟前 via Android 2
其次,如果做不到的话,就只能提高伪造难度,比如楼上说的对请求使用某种签名,然后混淆相关代码(攻击者获得签名方式;比如使用可信介质( U 盾等)客户端证书
xiaopc 18 小时 43 分钟前 via Android
比如楼上说的对请求使用某种签名,然后混淆相关代码(如果攻击者获得签名方式就没用了);比如使用可信介质( U 盾等)存储的客户端证书进行签名(但是怎么保证证书不会被攻击者拿到)
coolrc 18 小时 36 分钟前 via Android
如果是公用的 token,那你的 API 应该只能 get,而不能 put 。不能给修改数据的 API 用公共 token,不然怎么样加密都会被解析出来。
Junzhou 18 小时 22 分钟前 2
如果传递给你的地址是错误的(非法的),那你在后端对地址做校验就好了。 如果你用的是 https,把请求这个行为,和请求携带的参数是否合法,分成两个事儿来理解。 对请求内容加签只是为了保证内容在传输过程中防篡改。如果本身请求发起时携带的参数时错误的,加签并不能解决这个问题。
MintZX 18 小时 21 分钟前 via iPhone
Junzhou 18 小时 18 分钟前
markgor 17 小时 44 分钟前
第二、address 生成是由客户端生成,那就不存在不能篡改,你要防止篡改的话只能由服务端生成。因为客户端生成的话你无法区分 address 是被篡改后的还是没被篡改,当然你可以对参数请求进行签名,但这样无疑只是增加破解的成本而已,别人只要反编译下或者多次对比,找出你加密的规则,那最后还不是一样照篡改你的数据。
最后:前端提交的一切内容都应该视为不可信内容。
qfdk 17 小时 42 分钟前
首先 这个 token 要不是 jwt 的话 肯定会连着一个 previllage 的表,这里记录了一些可用的权限。正常要是 spring 的话 用 authority 来判断,默认是 访问 userinfo endpoint 来获取用户信息。 你可以用简单的 RWD 这样的三种权限来验证,看看有没有 W 权限。
当然了,还有个简单的法子,你 post 的时候, 后端通过 token,知道是谁来发送的,只要测试一下这个人是不是在白名单里面就好了 也就是
```js
if(allowEditAddress(token)){
doSomething();
}else{
// 没有权限
}
```
Jooooooooo 17 小时 39 分钟前
jinliming2 17 小时 28 分钟前
如果不考虑破解收益,用户就是想不计成本的破解你的 API 混淆参数,那么你没办法,所有前端的校验逻辑理论上都是可以被破解的。
pupboss 16 小时 55 分钟前 1
这也就是为什么说“任何用户输入都是不可信的”,后端简单做下过滤,避免用户传的数据对业务造成影响,避免不可靠的字段造成程序 crash,基本上就已经谢天谢地了
qfdk 16 小时 42 分钟前
linhongye 15 小时 58 分钟前
用户有 token 就是可以去操作这个东西...
今天担心用户用 api 去操作 address, 明天就得担心用户虚拟 GPS 去操作 address.
想阻止这件事, 就得去结合多个不同传感器的信息去做验证.
回头来, 核心还是要考虑业务场景. 用户改了这个东西获得了什么好处, 你们损失了哪些东西?
如果损失不大, 甚至只是减少了一些利润, 其实可以不管...
一方面, 这种用户量不大, 等这种用户多了再去管.
另一方面, 如果刚接触 web, 那可能是个新项目, 这种项目有用户来用就是胜利, 还管他怎么用呢....
liuidetmks 13 小时 9 分钟前 via iPhone
监控下 debugger
把运行环境,时间戳也当做参数。
但是这也只能增加对方难度,不能杜绝。
icyalala 12 小时 24 分钟前 1
参数签名+客户端防逆向
服务端风控,这是最主要的
根据我待过的几个公司的经验,就算大厂也基本就是这些了
整体来说就是增加成本降低风险,完全避免是不可能
zyxk 11 小时 54 分钟前
ch2 11 小时 44 分钟前
甚至后台都不一定能检测出来请求到底是不是自己客户端发的
无非是:
1. 用一些难以伪造的签名机制对请求进行签名,不要求请求必须被签名,不签名一样能用 api(可以很有效地对付懒省事的逆向者),但是服务器可以知道这个请求是第三方发过来的
2. 以封号为手段对使用非官方客户端的用户进行惩罚,或者强制踢掉这个第三方客户端的用户
使这个第三方客户端声誉受损没人敢用
rekulas 10 小时 31 分钟前
答案当然是无法防止,只能通过各种手段提高逆向难度
毕竟对服务端来说,客户端都是“无状态”的,只要参数正确,无法识别是真客户端还是伪客户端
qfdk 10 小时 6 分钟前
js8510 2 小时 42 分钟前
1. client request for address updates -> server
2. server return a presigned url for posing address chagnes and the url timeout in 200ms(一般是你 request response round trip 正常的时间范围)
3. client update address with presigned url.
因为 2. 返回的 presigned url 有 200ms timeout 而且只授权指定 ip. 所以,至少用户没办法手动操作直接 call api. 怎么着也要再搞个脚本 自动化一下。其实就拦截了不少特定场景下的用户了。
但是我觉得你的用户如果都是程序员,而且直接 call api 的动机很强,那基本上就没有用了。
xuanbg 6 分钟前
如果这行为不符合你的预期,那一定是你的接口数据校验没做到位。这就不是身份验证或令牌的问题,而是对数据的操作没有进行必要的限制的问题。譬如订单都发货了,你还允许修改发货地址之类。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK