1

我有一个数据 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. 我应该搜索哪些特定关键字以防止恶意代码被运行?即重定向、弹出窗口、声音等......
4

4 回答 4

4

不要让它们包含var IAmGoodData =,而是让它们简单地提供 JSON(这基本上是文件的其余部分,或者看起来是)。然后将其解析为 JSON,使用JSON.parse(). 如果失败,它们要么没有很好地遵循 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,以了解请求成功并已完成。

于 2013-08-30T17:41:29.530 回答
0

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

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

于 2013-08-30T17:10:09.267 回答
0

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

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

于 2013-08-30T17:30:09.360 回答
-3

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

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

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

在一天结束时,不要成为雅虎

于 2013-08-30T17:02:06.217 回答