javascript - 当 JavaScript 中的 eval 只执行服务器端数据时,它是否安全?

标签 javascript ajax eval

是的,它有点像 this question ,但 @apsillers 给出的答案是一个 super 答案,因为它指出了问题的一个新方面,而上一个问题中尚未提及。另一个有用的问题是 that question 帮助我更好地理解 eval() 安全问题到底是什么。

我在我的 JavaScript 代码中使用了 eval(),我想知道我是否应该让它失望。

Principe:我有一个 ajax 调用,它初始化浏览器客户端和服务器之间的第一个连接。服务器运行 PHP。规则是:当客户端在请求中发送变量'init'时,服务器端PHP获取必要脚本的内容,将每个脚本的内容作为一个新条目放入对象中(值是内容,名称是不带扩展名的文件名,并且对象是 PHP STD 类的实例),将整个对象转换为 JSON(按照惯例)并发送回所有内容。在客户端,当 httprequest 完成时,Javascript 获取该对象并对其执行简单的 for ... in () 操作。

每次出现时,我都有两个选择:要么将内容连接到手工制作的脚本标记中,然后将其注入(inject) HTML 页面的 head 中。或者我评估内容(我现在这样做),以便执行代码而不对 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 吗?或者它足够安全吗(因为只有管理员才能修改动态注入(inject)的脚本)?

最佳答案

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编辑:

Object.prototype.foo = "alert(1);";

您可以通过强制执行自有属性检查来解决此问题:

for(var s in o) {
    if(o.hasOwnProperty(s)) {
        eval(o[s]);
    }
}

eval还会导致显着的性能损失并产生无法优化的可变范围情况,但这不是安全问题。

关于javascript - 当 JavaScript 中的 eval 只执行服务器端数据时,它是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29369091/

相关文章:

php - 在php中格式化ajax json数据

javascript - 多个嵌套对象的 eval() 替代方法

Javascript 循环从数组中获取动态变量(和值),无需 eval

javascript - 无法在 Node 中获取css文件

c# - Umbraco 7 局部 View 宏观渲染

javascript - 为什么我的 Sprite 不会出现在我的背景之上?

javascript - 联系表单 Javascript/Ajax/PHP 无法正常工作

javascript - 如果eval()无法评估给定的字符串,则显示 “Syntax Error”

c# - 使用 jquery Post 将数组传递给 Controller

javascript - 为什么我不能在 React Native 中以编程方式添加到 props 中?