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


php security & marking mysql records for deletion using a html link (GET)

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

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

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

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

你认为这是一种有效和安全的方式来标记要删除的文档吗?还是我应该使用表单和Post来更安全地完成这项工作?

关于使用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. 抓取网页和缓存链接的浏览器插件可能会在用户不知情的情况下意外抓取链接,打开后再删除文档。

一般来说,我建议不要使用GET请求来处理数据,因为如果你坚持HTTP规范,GET就不是这样设计的。如果你想完全休息,你应该使用DELETE请求,但在大多数情况下,我会使用一个带有执行POST请求的表单的确认页面来删除记录。

阅读为什么应该使用HTTPPOST或delete而不是GET进行删除?这背后的原因。以前在其他一些情况下也有人问过这个问题。

主要原因是GET是一种仅用于检索的安全方法:

特别是,GET和HEAD方法不应具有采取行动的意义而不是检索。这些方法应该被认为是";安全";。这允许用户代理表示其他方法,如POST、PUT和DELETE,以一种特殊的方式,让用户知道请求可能不安全的操作的事实。

用户代理希望这种方法没有副作用:

当然,不可能确保服务器作为执行GET请求的结果而产生副作用;在里面事实上,一些动态资源认为这是一个特性。重要的这里的区别在于用户没有请求副作用,因此不能追究他们的责任。

这意味着GET不应该导致任何服务器端状态更改。

另一个原因是GET更容易利用POST,因为触发GET请求的方法比触发POST请求的方法多。但无论采用哪种方法,两者都容易受到CSRF攻击。

因此,如果您确保自己受到CSRF的保护,您甚至可以使用GET来处理状态更改请求。