只是想知道人们是否认为网站使用html链接允许用户将文档标记为从其安全帐户页面删除是安全的?
我有一个网站,用户可以在注册并登录网站后创建文档。要删除文档,我在其帐户页面上包含要标记为删除的每个文档的链接,如下所示:
http://www.examplewebsitename.com/delete_document.php?docid=5
delete_document脚本确保docid参数是数字,然后在登录时使用其用户ID集的会话变量进行检查,此人通过查找文档创建者的用户ID实际创建了此文档。如果他们在创建者的位置,那么它会将文档标记为删除,否则如果当前登录的人不是创建者,那么它不会将文档标记为删除并返回错误页面。
您认为这是一种有效且安全的方式来标记要删除的文档,还是我应该使用表单和Post来更安全地执行此操作?
答案 0 :(得分:4)
我可以考虑将GET用作应用程序的删除操作的三个主要问题。
语义原因,GET,根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html,应该是一种幂等方法
the side-effects of N > 0 identical requests is the same as for a single request.
更容易发生CSRF,有人可以发布指向http://www.examplewebsitename.com/delete_document.php?docid=5的链接并将链接包装成无害的锚点
<a href="http://www.examplewebsitename.com/delete_document.php?docid=5">Click here for free puppy!</a>
如果用户登录并点击其受信任网站上的该链接,则会无意中让用户删除该文档。
抓取网页和缓存链接的浏览器插件/插件可能会意外抓取链接,再次打开链接,在用户不知情的情况下删除文档。
答案 1 :(得分:3)
一般来说,我建议不要使用GET请求来操作数据,因为如果你坚持使用HTTP Spec,那就不是GET的目的。如果你想完全安静,你应该使用DELETE请求,但在大多数情况下,我使用一个确认页面,其中包含一个执行POST请求的表单来删除记录。
阅读Why should you delete using an HTTP POST or DELETE, rather than GET?,了解其背后的原因。之前在其他一些情况下曾被问过。
答案 2 :(得分:0)
主要原因是因为GET is meant to be a safe method that is used for retrieval only:
特别是,已经建立了GET和GET的惯例 HEAD方法不应该具有采取行动的意义 除了检索。这些方法应该被认为是“安全的”。 这允许用户代理表示其他方法,例如POST,PUT 和DELETE,以一种特殊的方式,使用户了解 事实上,正在要求采取可能不安全的行动。
用户代理希望此方法没有副作用:
当然,无法确保服务器不能 由于执行GET请求而产生副作用;在 事实上,一些动态资源考虑了一个功能。重要的 区别在于用户没有请求副作用, 所以不能对他们负责。
这意味着GET不应导致任何服务器端状态更改。
另一个原因,而不是次要原因,GET更容易利用该POST,因为触发GET请求的方式多于触发POST请求。但无论采用哪种方法,都容易受到CSRF攻击。
因此,如果您确定自己是protected against CSRF,则甚至可以使用GET来更改状态。