Javascript 这个iframe buster脚本看起来安全吗?

Javascript 这个iframe buster脚本看起来安全吗?,javascript,security,xss,Javascript,Security,Xss,我们被要求在我们的网站上托管一些iframe buster脚本——它们允许从外部域向iframe提供的广告扩展到宿主页面。我们的主机提供商警告我们要注意这些脚本中的安全漏洞。具体地说,他们中的一些人通过允许从任何URL将一段Javascript加载到我们的站点,从而创建了跨站点脚本漏洞 要实现该脚本,您需要在站点上托管一个HTML页面。我正在看一个来自广告提供商Atlas的例子。在本例中,URL类似于。该页面包含一个外部URL上带有src的脚本标记,下面是它包含的JS: var ARMIfbLi

我们被要求在我们的网站上托管一些iframe buster脚本——它们允许从外部域向iframe提供的广告扩展到宿主页面。我们的主机提供商警告我们要注意这些脚本中的安全漏洞。具体地说,他们中的一些人通过允许从任何URL将一段Javascript加载到我们的站点,从而创建了跨站点脚本漏洞

要实现该脚本,您需要在站点上托管一个HTML页面。我正在看一个来自广告提供商Atlas的例子。在本例中,URL类似于。该页面包含一个外部URL上带有src的脚本标记,下面是它包含的JS:

var ARMIfbLib = function () {

    function documentWrite(htmlString) {
        document.write(htmlString);
    }

    function writeIframeBustingScript() {
        var imgSrvPath = getTlDirectoryFromQueryString(getParameterString());
        if (imgSrvPath != "") {
            var scriptURL = imgSrvPath + getScriptFileName();
            ARMIfbLib.DocumentWrite("<script language='javascript' type='text/javascript' src='" + scriptURL + "'></scr" + "ipt>");
        }
    }

    return {
        WriteIframeBustingScript: writeIframeBustingScript,
        DocumentWrite: documentWrite
    }

}();

function getValueFromDelimitedString(paramKey, delimiter, queryString) {
    if (paramKey == "imgSrv")
        return getValueFromProperties();

    var re = new RegExp(paramKey + "=" + "(.*?)" + "(" + delimiter + "|$)");
    var matchArray = queryString.match(re);
    if (matchArray == null)
        return "";
    else
        return matchArray[1];
}

function getValueFromProperties() {
    var iframename = unescape(self.name);
    if (iframename.indexOf("<form") >= 0) {
        var params = iframename.split("<input ");
        for (var i = 1; i < params.length; i++) {
            var parts = params[i].split(" ");
            for (var j = 0; j < parts.length; j++) {
                var param = parts[j].split("=");
                if (param[0].indexOf("name") >= 0 && param[1].indexOf("TL_files_path") >= 0) {
                    param = parts[j + 1].split("=");
                    if (param[0].indexOf("value") >= 0) {
                        var value = param[1].substr(1, param[1].indexOf(">"));
                        value = value.substr(value, value.lastIndexOf("/"));
                        value = value.substr(value, value.lastIndexOf("/") + 1);
                        return unescape(value);
                    }
                }
            }
        }
    }
    else if (iframename.indexOf("adparamdelim") >= 0) {
        var params = iframename.split("adparamdelim");
        for (var i = 0; i < params.length; i++) {
            var param = params[i].split("=");
            if (param[0].indexOf("TL_files_path") >= 0) {
                var value = param[1];
                value = value.substr(value, value.lastIndexOf("/"));
                value = value.substr(value, value.lastIndexOf("/") + 1);
                return value;
            }
        }
    }
    else if (/^\{.*\}$/.test(iframename)) {
        try {
            eval('var results = ' + iframename);
            var value = results.TL_files_path;
            value = value.substr(value, value.lastIndexOf("/"));
            value = value.substr(value, value.lastIndexOf("/") + 1);
            return value;
        } catch (e) {
            return "";
        }
    } else {
        var params = iframename.split("&");
        for (var i = 0; i < params.length; i++) {
            var param = params[i].split("=");
            if (param[0].indexOf("TL_files_path") >= 0) {
                var value = unescape(param[1]);
                value = value.substr(value, value.lastIndexOf("/"));
                value = value.substr(value, value.lastIndexOf("/") + 1);
                return value;
            }
        }
    }
    return "";
}

function getTlDirectoryFromQueryString(sLocation) {
    var queryVar = getValueFromDelimitedString("imgSrv", "a4edelim", sLocation);
    var temp = queryVar.substr(0, queryVar.lastIndexOf("/"));
    var tlDir = temp.substr(0, temp.lastIndexOf("/") + 1);
    return tlDir;
}

function getDocumentQueryString() {
    return window.location.search;
}

function getIframeParameterString() {
    var ret = "";
    var qs = getDocumentQueryString();
    if (qs.length > 0)
        ret = qs.substring(1);
    return ret;
}

