为什么不在这里使用POST方法?

时间:2010-06-09 11:52:07

标签: php javascript html security http

我有一个分类网站。

在主页面(索引)中,我有几个用户可能填写或不填写的表单字段,以指定详细搜索分类广告。

例如:

   Category: Cars
   Price from: 3000
   Price to:   10000
   Color: Red
   Area: California

表单的动作设置为php页面:

   <form action='query_sql.php' method='post'>

在query_sql.php中,我获取如下变量:

   category=$_POST['category'];
   etc etc...

然后查询MySql:

   $query="SELECT........WHERE category='$category' etc etc....
   $results = mysql_query($query);

然后我只是通过创建一个根据结果集动态填充的表来向用户显示查询结果。

然而,根据我之前的Q中的Shrapnel上校的回答,我不应该在这里使用POST:How to hide URL from users when submitting this form?

我使用post的原因只是隐藏浏览器地址栏中的“one-page-word-document”长URL。

我很困惑,是否可以使用POST?

当我现在使用GET或POST时它工作正常......它已经在生产服务器上...

顺便说一下,在链接的问题中,我并没有提到make URL不可见(或隐藏它)我只是想让它看起来更好(我用mod_rewrite完成了)。

更新:

如果我使用GET,那么我应该如何让网址更好看(漂亮)? 检查此前的问题:

How to make this very long url appear short?

8 个答案:

答案 0 :(得分:12)

  • 搜索引擎不会将结果编入索引
  • 人们无法为搜索添加书签
  • 人们无法向他们的朋友发送搜索链接
  • 人们无法从自己的网页链接到结果页面
  • 有些人无法回到页面而没有收到可怕的“你想重新提交表格吗?”
  

如果我使用GET,那么我该如何让网址更好看(漂亮)?

你不应该。没关系。注意到表单提交的URL的用户数量很少,关注的数量甚至更小。

答案 1 :(得分:1)

使用GET over POST背后的想法是,使用GET,您有一个搜索URL,您可以在地址栏,书签和传递中修改。

从技术上讲,如果您不需要解决这些问题,并且将数据从一个页面传递到下一个页面,那么这两种方法都很好并且基本上可以互换

GET和POST之间的一个重要区别是GET参数的大小不应超过1-2千字节。 POST请求的大小限制通常为几十兆字节。

答案 2 :(得分:1)

您可能希望对用户输入执行一些审查以减轻SQL注入攻击,因为它看起来像是直接操作SQL语句

答案 3 :(得分:1)

GET 应该用于只读或对数据没有任何副作用的请求(即它们应该是idempotent,如HTTP documentation中所述{3}})。您应该可以根据需要多次提交GET请求,而不会影响返回的结果。 (你可能并不总是得到相同的结果,因为当然其他东西可能已经改变了,但GET请求不应该改变数据本身。)

因此,搜索属于此类别,因为您不应该更改系统上任何会影响搜索输出的数据,而只是根据用户提供的参数向用户提供数据。

当然,您总是希望更新一些数据,例如统计数据(如评论中所述),这对GET来说很好,因为它不会影响响应,只是为了记录所有数据提出的要求等

当执行任何破坏性操作时,应使用

POST (通过破坏性,我的意思是当数据被更改时...而不仅仅是删除)。所以添加,更新,删除等等。

这就是为什么浏览器通常会提示您是否要重新提交POST请求,而不是GET。这是因为POST意味着在数据发生变化时使用。

此外,某些浏览器可以从页面上的链接预取页面(尝试在最终点击链接时给出速度幻觉)。如果GET操作具有破坏性(例如删除记录),那么仅通过访问链接所在的页面就会无意中触发此操作。

如果您担心自己的网址看起来“混乱”,可以使用类似mod_rewrite的内容来使网址更加人性化。因此,"http://yoursite.com/search/cars/red"可以映射到"http://yoursite.com/search.php?category=cars&color=red"

答案 4 :(得分:0)

首先请记住使用mysql_real_escape_string清理输入。 除了以下内容之外,GET与POST几乎相同:

  • 使用POST,您无法为页面添加书签
  • 使用GET,您无法发布文件,并且查询字符串存在长度限制

只有在我知道页面会修改服务器端(即数据库更新)然后重定向到另一个页面时才使用POST。

答案 5 :(得分:0)

David Dorward的回答解决了大部分问题 - 但他错过的一个重要问题是可缓存性问题。

POST和GET具有非常特定的语义 - POST应该意味着请求会更改系统上的数据,而GET则不会。因此,不应缓存对POST的响应。但是可以缓存对GET的响应(取决于发送的标头)。

NB内容不只是在浏览器上缓存。

下进行。

答案 6 :(得分:0)

听起来您关注的是不友好的网址,即您希望在整个网站/应用中拥有友好的网址。如果是这样,您可以在方案中继续使用POST,但在POST后执行重定向。通过执行重定向后发布,呈现搜索结果的重定向URL可以变得友好且简短,同时您可以使用POST将请求中的更多参数传递给服务器,并避免与查询相关联的长查询字符串。获取网址。

要了解更多重定向后发帖,请查看此文章http://www.theserverside.com/news/1365146/Redirect-After-Post

答案 7 :(得分:0)

你有没有考虑过:

通过GET(或POST)提交表单,然后服务器端读取表单内容(来自网址或发布数据),形成一个漂亮的网址,然后301重定向到该网址。

通过这种方式,您可以完全控制URL(例如,它不符合浏览器/表单的URL状态),并且您可以获得使用GET的所有好处,例如:可收藏,可链接,后退友好等等。