验证字符串是否为有效的JavaScript

时间:2014-03-23 17:08:45

标签: javascript node.js eval

我正在创建一个能够证明XSS危险的网站。用户将尝试使用XSS漏洞执行JavaScript。

但是,我在确定JavaScript是否实际执行时遇到了问题,因此我可以记录用户是否成功。我将在node.js服务器上运行这些检查。

如果用户成功,我最初计划对包含JavaScript的部分运行eval,但认为这样做会太危险,因为它会在服务器端运行并且可能会使服务器被利用。

有没有办法使用JavaScript来验证字符串是否是运行eval以外的有效JavaScript?或者有没有办法在不使我的服务器面临风险的情况下运行eval

3 个答案:

答案 0 :(得分:5)

您可以使用esprima javascript解析器查看字符串是否是有效的javascript语法。

使用npm install esprima安装。

使用:

var esprima = require('esprima');

var userStringToTest = 'var a = 10;';

var isValid = isValidJs(userStringToTest);

if(isValid) {
  console.log('its valid!');
}
else {
  console.log('its NOT valid!');
}

function isValidJs(testString) {
  var isValid = true;
  try {
    esprima.parse(testString);
  }
  catch(e) {
    isValid = false;
  }
  return isValid;
}

@FelixKing在他的评论中指出,这当然不会检测运行时错误。但是对于你的用例,听起来你应该测试语法错误而不是运行时错误,因为这样更严格,并且真的不应该是有效的javascript语法。

答案 1 :(得分:1)

您需要的是一个JavaScript沙箱,它将代码与运行它的代码隔离开来。

有几种可供选择。我已经使用过" Sandbox"之前:http://gf3.github.io/sandbox/

在沙箱中执行他们的代码,查看是否有错误,返回输出。

答案 2 :(得分:0)

Google Caja将是一个很好的解决方案。

  

Caja编译器是一种可以安全地嵌入您网站的第三方HTML,CSS和JavaScript的工具。

有多个包装器可以让您在节点服务器上运行它,例如:https://github.com/theSmaw/Caja-HTML-Sanitizer