我现在已经进入strtoupper($_SERVER['REQUEST_METHOD'])了我的代码.
但这是strtoupper必要的电话吗?为$_SERVER['REQUEST_METHOD']保证被已经是大写吗?
Mar*_*ery 13
简短的回答:不,它不能保证,但通常接收非大写的HTTP方法意味着客户端违反了规范.
如果你正在处理W3规范定义的方法,比如GET和POST,那么你可以保证符合规范的客户端会以大写形式发送它们.这是因为HTTP方法定义为区分大小写 ...
Method标记指示要对Request-URI标识的资源执行的方法.该方法区分大小写.
并且WITS定义的方法如OPTIONS,GET,POST等以大写形式定义.
但是,如果您正在处理不符合规范的客户端,那么您的Web服务器和PHP都不会神奇地强制$_SERVER['REQUEST_METHOD']为您提供大写的值.这可以通过像这样的简单脚本轻松演示......
<?php
echo "The method used by your request was $_SERVER[REQUEST_METHOD]";
?>
Run Code Online (Sandbox Code Playgroud)
如果我们使用方法不是大写的HTTP请求命中该脚本,它将以非大写形式回显该方法.许多常用工具将让我们这样做.例如,让我们从UNIX shell中点击它:
$ curl http://localhost/echo_method.php -X GET -w "\n"
The method used by your request was GET
$ curl http://localhost/echo_method.php -X gEt -w "\n"
The method used by your request was gEt
$ curl http://localhost/echo_method.php -X fWoRbLeWoRbLe -w "\n"
The method used by your request was fWoRbLeWoRbLe
Run Code Online (Sandbox Code Playgroud)
...或使用Python:
>>> import httplib
>>> connection = httplib.HTTPConnection('localhost')
>>> connection.request('pOsT', '/echo_method.php')
>>> connection.getresponse().read()
'The method used by your request was pOsT'
Run Code Online (Sandbox Code Playgroud)
"好吧",您可能会说,"因此,如果我的API被编写糟糕的脚本或本机应用程序使用,则存在潜在问题.但我的API仅由在Web浏览器中运行的JavaScript触发的AJAX调用使用.问题影响我?"
不幸的是,是的.似乎现代浏览器在发送AJAX时将大多数标准HTTP方法强制为大写,但目前对于自定义HTTP方法或者特别是PATCH方法不这样做.
从以前点击相同的PHP脚本,这次是在Chrome JavaScript控制台...
var request;
request = new XMLHttpRequest();
request.open("GeT", "http://localhost/echo_method.php", true);
request.send();
request.onreadystatechange = function() {
if (request.readyState == 4) {
console.log(request.responseText);
}
}
Run Code Online (Sandbox Code Playgroud)
产生结果
The method used by your request was GET
Run Code Online (Sandbox Code Playgroud)
但改变HTTP方法pATcH给我们
var request;
request = new XMLHttpRequest();
request.open("pATcH", "http://localhost/echo_method.php", true);
request.send();
request.onreadystatechange = function() {
if (request.readyState == 4) {
console.log(request.responseText);
}
}
Run Code Online (Sandbox Code Playgroud)
给我们
The method used by your request was pATcH
Run Code Online (Sandbox Code Playgroud)
更糟糕的是,Web浏览器并不是唯一能够将除PATCH方法之外的所有方法强制转换为大写的客户端.
总结:虽然HTTP规范要求请求包含大写的HTTP方法(除非它是在不同情况下专门定义的自定义方法),但是常见的Web工具使得前端开发人员很容易弄错,并且PHP的$_SERVER['REQUEST_METHOD']变量也是如此会不会奇迹般地强迫如果他们这样做,以大写为您的方法.
当然,这取决于您是否依赖于您的客户遵守规范,验证方法是否为大写并使用适当的状态代码(可能是400或405)进行响应,如果不是,则回复错误消息,或者接受错误通过strtoupper($_SERVER['REQUEST_METHOD'])像这里的问题提问者一样强迫方法使自己成为大写的基于HTTP的方法.
RFC 3875将REQUEST_METHOD变量定义为大写,因此可以依靠它。
REQUEST_METHOD元变量必须设置为脚本应使用的方法来处理请求...
Run Code Online (Sandbox Code Playgroud)REQUEST_METHOD = method method = "GET" | "POST" | "HEAD" | extension-method extension-method = "PUT" | "DELETE" | token该方法区分大小写。
| 归档时间: |
|
| 查看次数: |
2912 次 |
| 最近记录: |