我如何执行一些JavaScript是一个字符串?
function ExecuteJavascriptString()
{
var s = "alert('hello')";
// how do I get a browser to alert('hello')?
}
我如何执行一些JavaScript是一个字符串?
function ExecuteJavascriptString()
{
var s = "alert('hello')";
// how do I get a browser to alert('hello')?
}
当前回答
该方法避免使用潜在风险的eval,提供了可调用的函数,对表达式求值器使用严格模式以获得额外的可靠性,并且比其他答案更简洁。
执行字符串命令
function string_cmd(sCmd) {
new Function(sCmd)();
}
求字符串表达式的值
function string_exp(sCmd) {
return Function(
`'use strict';
return (${sCmd})`
)();
}
用法:
const result = string_exp("2+2");
string_cmd("alert(result)");
https://codepen.io/johnaweiss/pen/mdKpyZL
其他回答
eval函数将对传递给它的字符串求值。
但是eval的使用是超级危险和缓慢的,所以要谨慎使用。
使用eval()。
W3学校评估之旅。网站有一些有用的例子的评估。Mozilla文档详细介绍了这一点。
你可能会得到很多关于安全使用的警告。不允许用户向eval()中注入任何东西,因为这是一个巨大的安全问题。
您还需要知道eval()具有不同的作用域。
检查了许多复杂和混乱的脚本:
var js = "alert('Hello, World!');" // put your JS code here
var oScript = document.createElement("script");
var oScriptText = document.createTextNode(js);
oScript.appendChild(oScriptText);
document.body.appendChild(oScript);
可以使用mathjs
来自上述链接的片段:
// evaluate expressions
math.evaluate('sqrt(3^2 + 4^2)') // 5
math.evaluate('sqrt(-4)') // 2i
math.evaluate('2 inch to cm') // 5.08 cm
math.evaluate('cos(45 deg)') // 0.7071067811865476
// provide a scope
let scope = {
a: 3,
b: 4
}
math.evaluate('a * b', scope) // 12
math.evaluate('c = 2.3 + 4.5', scope) // 6.8
scope.c
作用域是任何对象。因此,如果将全局作用域传递给evaluate函数,就可以动态地执行alert()。
此外,mathjs是比eval()更好的选择,因为它运行在沙箱中。
方法注入恶意JavaScript代码 表达式解析器。mathjs的表达式解析器提供了一个沙盒 环境来执行表达式,这应该是不可能的。 尽管有可能存在未知的安全漏洞, 所以一定要小心,尤其是在允许服务器端使用时 任意表达式的执行。
新版本的mathjs不使用eval()或Function()。
解析器会主动阻止对JavaScripts内部eval和 这些是安全攻击的主要原因。Mathjs 版本4及更新版本没有在底层使用JavaScript的eval。 版本3和更老的版本确实使用eval进行编译步骤。这不是 直接造成安全问题,但可能会导致更大的攻击 表面。
有点像@Hossein Hajizadeh alerady说的,不过更详细:
有一个替代eval()的方法。
函数setTimeout()被设计为在毫秒间隔后执行一些东西,而要执行的代码恰好格式化为字符串。
它是这样工作的:
ExecuteJavascriptString ();//只是为了运行它 ExecuteJavascriptString()函数 { Var s = "alert('hello')"; setTimeout (s, 1); }
1表示它将在执行字符串前等待1毫秒。
这可能不是最正确的方法,但它确实有效。