我应该将每个操作限制为GET还是POST(但不是两者)?

时间:2014-01-06 20:15:45

标签: php post get

我正在创建一个PHP页面,它通过请求参数获取输入。我的设计目前通过一个action.php路由所有操作,其中包含如下函数:

function get_param($name, $default_value=null) {
  $value = @$_GET[$name];
  if ($value == null) {
    $value = @$_POST[$name];
    if ($value == null) {
        $value = $default_value;
    }
  }
  return $value;
}

然后还有一些其他代码会查看请求中的参数,告诉它是什么类型的动作,每个动作都可以采取其他参数。操作代码如下所示:

$action = get_param("action");
switch ($action) {
case "login":
  login(get_param("user_name"), get_param("password");
  break;
case "create_todo":
  create_todo(get_param("todo"));
  break;
case "get_todo":
  get_todo();
  break;
// Various other cases
}

现在让我们假设这个PHP页面可以通过互联网访问,作为任何网站使用的一般服务。如您所见,这些操作包含登录等许多操作。

另外,我们假设我正确验证了每个请求(在权限和输入长度方面等)。

是否有任何风险允许用户选择请求是GET还是POST,并且action.php将以哪种方式工作?

是否应该强制某些操作POST(例如login或create_todo)以及其他GET(例如get_todo)?

2 个答案:

答案 0 :(得分:1)

我建议为不同类型的访问提供相同的功能。一个原因是因为如果我对/ login执行GET请求,我应该会显示登录表单。如果我POST到/ login,应用程序应该尝试对我进行身份验证,然后根据结果重定向到另一个位置(这基本上会在两者之间创建语义差异)。记住the difference between the HTTP verbs:GET请求适用于那些不修改服务器上任何内容的人,而POST请求则可以。

有关详细信息,请查看REST上的维基百科条目,并阅读有关RESTful控制器的信息。

答案 1 :(得分:1)

首先,要了解GET和POST可以在一个请求中一起使用。考虑一下这个html片段。

<form action="myscript.html?user_name=Bob" method='post'>
<input name='user_name'>
  :
</form>

在这种情况下,$ _GET ['user_name']和$ _POST ['user_name']都将具有表单提交的有效值。

风险是一样的。但是帖子可以让你更好地控制提交内容。

根据RFC2616。 GET请求是“安全”请求,通常应该用于可重复的请求(例如“联系我们”页面。)

POST请求用于 不应重复的不安全请求,例如,在电子商务网站上订购图书。 (订购另一本同名书籍应视为单独交易)。浏览器通常不通过缓存发布请求来提供帮助,因此通过刷新浏览器窗口重复发布请求时,通常会收到警告。

POST请求可以发送对最终用户不可见的数据,而通过GET请求发送的所有数据都可以在URL中看到。

作为一般规则,通过GET(例如http://www.thesite.com/show_article?article_id=1)发送处理类型数据,通过发布发送用户类型数据(例如,登录数据,产品数据)。

请参阅有关此差异的帖子:Parameters in POST url