我最近阅读了有关确定HTTP标头以更改脚本操作的教程(http://code.tutsplus.com/tutorials/a-beginners-guide-to-http-and-rest--net-16340)。本教程给出了一个用于完成此操作的PHP脚本示例
$method = $_SERVER['REQUEST_METHOD'];
switch($method) {
case 'PUT':
$this->create_contact($name);
break;
case 'DELETE':
$this->delete_contact($name);
break;
case 'GET':
$this->display_contact($name);
break;
default:
header('HTTP/1.1 405 Method Not Allowed');
header('Allow: GET, PUT, DELETE');
break;
}
...并提及
我们使用switch语句,应该在实际中避免使用 应用程序:
几个问题:
非常感谢!
答案 0 :(得分:2)
为什么要避免使用此功能?
许多程序员会选择他们避免使用“switch”语句的原因,具体取决于上下文。
例如,一个项目可能有很多"switch" statements with duplicated code来做一些可以通过多态来解决的问题。
在这种情况下,“switch”用于将HTTP方法映射到callables(“default”除外):您可以将http方法映射到可在运行时替换的callables。遵循“pythonic哲学”的Python程序员使用词典来做“切换”语句所做的事情,但能够在运行时更改地图。
使用switch语句本身是否存在漏洞,或者是 它是$ _SERVER变量,使其易受攻击?
不,单独使用“切换”没有漏洞。
You should not thrust the values from $_SERVER因为它们是从网络客户端(通常是浏览器)输入的。一个简单的“curl”脚本可以发送不准确或无效的数据,例如IP地址,用户代理,引用等。这对于网页抓取非常有用(某些网站的实施是为了防止天真的抓取)。
检查“filter_input”函数,使用输入值($ _GET,$ _POST,$ _COOKIE,$ _SERVER,$ _ENV)过滤全局变量中的值。
这篇文章中的答案(来自XSS的$ _SERVER ['QUERY_STRING']安全吗?) 建议使用htmlentities来保护$ _SERVER值。这是 足够?
例如,如果你想将它用于javascript代码,那么保护XSS是不够的。在这种情况下,您需要使用函数来转义javascript的字符串(“json_encode”在这种情况下可能会有所帮助)。
答案 1 :(得分:0)
要回答您的switch
问题,在应用程序中可能不使用它的原因是它比使用if
/ else if
/ else
慢 - 那里是PHP Bench提供的一些基准来证明这一点。与通过网络发送请求和响应所花费的时间相比,switch
与if/else
的效果差异可能微不足道。
有些程序员认为switch
构造比if/else
更不清晰 - 但这取决于个人品味。本质上没有任何东西"不安全"关于使用switch
。
有很多现有的SO问题涉及PHP中的清理输入,所以我建议你查看它们。例如。 Do htmlspecialchars and mysql_real_escape_string keep my PHP code safe from injection?和What is the best method for sanitising user input with PHP?