Javascript-清除文件(字符串)中的恶意代码
我有一个数据javascript文件,它通过一些自定义代码动态添加到网站中。 此文件来自第三方供应商,该供应商可能会在文件中添加恶意代码 在将此文件添加到网站之前,我希望对其进行解析,并查找恶意代码,例如重定向或警报,这些代码会在项目/网站中包含的文件上执行 例如,我的js文件可能如下所示:Javascript-清除文件(字符串)中的恶意代码,javascript,security,sanitization,Javascript,Security,Sanitization,我有一个数据javascript文件,它通过一些自定义代码动态添加到网站中。 此文件来自第三方供应商,该供应商可能会在文件中添加恶意代码 在将此文件添加到网站之前,我希望对其进行解析,并查找恶意代码,例如重定向或警报,这些代码会在项目/网站中包含的文件上执行 例如,我的js文件可能如下所示: alert ('i am malicious'); var IAmGoodData = [ { Name :'test', Type:'Test2 }, { Name :'test1', Type:'Te
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处
问题:
你不应该。应该允许用户键入他们想要的任何内容,而显示它是您的工作 当然,这完全取决于它被放在哪里:
- 数据库:
或您正在使用的任何引擎的等效文件mysql\u real\u escape\u string
- HTML:
在PHP中,htmlspecialchars
或createTextNode
替换(/你不应该这样做。应该允许用户键入他们想要的任何内容,而显示它是你的工作 当然,这完全取决于它被放在哪里:
- 数据库:
或您正在使用的任何引擎的等效文件mysql\u real\u escape\u string
- HTML:
在PHP中,htmlspecialchars
或createTextNode
替换(/这是非常困难的。JavaScript中没有本质上恶意的关键字或函数,存在恶意的应用程序。您可能会得到“恶意”的误报同时,任何有一点想象力的人都可以绕过您可能实现的任何“预防性”方法
我建议你寻找一种不同的方法。这就是其中的一个问题(比如验证码)在这种情况下,人类很难解决,而机器几乎不可能解决。你可以尝试让一个主持人或一些人类评估员来解释代码并接受它。这是非常困难的。JavaScript中没有本质上恶意的关键字或函数,存在恶意的应用程序。你可以uld可能会因“恶意”活动而获得误报,并阻止执行具有真实目的的合法代码。同时,任何有点想象力的人都可以绕过您可能实施的任何“预防”方法
我建议你寻找一种不同的方法。这就是其中的一个问题(比如验证码)在这种情况下,人工解决问题很简单,而机器几乎不可能做到。您可以尝试让主持人或人工评估员解释代码并接受它。您应该让他们提供有效的JSON,而不是任意的Javascript。
然后,您可以调用
来读取它们的数据,而不会有代码执行的风险JSON.parse()
简而言之,数据不是代码,不应该包含代码。您应该让它们提供有效的JSON,而不是任意的Javascript。
然后,您可以调用
来读取它们的数据,而不会有代码执行的风险JSON.parse()
简而言之,数据不是代码,不应该包含代码。与其让它们包含
,不如让它们简单地提供JSON(这基本上就是文件的其余部分,或者看起来是)。然后使用var IAmGoodData=
。如果失败,它们要么没有很好地遵循JSON格式,要么有外部代码,在任何一种情况下,您都会忽略响应 例如,您希望从外部文件中获得如下数据:JSON.parse()将其解析为JSON
需要将其正确序列化为JSON(双引号而不是单引号,以及围绕键的双引号)[ { Name :'test', Type:'Test2' }, { Name :'test1', Type:'Test21' }, { Name :'test2', Type:'Test22' } ]
然后,您可以循环使用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
,不如让它们只提供JSON(这基本上就是文件的其余部分,或者看起来是)。然后使用var IAmGoodData=
,将其解析为JSON。如果失败,它们要么没有很好地遵循JSON格式,要么有外部代码,在任何一种情况下,您都会忽略响应 例如,您希望从外部文件中获得如下数据:JSON.parse()
需要将其正确序列化为JSON(双引号而不是单引号,以及围绕键的双引号)[ { Name :'test', Type:'Test2' }, { Name :'test1', Type:'Test21' }, { Name :'test2', Type:'Test22' } ]
然后,您可以循环使用var json; try { json = JSON.parse(client.responseText); catch (ex) { // Invalid JSON } if (json) { // Do something with the response }
并访问每个属性的json
和Name
属性 随机注:Type
在您的
回调中,确保检查客户端.onreadystatechange
,以了解请求已成功并已完成。您的方法是无用的。您将永远无法检测到所有可能的恶意操作。您需要重新考虑您的操作方式。也许提供有关此文件是什么以及如何使用它的更多上下文?Javascript是动态的,这非常困难。请使用Google Caja。@DarkFalcon它是一个包含地图节点和这些节点的信息(位置、名称等)的文件。我们将它们显示在地图上。这些节点是客户端.readyState===4&&client.status==200
- 数据库: