代码摘录:这是否会对XSS造成漏洞?

时间:2014-09-15 17:20:20

标签: javascript css security xss

所以我对JavaScript比较陌生,虽然我一直在做HTML / CSS UI前端工作(亵渎,我知道),并且正在开发我自己的样板用于未来的项目。我对从XSS,CodeInjection等保护代码的想法也很陌生。

以下是我一直在努力的完整工作摘录。在生产中,JavaScript将被缩小并从外部文件加载,而不是内联加载,它只是为了便于使用的示例。

我想知道如果通过创建变量输出作为纯文本并通过document.getElementById(“x”)。href插入它,是否会留下诸如CSS攻击之类的漏洞。关于这些类型的漏洞有大量信息,但作为安全代码环境的相对新手,它是令人生畏的,并且有点压倒性。

PS,<p></p>也仅用于测试。

提前感谢所有人!

代码:

<!DOCTYPE html>

<html>
    <head>
        <meta charset="utf-8" />
        <title>Title</title>

        <!-- required CSS -->

        <!-- conditional CSS -->
        <link rel="stylesheet" type="text/css" href="assets/css/mq/null" id="mediaquery" />
    </head>

    <body>

        <p id="test"></p>

        <script type="text/javascript">
        (function setCSS() {
            if (window.matchMedia("screen and (max-width: 767px)").matches) {
                layout = "mobile";
            } else if (window.matchMedia("screen and (min-width: 768px) and (max-width: 1024px)").matches) {
                layout = "tablet";
            } else if (window.matchMedia("screen and (min-width: 1025px) and (max-width: 1280px)").matches) {
                layout = "desktop";
            } else if (window.matchMedia("screen and (min-width: 1281px)").matches) {
                layout = "xldesktop";
            }
                window.addEventListener('resize', setCSS, false);
                document.getElementById("test").innerHTML = layout;
                document.getElementById("mediaquery").href = 'assets/css/mq/device.'+layout+'.css';
        })();
        </script>

    </body>
</html>

1 个答案:

答案 0 :(得分:0)

您发布的代码中唯一可能导致XSS漏洞的部分是

document.getElementById("test").innerHTML = layout;

如果您正在设置innerHTML,并且您的布局变量中有任何可由用户控制的HTML,那么这可能是攻击媒介。但是,在这种情况下,layout似乎是mobiletabletdesktopxldesktop之一。

如果要包含来自不受信任来源的任何用户设置内容或内容,则应HTML encode your output。在这种情况下,我不会接受已接受的答案,因为它似乎不包括单引号或双引号字符,这对于XSS预防是必不可少的,但Anentropic的答案将使您的输出在HTML上下文中输出安全。

function htmlEscape(str) {
    return String(str)
            .replace(/&/g, '&amp;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#39;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
}

需要对引号字符进行编码,因为如果输出到带引号的属性值,则恶意用户可以转义此上下文。请注意,如果输出到不带引号的属性值,则必须escape all characters with ASCII values less than 256 except for alphanumeric characters

另一种方法是使用JQuery,您可以在其中设置text属性而不是html