直接编写sql命令时,很容易指定要删除的记录(例如,通过指定ID等)。
但是在网页中,如果你有一个指定不同记录的链接列表(将id作为查询参数嵌入),你怎么能确保用户只是不编辑链接中的id,这样他就可以了可以删除不同的记录吗?
例如,假设我有以下链接:
<a href="foo.com/deleterecord/1121">delete</a>
用户可以轻松复制粘贴链接,并将1121更改为1123,并删除一些他无权访问的其他记录。
所以我的问题是,在你的架构中,你如何允许用户选择要删除的记录(通过点击链接),但同时阻止用户编辑链接以删除其他记录?或者这是在数据库层处理的吗?
答案 0 :(得分:4)
基本上你无法阻止链接的编辑,或者更好,你不能阻止客户端调用某些编辑过的链接。最简单和最安全的做法是验证服务器端的用户身份和相对权限。
答案 1 :(得分:1)
减少(不删除)让用户查看/编辑与您发送链接的记录不同的记录的风险的方法是使用两个彼此无关的密钥。第二个键可能是有意义的,也可能只是一个随机数。
create table foo (pk serial, validation_key integer, data [...]);
Select * from foo where pk = 1121 and validation_key = 123456789;
更健壮的方法是在生成链接时对主键进行编码,并验证给定的pk和解码的值是否匹配。
<a href="foo.com/deleterecord/1121/ABC123DEF456==">delete</a>
正如其他人所提到的,真正的控制发生在服务器端。