我正在创建一个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)?
答案 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