6

我试图通过 url
url 避免 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 脚本函数不起作用。请建议最好的解决方案...

4

3 回答 3

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;
}
于 2013-06-03T12:43:53.613 回答
0

如果您使用 MVC,则尝试在路由之前解码所有值,并使用 stript_tags() 摆脱这些讨厌的东西。正如文档所说,案例不应该影响任何事情。

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

来自贾尼斯·佩塞涅克斯

于 2013-06-03T11:52:01.673 回答
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 编码

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

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

不得进行 URL 编码

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

于 2013-06-03T11:58:53.457 回答