使用switch确定HTTP方法是否安全?

时间:2014-09-29 19:14:36

标签: php rest xss

我最近阅读了有关确定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语句,应该在实际中避免使用   应用程序:

几个问题:

  1. 为什么要避免使用此功能?
  2. 使用switch语句本身是否存在漏洞,或者是使其易受攻击的$ _SERVER变量?
  3. 这篇文章(Is $_SERVER['QUERY_STRING'] safe from XSS?)中的答案建议使用htmlentities来保护$ _SERVER值。这够了吗?
  4. 非常感谢!

2 个答案:

答案 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值。这是   足够?

depends on the context

例如,如果你想将它用于javascript代码,那么保护XSS是不够的。在这种情况下,您需要使用函数来转义javascript的字符串(“json_encode”在这种情况下可能会有所帮助)。

答案 1 :(得分:0)

要回答您的switch问题,在应用程序中可能不使用它的原因是它比使用if / else if / else慢 - 那里是PHP Bench提供的一些基准来证明这一点。与通过网络发送请求和响应所花费的时间相比,switchif/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?