当eval只执行服务器端数据时,在javascript中使用eval是否安全
Is it safe to use eval in javascript when it only executes server-side data?
是的,这有点重复这个问题,但@apsillers给出的答案是一个超级答案,因为它指出了问题的一个新方面,而在上一个问题中没有提到。另一个帮助我更好地理解eval()安全问题的有用SO问题是
我在javascript代码中使用了eval(),我想知道是否应该让它失望。
Principe:我有一个ajax调用,它初始化浏览器客户端和服务器之间的第一个连接。服务器运行PHP。规则是:当客户端在请求中发送变量"init"时,在服务器端PHP获取必要脚本的内容,将每个脚本的内容作为一个新条目放入一个对象中(值是内容,名称是不带扩展名的文件名,对象是PHP STD Class的实例),将整个对象转换为JSON(按照惯例)并发回所有内容。在客户端,当httprequest完成时,Javascript获取对象并执行一个简单的for。。。在()中。
每次出现时,我都有两个选择:要么将内容插入手工制作的脚本标记中,然后将其注入HTML页面的头部。或者我评估内容(我现在这样做),以便在不向head标记收费的情况下执行代码。这主要是为了美观。
这是代码:
var xhr = null;
if (window.XMLHttpRequest || window.ActiveXObject) {
... //prepare the ajax request (initialize variable xhr)
}
var url = "index.php";
var params = "action=init";
xhr.open('POST', url, true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(params);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
var o = JSON.parse(xhr.responseText);
for(s in o) eval(o[s]);
}
}
我的问题是:在这种情况下,我是否应该避免使用eval?或者它是否足够安全(因为只有管理员才能修改动态注入的脚本)?
eval
的安全规则是:用户永远不应该eval
由另一个用户生成或修改的字符串。对于服务器创建的eval
字符串是完全安全的。毕竟,服务器提供的是页面的实际代码,所以如果它选择将该代码作为eval
字符串提供,就不一定存在安全问题。
就安全性而言,包含动态创建的<script>
元素与调用eval
元素基本上一样危险(或基本上一样安全)。唯一的区别是<script>
代码将始终在全局作用域中运行,而eval
可以在进行调用的词法作用域中执行,从而允许它从包含的函数中访问变量。这可能是可取的,也可能不是可取的,这取决于您期望脚本访问什么。
function f() {
var a = 5;
eval("alert(a);");
// an injected <script> wouldn't have access to `a`
}
eval
的潜在危险是,很难严格验证eval
的内容从未被其他用户生成或修改。在您的情况下,如果为Object.prototype
提供了任何可枚举属性(包括在for..in
循环中),则该属性的值将为eval
ed:
Object.prototype.foo = "alert(1);";
你可以通过强制执行自己的财产检查来解决这个问题:
for(var s in o) {
if(o.hasOwnProperty(s)) {
eval(o[s]);
}
}
eval
还会带来显著的性能损失,并造成无法优化的可变范围情况,但这不是安全问题。
- 推荐在JavaScript中执行存储为字符串的函数,而不是使用eval
- Javascript eval()无法处理传递的字符串
- Semi-sandboxing Javascript eval
- JavaScript 可以在这里使用 eval 吗?
- 如何使用uglifyjs/uglifyjs2解析walk和eval javascript表达式
- 当eval只执行服务器端数据时,在javascript中使用eval是否安全
- javascript eval方法语法
- 在Javascript中使用eval的替代方案
- 如何使eval'd调试器可访问的javascript代码
- JavaScript eval() and const
- 想要将 JSON 字符串传递给 javascript 变量 [ JSON.parse(),eval()] 对我不起作用,
- “语法错误:意外的令牌)”在 javascript 调用中,当 eval(value) 为空时
- mongo javascript --eval is failing
- 如何在javascript中的eval函数中添加单引号
- Javascript eval查询字符串
- 使用 eval JavaScript 创建动态变量
- Haskell, MongoDB, eval JavaScript
- eval() javascript如何安全地获得指示,如果它可以评估和防止异常
- 关联数组不能与eval() JavaScript一起工作
- iMacros w EVAL([javascript]} FORMAT尝试时出现错误,没有解决方案