【问题标题】:Javascript - Sanitize Malicious code from file (string)Javascript - 从文件中清理恶意代码(字符串)
【发布时间】:2013-12-10 03:11:23
【问题描述】:

我有一个数据 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,因为在文件中的索引 0 处找到了单词 alert。

问题:

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

【问题讨论】:

  • 你的方法没用。您将永远无法检测到所有可能的恶意行为。你需要重新考虑你是如何做事的。或许提供有关此文件是什么以及您需要如何使用它的更多背景信息?
  • Javascript 足够动态,这非常困难。使用 Google Caja。
  • @DarkFalcon 这是一个文件,其中包含地图节点和有关这些节点的信息(位置、名称等)。我们将它们显示在地图上。这些节点通过第三方交付给我们。
  • @SLaks 感谢您的建议,我将查找 Google Caja。同时,你有恶意代码的例子吗?
  • eval("a"+"lert(1)"); 等...

标签: javascript security sanitization


【解决方案1】:

不要让它们包含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 并访问每个NameType 属性。

随机注:

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

【讨论】:

  • 嗨伊恩,明确设置客户端对象的 readyState 和状态有什么作用?是否有状态和状态列表以及它们在某处的含义?
  • 另外,我似乎无法让 JSON.parse 正常工作,它总是落入 catch 子句。有什么我必须包含的东西才能使用它吗?
  • 糟糕,没关系,它只是拾取了不正确的 json 并且失败了。问题是即使我只有 json 数据,它仍然无法正常工作。它看到第一个名称节点和炸弹
【解决方案2】:

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

我建议您寻找不同的方法。这是其中一个问题(如 CAPTCHA),人类解决起来很简单,而机器几乎不可能解决。您可以尝试让版主或人工评估员来解释代码并接受它。

【讨论】:

  • 您好,感谢您提供的信息。该文件仅包含地图的数据节点。我们永远不会有真正目的的合法代码。所以我可以安全地搜索代码,如果找到,总是假设它是恶意的
  • @jordan.peoples 啊,我还以为是一般的代码。那么我建议,不要将所有可能的恶意代码“列入黑名单”,而是将你所期望的内容“列入白名单”。例如,使用 RegEx 匹配数据节点,如果 确实 匹配它接受它。
【解决方案3】:

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

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

【讨论】:

  • 我们都知道这一点,但如果另一组变得恶意(比如被解雇,每天都会发生)并且在他们最后一次上传时,他们将数据文件更改为包含代码,因为它只是文本。 ……然后呢?
  • @jordan.peoples:这正是您应该始终将其视为文本的原因,因此它不能包含代码。
  • 任何东西都可以包含代码,一切都是javascript中的文本。
  • @jordan.peoples:只要你从不将其视为代码——永远不要调用eval,并且始终安全地连接,没关系。
【解决方案4】:

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

当然,这完全取决于放置的位置:

  • 数据库:mysql_real_escape_string 或您使用的任何引擎的等效项。
  • HTML:htmlspecialchars 在 PHP 中,createTextNode.replace(/</g,"<") 在 JavaScript 中
  • JavaScript:json_encode 在 PHP 中,JSON.stringify 在 JavaScript 中。

最后,只需don't be Yahoo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多