因此,我对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>

最佳答案

您发布的代码中唯一可能导致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

关于javascript - 代码摘录:这是否会造成XSS漏洞?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25853425/

10-11 23:27