首页 > 解决方案 > 无法清除跨站点脚本

问题描述

为了防止在输入字段中输入恶意 html/脚本并保存在我们的应用程序中,我们正在检查用户输入的 html,如果发现,我们不会提交。

我们使用以下函数执行此操作

    /**
     * Parse for HTML elements to avoid cross-site scripting
     * @param str
     */
    function isHTML() {
        var str = $("#AttributeInstance").val();

        var htmltempElement = document.createElement('div');
        htmltempElement.innerHTML = str;

        for (var c = htmltempElement.childNodes, i = c.length; i--;) {
            if (c[i].nodeType == 1) {
                htmltempElement = null;
                str = null;
                return true;
            }
        }

        return false;
    }

该功能运行良好。例如,如果在我们的表单上,用户输入以下内容

   <img src=a onerror=alert(1)>

该函数返回 true,我们不保存该值。

这是我们如何调用这个函数

            if (isHTML()) {
                alert("Found HTML! Stop!");
                instance = "";
                $("#AttributeInstance").val(""); //clear the input field
            }
            else {
                alert("No HTML! Continue");
                alert(instance);
                addKpi(group, name, instance, instanceSelection);
            }

            alert("Finished");

现在问题来了。此代码会导致“找到 HTML!停止!”的警报。然后显示“完成”。

但随后我们也会收到“1”的警报,它来自包含脚本的原始输入值。至此,该字段已被清除,我们没有将恶意脚本值存储在任何地方,但是,即使它被清楚地检测到并且我们停止处理,它也会将其作为消息弹出。

有任何想法吗?或任何建议如何更好地检测输入字段中的跨站点脚本值?

如果我们从函数中删除以下内容

    htmltempElement.innerHTML = str;

    for (var c = htmltempElement.childNodes, i = c.length; i--;) {
        if (c[i].nodeType == 1) {
            htmltempElement = null;
            str = null;
            return true;
        }
    }

然后脚本不会弹出“1”有一些关于以这种方式检查脚本的方法,最终处理看起来的脚本。

标签: javascriptxss

解决方案


推荐阅读