通过url防止xss攻击(PHP)

时间:2013-06-03 11:48:30

标签: php xss url-validation

我试图通过网址来避免XSS攻击 网址:http://example.com/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29 我试过了

var_dump(filter_var('http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29', FILTER_VALIDATE_URL));

和其他使用正则表达式的url_validation但根本没用。 上面的链接显示所有信息,但我的CSS和一些Java脚本功能不起作用。 请提出最佳解决方案......

3 个答案:

答案 0 :(得分:4)

尝试使用FILTER_SANITIZE_SPECIAL_CHARS而不是

$url = 'http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29';

// Original
echo $url, PHP_EOL;

// Sanitise
echo sanitiseURL($url), PHP_EOL;

// Satitise + URL encode
echo sanitiseURL($url, true), PHP_EOL;

输出

http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29
http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/"ns="alert(0x0000DC)
http%3A%2F%2F10.0.4.2%2FonlineArcNew%2Fhtml%2Fterms_conditions_1.php%2F%26%2334%3Bns%3D%26%2334%3Balert%280x0000DC%29

使用的功能

function sanitiseURL($url, $encode = false) {
    $url = filter_var(urldecode($url), FILTER_SANITIZE_SPECIAL_CHARS);
    if (! filter_var($url, FILTER_VALIDATE_URL))
        return false;
    return $encode ? urlencode($url) : $url;
}

答案 1 :(得分:0)

如果你正在使用MVC,那么在路由之前尝试解码所有值,并使用stript_tags()来摆脱这些恶意。正如文档所说,案例不应影响任何事情。

如果没有,请创建一个实用程序函数,并在从URI中检索变量时执行相同的操作。但我绝不是XSS专家,所以这可能只是其中的一部分。

来自Janis Peisenieks

答案 2 :(得分:0)

第1步:转发用户提供的输出

如果要在用户提供的页面中包含数据,请转义输出。而且,在这个简化列表中,我们将坚持使用一个简单的转义操作:HTML编码任何<,>,&,',“。例如,PHP提供了htmlspecialchars()函数来完成这个常见任务。

第2步:始终使用XHTML

通读OWASP的XSS预防策略,如果在HTML中使用不带引号的属性,显然防止注入需要更多的努力。相反,在引用的属性中,转义数据变成了为标记内容转义数据所需的相同过程,我们已经在上面概述了转义操作。这是因为在引用属性的上下文中隐藏结构重要内容方面唯一的麻烦制造者是结束语。

显然,您的标记不一定是XHTML才能包含引用的属性。但是,针对XHTML进行拍摄和验证可以轻松测试是否引用了所有属性。

第3步:仅允许CSS和JavaScript中的字母数字数据

我们需要将您在页面的CSS和Javascript部分中输出的用户数据限制为字母数字(例如,像[a-zA-Z0-9] +)类型的正则表达式,并确保它们用于它们真正代表价值的环境中。在Javascript中,这意味着用户数据只应在分配给变量的带引号的字符串中输出(例如,var userId =“ALPHANUMERIC_USER_ID_HERE”;;)在CSS中,这意味着用户数据应仅在属性值的上下文中输出(例如,p {color:#ALPHANUMERIC_USER_COLOR_HERE;}。)这看起来似乎是严苛的,但是,嘿,这应该是一个简单的XSS教程

现在,要清楚,您应该始终验证用户数据,以确保它符合您的期望,即使是在标签或属性中输出的数据,如前面的示例所示。但是,它对CSS和JavaScript区域尤其重要,因为可能的数据结构的复杂性使得防止XSS攻击变得非常困难。

您可能希望用户能够为您的JavaScript提供的公共数据,例如Facebook,Youtube和Twitter ID,都可以在满足此限制的同时使用。而且,CSS颜色属性和其他样式也可以集成。

第4步:URL编码URL查询字符串参数

如果在链接查询字符串的URL参数中输出用户数据,请确保对数据进行URL编码。再次,使用PHP作为示例,您可以简单地使用urlencode()函数。现在,让我们清楚这一点并通过几个例子来解决,因为我看到了很多关于这一点的困惑。

必须进行网址编码

以下示例输出必须进行URL编码的用户数据,因为它用作查询字符串中的值。

http://site.com?id=USER_DATA_HERE_MUST_BE_URL_ENCODED”>

不得进行网址编码

以下示例输出用户提供的整个URL的数据。在这种情况下,用户数据应该使用标准转义函数(HTML编码任何<,>,&,',“)进行转义,而不是URL编码。对此示例进行网址编码会导致链接格式错误。

相关问题