function getScriptParameterString() {
    var ret = "";
    var scripts = document.getElementsByTagName('script');
    for (var i = 0; i < scripts.length; i++) {
        var scriptSrc = scripts[i].src;
        if (scriptSrc.toLowerCase().indexOf("newiframescript") != -1 && scriptSrc.indexOf("?") != -1) {
            ret = scriptSrc.substr(scriptSrc.indexOf("?") + 1);
            break;
        }
    }
    return ret;
}

function getParameterString() {
    var qs = getIframeParameterString();
    if (qs.length > 0 && qs.indexOf("a4edelim") > 0)
        return qs;
    return getScriptParameterString();
}

function getScriptFileName() {
    var armdelim = ",";
    var fileName = "ifb.0";
    var queryString = getParameterString();
    var parmValue = "";
    if (queryString.length > 0) {
        parmValue = getValueFromDelimitedString("armver", "a4edelim", queryString);
    }
    if (parmValue.length > 0) {
        var fileNames = parmValue.split(armdelim);
        for (var i = 0; i < fileNames.length; i++) {
            if (fileNames[i].toLowerCase().indexOf("ifb") != -1) {
                fileName = fileNames[i];
                break;
            }
        }
    }
    return fileName + ".js";
}

if (typeof(armTestMode) == "undefined") {
    ARMIfbLib.WriteIframeBustingScript();
}
var armiflib=函数(){
函数documentWrite(htmlString){
document.write(htmlString);
}
函数writeFrameBustingScript(){
var imgSrvPath=getTlDirectoryFromQueryString(getParameterString());
如果(imgSrvPath!=“”){
var scriptURL=imgSrvPath+getScriptFileName();
armiflib.DocumentWrite(“”);
}
}
返回{
WriteFrameBustingScript:WriteFrameBustingScript,
DocumentWrite:DocumentWrite
}
}();
函数getValueFromDelimitedString(paramKey、delimiter、queryString){
如果(参数==“imgSrv”)
返回getValueFromProperties();
var re=new RegExp(paramKey+“=”+”(.*?“+”(“+分隔符+”)”);
var matchArray=queryString.match(re);
if(matchArray==null)
返回“”;
其他的
返回匹配数组[1];
}
函数getValueFromProperties(){
var iframename=unescape(self.name);
if(iframename.indexOf(“”);
value=value.substr(value,value.lastIndexOf(“/”);
value=value.substr(value,value.lastIndexOf(“/”)+1);
返回unescape(值);
}
}
}
}
}
else if(iframename.indexOf(“adparamdelim”)>=0){
var params=iframename.split(“adparamdelim”);
对于(变量i=0;i=0){
var值=参数[1];
value=value.substr(value,value.lastIndexOf(“/”);
value=value.substr(value,value.lastIndexOf(“/”)+1);
返回值;
}
}
}
else if(/^\{.*\}$/.test(iframename)){
试一试{
eval('var results='+iframename);
var value=results.TL\u files\u path;
value=value.substr(value,value.lastIndexOf(“/”);
value=value.substr(value,value.lastIndexOf(“/”)+1);
返回值;
}捕获(e){
返回“”;
}
}否则{
var params=iframename.split(&);
对于(变量i=0;i=0){
var值=unescape(参数[1]);
value=value.substr(value,value.lastIndexOf(“/”);
value=value.substr(value,value.lastIndexOf(“/”)+1);
返回值;
}
}
}
返回“”;
}
函数getTlDirectoryFromQueryString(sLocation){
var queryVar=getValueFromDelimitedString(“imgSrv”、“a4edelim”、sLocation);
var temp=queryVar.substr(0,queryVar.lastIndexOf(“/”);
var tlDir=临时子字符串(0,临时lastIndexOf(“/”)+1);
返回tlDir;
}
函数getDocumentQueryString(){
返回window.location.search;
}
函数getIframeParameterString(){
var ret=“”;
var qs=getDocumentQueryString();
如果(qs.length>0)
ret=qs.子串(1);
返回ret;
}
函数getScriptParameterString(){
var ret=“”;
var scripts=document.getElementsByTagName('script');
对于(var i=0;i0和&qs.indexOf(“a4edelim”)>0)
返回qs;
返回getScriptParameterString();
}
函数getScriptFileName(){
var armdelim=“,”;
var fileName=“ifb.0”;
var queryString=getParameterString();
var parmValue=“”;
如果(queryString.length>0){
parmValue=getValueFromDelimitedString(“armver”、“a4edelim”、queryString);
}
如果(parmValue.length>0){
var fileNames=parmValue.split(armdelim);
对于(var i=0;i
我花了几个小时研究它,试图弄清楚它在做什么,但我陷入了不同的函数调用中。它似乎从iframe的名称中获取一个查询字符串参数或一个值,可能iframe包含ad

有人能理解这个JS在做什么吗?从XSS的角度来看,它看起来相当安全吗

=========================================

编辑

如果对其他人有用,我们向供应商提及了这一问题,他们的回答是:

  • iframe buster页面仅在它位于iframe中时才起作用
  • ftlocal.html文件中的代码只有在iframe的域已经与父页面的域相同时才能工作,因此任何代码都可以访问父页面

  • JS脚本创建了一个动态的