GET与POST最佳实践

时间:2009-03-24 19:59:33

标签: php html http forms rest

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

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

如果我想使用POST而不是......我该怎么做(这是一个动态生成的列表)?我可以在不使用表单的情况下发送POST数据吗?

或者,对于每件物品,我都必须这样做:

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

并将提交按钮设置为原始链接?

我不熟悉php CURL或REST,它们有助于解决这个问题吗?

10 个答案:

答案 0 :(得分:19)

请将POST用于修改数据库中持久状态的任何内容。您不希望抓取工具访问您的删除链接!
请阅读W3C的Architecture of the World Wide Web, Volume OneURIs, Addressability, and the use of HTTP GET and POST

修改:有时您需要使用GET。例如,在电子邮件中发送的成员资格激活URL是GET,需要以某种方式修改数据库。

答案 1 :(得分:18)

通常,以某种方式修改系统状态的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>

答案 2 :(得分:8)

您不应该从GET请求中更改数据库中的任何内容(除了记录信息或其他短暂数据)。问题是有各种网络抓取软件,网络加速器,反病毒程序等,它们会对他们找到的每个网址执行GET请求;您不希望他们在这样做时自动删除项目。 GET也容易受到跨站点请求伪造的攻击;如果攻击者让你的一个用户点击执行不良操作的链接(例如,创建一个重定向到删除URL的tinyurl),那么他们可以欺骗用户使用他们的权限删除某些东西而不会意识到它。 / p>

是的,您需要提交的表单来创建POST请求。另一种选择是使用JavaScript和XMLHttpRequest,但这对于禁用JavaScript的用户不起作用。

您还应该确保一旦接收了POST请求中的数据,而不是返回新页面以响应该请求,您应该将用户重定向到GET请求访问的页面。这样,如果他们点击重新加载,他们就不会意外地重新发送POST请求,或者在浏览会话中稍后点击后退按钮。

答案 3 :(得分:3)

您不希望使用Get,因为REST原则是不允许Get更改系统的状态。除非您希望搜索引擎删除所有内容。

每个项目都不需要表格;您可以使用delete_ {id}输入type = submit在列表周围使用一个方法=帖子表单。或者,更巧妙的是,&lt; input type = submit name =“delete_item”value =“{id}”&gt;。提交按钮允许使用名称。

根据评论中的问题&lt; input type = submit name =“action_ {id}”value =“Delete”&gt;可能会更好,但它会遇到一些对本地化网站有用的问题。您始终可以恢复为HTML按钮,以便对演示文稿进行更多控制。默认情况下它就像一个提交按钮。

当您只是查看列表时,通过您提出的每个项目的表单解决方案发回一个比您需要的页面大得多的页面的平均情况,可以减少您在提交中获得额外的,不需要的信息的事实。您总是可以使用javascript来替换普通旧html表单的行为,使用更智能的版本来支持具有javascript功能的客户端。

如果您要链接到“获取”进行删除,您应该返回一个确认页面,其中包含确认后实际发布的Get。

答案 4 :(得分:3)

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

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

关键部分是:

  

“它登录到管理区域,并按照'删除'链接进行操作   每个条目,“管理员说。

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

答案 5 :(得分:2)

POST并不是所有恶意行为的保护,正如有些人暗示的那样。恶意用户仍然可以创建链接(包含用于执行POST的javascript)并导致与GET相同的跨站点脚本问题。 (&lt; a href =“javascript:function(){...}”/&gt;)

也就是说,使用POST而不是GET的所有其他原因(爬虫等)。

答案 6 :(得分:0)

正如其他人所说,将GET用于删除等破坏性操作是一个非常糟糕的主意,特别是在面向互联网的网站(或拥有Google Mini设备的公司)上,网页抓取工具可能会意外删除所有数据。

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

如果您无法使用JavaScript和XHR(您的用户生活在1999年),并且您不想在列表中使用表单,请使用指向单独页面的链接,您可以在其中显示表单和可能“你确定吗?”消息。

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

答案 7 :(得分:0)

您不应使用href删除项目。

我建议以旧式方式执行此操作,并为每一行/项目实施表单。

例如:

<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)

答案 8 :(得分:0)

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

答案 9 :(得分:-12)

使用GET更好。

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

编辑: 这里没有任何理由使用POST。不,原因。

这里的人们写的是安全和不安全的,好像选择方法可以以任何方式影响安全。当然,无论您选择何种方法,都应该对用户进行身份验证。如果不这样做,那么您的软件已经损坏。如果您在拥有表单时使用javascript来模拟发送表单,并且不需要它,则根本不需要任何javascript,那么您的软件已经损坏。

实际上,大约90%的网络软件被破坏了,因为人们不知道他们在做什么。

忽略这些评论“被一些陌生人严重贬低。避免使用javascript(不需要),避免POST(没有理由),验证你的用户(安全),使用mod_rewrite或其他方式使href变得漂亮(很好)。

相关问题