php安全&使用html链接标记要删除的mysql记录(GET)

时间:2012-03-07 09:53:42

标签: php mysql security delete-row

只是想知道人们是否认为网站使用html链接允许用户将文档标记为从其安全帐户页面删除是安全的?

我有一个网站,用户可以在注册并登录网站后创建文档。要删除文档,我在其帐户页面上包含要标记为删除的每个文档的链接,如下所示:

http://www.examplewebsitename.com/delete_document.php?docid=5

delete_document脚本确保docid参数是数字,然后在登录时使用其用户ID集的会话变量进行检查,此人通过查找文档创建者的用户ID实际创建了此文档。如果他们在创建者的位置,那么它会将文档标记为删除,否则如果当前登录的人不是创建者,那么它不会将文档标记为删除并返回错误页面。

您认为这是一种有效且安全的方式来标记要删除的文档,还是我应该使用表单和Post来更安全地执行此操作?

3 个答案:

答案 0 :(得分:4)

我可以考虑将GET用作应用程序的删除操作的三个主要问题。

  1. 语义原因,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.

  2. 更容易发生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>
    如果用户登录并点击其受信任网站上的该链接,则会无意中让用户删除该文档。

  3. 抓取网页和缓存链接的浏览器插件/插件可能会意外抓取链接,再次打开链接,在用户不知情的情况下删除文档。

答案 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来更改状态。