如何清理$ _SERVER [' QUERY_STRING']然后重新使用查询字符串 - PHP

时间:2014-05-15 15:00:25

标签: php redirect query-string xss

在我的网站上,我使用一些PHP将移动用户重定向到单独的移动网站:

if ($detect->isMobile()) {

    // set query string:
    $query_string = $_SERVER['QUERY_STRING'];

    // sanitise:
    $sani_query_string = htmlspecialchars($query_string);

    // if query string empty send to mobile site, else send to mobile site and concatenate query string:
    if (empty($query_string)) {
        header('Location: http://m.mywebsite.com/');
        exit;
    } else {
        header('Location: http://m.mywebsite.com/?'. $sani_query_string);
        exit;
    }

}

重要的是,如果请求的URL包含查询字符串,则在重定向移动流量时不会删除它。出于这个原因,我将查询字符串设置为变量,并使用'htmlspecialchars'对其进行清理以避免XSS攻击。然而,这对转换'&'有不利影响。在查询字符串中以& amp打破查询字符串,例如:

?utm_source=Google&utm_medium=ABC

变为:

?utm_source=Google&utm_medium=ABC

如何在不破坏连接到重定向网址的查询字符串的情况下保护我的网站免受XSS攻击?

2 个答案:

答案 0 :(得分:0)

这应该这样做。 http_build_queryurlencode为您:

parse_str($_SERVER['QUERY_STRING'], $vars);
$query = http_build_query($vars);
嗯......但这似乎没必要。

答案 1 :(得分:0)

感谢您的回复。

最后,由于我没有在网站上的任何地方执行查询字符串值,因此我没有删除这种情况,因为这是不必要的。

最终代码如下:

if ($detect->isMobile()) {

    // set query string:
    $query_string = $_SERVER['QUERY_STRING'];

    // if query string empty send to mobile site, else send to mobile site and concatenate query string:
    if (empty($query_string)) {
    header('Location: http://m.mywebsite.com/');
    exit;
    } else {
    header('Location: http://m.mywebsite.com/?'. $query_string);
    exit;
    }
}