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

时间:2013-08-30 16:56:51

标签: javascript security sanitization

我有一个数据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 个答案:

答案 0 :(得分:3)

不要让它们包含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,以确认请求已成功并已完成。

答案 1 :(得分:0)

这很难做到。 JavaScript中没有本质上恶意关键字或函数,还有恶意应用程序。您可能会对“恶意”活动产生误报,并阻止执行具有实际目的的合法代码。与此同时,任何有一点想象力的人都可以绕过你可能实施的任何“预防性”方法。

我建议你寻找一种不同的方法。这是其中一个问题(如CAPTCHA),其中人类无法解决这些问题,而机器实际上是不可能的。您可以尝试让主持人或某些人工评估员来解释代码并接受它。

答案 2 :(得分:0)

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

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

答案 3 :(得分:-3)

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

这一切都取决于它的放置位置,当然:

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

在一天结束时,只需don't be Yahoo