GET与POST最佳实践

对于我的Web应用程序(PHP / MYSQL),我会显示项目的列表以及每一行上的链接以删除项目。 现在,链接是

<a href='item.php?id=3&action=delete'>Delete Item</a> 

如果我想用POST代替…我该怎么做(这是一个dynamic生成的列表)? 我可以不使用表单发送POST数据吗?

或者,对于每个项目,我必须这样做:

 <form action='item.php?id={$item_id}' method='POST'> <input type='hidden' name='action' value='delete'> <input type='submit' value='delete item'> </form> 

和样式提交button看起来像原来的链接?

我不熟悉PHP的CURL或REST,他们会帮助解决这个问题?

一般来说,有一个GET请求修改系统状态不是一个好主意,比如删除一个项目。

你可以让你的表单看起来像这样:

 <form action='item.php' method='POST' id='form'> <input type='hidden' name='action' value='delete' /> <input type='hidden' name='id' value='{item_id}' /> <a href="" onclick="document.getElementById('form').submit(); return false;">Delete item</a> </form> 

请使用POST来修改数据库中的持久状态。 您不希望抓取工具访问您的删除链接!
请阅读万维网的体系结构,第一卷和URI,可寻址性以及 W3C 使用HTTP GET和POST 。

编辑 :有时候,虽然你需要使用GET。 例如在电子邮件中发送的会员激活URL是GET,并且需要以某种方式修改数据库。

您不应该在GET请求中更改数据库中的任何内容(除了logging信息或其他临时数据)。 问题是,有各种各样的networking蜘蛛软件,networking加速器,反病毒程序等,它们将对每个他们find的URL执行GET请求。 你不希望他们这样做时自动删除项目。 GET也容易受到跨站请求伪造; 如果攻击者让你的一个用户点击一个执行错误操作的链接(例如,创build一个redirect到一个删除URL的tinyurl),那么他们可以欺骗用户使用他们的权限删除一些东西,而不会意识到这一点。

是的,您需要提交一个表单来创build一个POST请求。 另一种select是使用JavaScript和XMLHttpRequest,但是这不适用于JavaScript禁用的用户。

你也应该确保一旦你接受了来自POST请求的数据,而不是返回一个新的页面来响应这个请求,你应该把用户redirect到一个GET请求访问的页面。 这样,他们不会在重新加载时不小心重新发送POST请求,或者稍后在浏览会话中点击后退button。

下面是一个很好的例子,为什么不使用GET来改变服务器状态:

http://www.infoworld.com/article/08/06/16/25FE-stupid-users-part-3-admins_5.html

关键部分是:

“它login到行政区域,并按照每个条目的”删除“链接,”pipe理员说。

如果删除已经被编码为POST,则永远不会发生。 (OTOH我们会被一个有趣的系统pipe理员故事抢劫。)

您不希望使用Get,因为不允许获取更改系统状态的REST原则。 除非你喜欢search引擎删除所有的内容。

你不需要每个项目的表格; 您可以使用delete_ {id} input type = submit在列表的周围使用一个方法=发布表单。 或者,更巧妙的是,<input type = submit name =“delete_item”value =“{id}”>。 提交button上的名称是允许的。

根据您在评论中的问题,<input type = submit name =“action_ {id}”value =“Delete”>可能会更好,尽pipe它有一些问题会对本地化网站造成严重影响。 您可以随时恢复为HTMLbutton,以便对演示文稿进行更多的控制。 它的行为就像一个默认提交button。

在您提交的每件商品的解决scheme中,当您刚刚查看列表时,您可能会在平均情况下发回比您所需的更大的页面大的页面,从而减less您提交的额外的不必要的信息。 您总是可以使用javascript来replaceplain-old-html表单的行为,使其更适合支持javascript的客户端。

如果你要链接到“获取”删除,你应该返回一个确认页面,该确认后,实际上做了一个职位。

POST不是像一些人暗示的那样防止所有恶意行为。 恶意用户仍然可以创build链接(包含javascript来执行POST),并导致与GET相同的跨站点脚本问题。 (<a href="javascript:function(){…}"/>)

也就是说,使用POST over GET的所有其他原因都适用(抓取工具等)。

正如其他人所说,使用GET进行删除等破坏性操作,特别是在面向Internet的网站(或带有Google Mini设备的公司)上使用GET是一个非常糟糕的主意,因为networking爬虫可能会意外删除所有数据。

如果您不想使用表单,请使用XMLHttpRequest将POST发送到您的服务器。 如果您的服务器支持,您甚至可以将方法设置为DELETE。

如果你不能使用JavaScript和XHR(你的用户住在1999年),你不想在你的列表中使用一个表单,可以使用一个链接到一个单独的页面,在那里你可以显示表单,你确定?' 信息。

要做的最好的事情可能是上面两个选项的组合:使用表单将链接呈现到单独的页面,但使用JavaScript将链接重写为XHR调用。 这样,1999年或2009年的用户都可以获得最佳体验。

你不应该使用href来删除一个项目。

我会build议以旧式的方式来做,并为每一行/项目实施一个表格。

例如:

 <tr><td>Item 1</td><td><form action=/delete method=post><input type=hidden name=id value=1><input type=submit value=Delete></form></tr> <tr><td>Item 2</td><td><form action=/delete method=post><input type=hidden name=id value=2><input type=submit value=Delete></form></tr> <tr><td>Item 5</td><td><form action=/delete method=post><input type=hidden name=id value=5><input type=submit value=Delete></form></tr> 

其他两个选项:1)为每个项目使用一个2)Ajax(但您需要精通Ajax)

您也可以使用get,但您需要检查会话值以确保它是试图删除的post的所有者。 得到的不是“普遍不安全”。 这完全取决于你如何使用它。

GET更好。

如果你的问题是你不喜欢你的链接的丑陋的URL,你应该能够修复mod_rewrite(如果你使用Apache Web服务器)。

编辑:没有任何理由在这里使用POST。 没有理由。

在这里的人们写关于安全和不安全,就好像select方法可以以任何方式影响安全。 当然,无论您select什么方法,您都应该对用户进行身份validation。 如果你不这样做,那么你的软件已经坏了 。 如果您使用JavaScript来模拟发送表单,而您没有表单,并且不需要它,则根本不需要任何JavaScript,那么您的软件已经被破坏。

实际上,大约有90%的networking软件被打破了,因为人们不知道自己在做什么。

忽略这个评论“正在被一些奇怪的人严重废弃。 避免JavaScript(不需要),避免POST(无理由),validation你的用户(安全),使用mod_rewrite或其他方式(很好)的美丽。