Javascript-清除文件(字符串)中的恶意代码

Javascript-清除文件(字符串)中的恶意代码,javascript,security,sanitization,Javascript,Security,Sanitization,我有一个数据javascript文件,它通过一些自定义代码动态添加到网站中。 此文件来自第三方供应商,该供应商可能会在文件中添加恶意代码 在将此文件添加到网站之前,我希望对其进行解析,并查找恶意代码,例如重定向或警报,这些代码会在项目/网站中包含的文件上执行 例如,我的js文件可能如下所示: alert ('i am malicious'); var IAmGoodData = [ { Name :'test', Type:'Test2 }, { Name :'test1', Type:'Te

我有一个数据javascript文件,它通过一些自定义代码动态添加到网站中。 此文件来自第三方供应商,该供应商可能会在文件中添加恶意代码

在将此文件添加到网站之前,我希望对其进行解析,并查找恶意代码,例如重定向或警报,这些代码会在项目/网站中包含的文件上执行

例如,我的js文件可能如下所示:

alert ('i am malicious');
var IAmGoodData = 
[
{ Name :'test', Type:'Test2 },
{ Name :'test1', Type:'Test21' },
{ Name :'test2', Type:'Test22' }
]
我通过XMLHttpRequest调用将该文件加载到一个对象中,当该调用返回时,我可以使用变量(即我的文件文本)并在其中搜索单词:

var client = new XMLHttpRequest();
client.open('GET', 'folder/fileName.js');

client.onreadystatechange = function() 
{
        ScanText(client.responseText);
}
client.send();

function ScanText(text)
{
        alert(text);
        var index = text.search('alert');  //Here i can search for keywords
}
最后一行将返回索引0,因为单词alert位于文件的索引0处

问题:

  • 有没有更有效的方法来搜索文件中的关键字
  • 我应该搜索哪些特定关键字来防止运行恶意代码?ie重定向、弹出窗口、声音等

  • 你不应该。应该允许用户键入他们想要的任何内容,而显示它是您的工作

    当然,这完全取决于它被放在哪里:

    • 数据库:
      mysql\u real\u escape\u string
      或您正在使用的任何引擎的等效文件

    • HTML:
      htmlspecialchars
      在PHP中,
      createTextNode
      替换(/你不应该这样做。应该允许用户键入他们想要的任何内容,而显示它是你的工作

      当然,这完全取决于它被放在哪里:

      • 数据库:
        mysql\u real\u escape\u string
        或您正在使用的任何引擎的等效文件

      • HTML:
        htmlspecialchars
        在PHP中,
        createTextNode
        替换(/这是非常困难的。JavaScript中没有本质上恶意的关键字或函数,存在恶意的应用程序。您可能会得到“恶意”的误报同时,任何有一点想象力的人都可以绕过您可能实现的任何“预防性”方法


        我建议你寻找一种不同的方法。这就是其中的一个问题(比如验证码)在这种情况下,人类很难解决,而机器几乎不可能解决。你可以尝试让一个主持人或一些人类评估员来解释代码并接受它。

        这是非常困难的。JavaScript中没有本质上恶意的关键字或函数,存在恶意的应用程序。你可以uld可能会因“恶意”活动而获得误报,并阻止执行具有真实目的的合法代码。同时,任何有点想象力的人都可以绕过您可能实施的任何“预防”方法


        我建议你寻找一种不同的方法。这就是其中的一个问题(比如验证码)在这种情况下,人工解决问题很简单,而机器几乎不可能做到。您可以尝试让主持人或人工评估员解释代码并接受它。

        您应该让他们提供有效的JSON,而不是任意的Javascript。
        然后,您可以调用
        JSON.parse()
        来读取它们的数据,而不会有代码执行的风险


        简而言之,数据不是代码,不应该包含代码。

        您应该让它们提供有效的JSON,而不是任意的Javascript。
        然后,您可以调用
        JSON.parse()
        来读取它们的数据,而不会有代码执行的风险


        简而言之,数据不是代码,不应该包含代码。

        与其让它们包含
        var IAmGoodData=
        ,不如让它们简单地提供JSON(这基本上就是文件的其余部分,或者看起来是)。然后使用
        JSON.parse()将其解析为JSON
        。如果失败,它们要么没有很好地遵循JSON格式,要么有外部代码,在任何一种情况下,您都会忽略响应

        例如,您希望从外部文件中获得如下数据:

        [
        { Name :'test', Type:'Test2' },
        { Name :'test1', Type:'Test21' },
        { Name :'test2', Type:'Test22' }
        ]
        
        需要将其正确序列化为JSON(双引号而不是单引号,以及围绕键的双引号)

        var json;
        try {
            json = JSON.parse(client.responseText);
        catch (ex) {
            // Invalid JSON
        }
        
        if (json) {
            // Do something with the response
        }
        
        然后,您可以循环使用
        json
        并访问每个属性的
        Name
        Type
        属性

        随机注:


        client.onreadystatechange
        回调中,确保选中
        client.readyState==4&&client.status==200
        ,以了解请求已成功并已完成。

        与其让它们包含
        var IAmGoodData=
        ,不如让它们只提供JSON(这基本上就是文件的其余部分,或者看起来是)。然后使用
        JSON.parse()
        ,将其解析为JSON。如果失败,它们要么没有很好地遵循JSON格式,要么有外部代码,在任何一种情况下,您都会忽略响应

        例如,您希望从外部文件中获得如下数据:

        [
        { Name :'test', Type:'Test2' },
        { Name :'test1', Type:'Test21' },
        { Name :'test2', Type:'Test22' }
        ]
        
        需要将其正确序列化为JSON(双引号而不是单引号,以及围绕键的双引号)

        var json;
        try {
            json = JSON.parse(client.responseText);
        catch (ex) {
            // Invalid JSON
        }
        
        if (json) {
            // Do something with the response
        }
        
        然后,您可以循环使用
        json
        并访问每个属性的
        Name
        Type
        属性

        随机注:


        在您的
        客户端.onreadystatechange
        回调中,确保检查
        客户端.readyState===4&&client.status==200
        ,以了解请求已成功并已完成。

        您的方法是无用的。您将永远无法检测到所有可能的恶意操作。您需要重新考虑您的操作方式。也许提供有关此文件是什么以及如何使用它的更多上下文?Javascript是动态的,这非常困难。请使用Google Caja。@DarkFalcon它是一个包含地图节点和这些节点的信息(位置、名称等)的文件。我们将它们显示在地图上。这些节点是