仅在执行服务器端数据时在javascript中使用eval是否安全?

纪尧姆铁

是的,它与这个问题有点类似,但是@apsillers给出的答案是一个超级答案,因为它指出了该问题的一个新方面,而上一个问题中并未提到。另一个帮助我更好地理解eval()安全问题到底是什么的SO问题是该问题

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

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

每次发生时,我都有两种选择:要么将内容合并到手工制作的脚本标签中,要么将其注入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循环中),则该属性的值将为evaled:

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

您可以通过执行自有财产检查来解决此问题:

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

eval 还会导致严重的性能下降,并导致无法优化的可变范围情况,但这不是安全问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在生产中使用服务器端 firebase-admin(实时数据库)允许所有读/写权限是否安全?

如何在 next.js 中使用来自客户端的数据执行服务器端代码

Nuxt:仅在服务器端获取数据

仅在服务器端使用证书

不使用数据库时,是否需要在服务器端绑定数据列表标签

仅在初始页面加载时使用服务器端渲染

在php服务器端使用js验证,是否安全?

在Node.js的服务器端使用AWS Cognito是否安全?

是否可以使用Apollo Server在服务器端本地执行变异或查询

使用angular js时如何执行服务器端重定向

如何在JavaScript中使用服务器端倒数计时器?

如何防止使用JavaScript执行服务器端功能?

尝试在EPiServer中使用ReactJS.Net服务器端渲染时出现错误

如何在Android中使用AQuery从服务器端获取数据?

Android:使用Parse时使用服务器端

使用 LINQ Skip Take on Cosmos 数据库是否支持服务器端分页?

PHP服务器端处理是否计入“移动数据使用量”

使用数据表在 php 中发布数据 javascript 服务器端

设置服务器端变量以在JavaScript中使用的不同方法的优点

如何在服务器端Blazor中使用Bing Javascript Map?

从服务器端使用弹出窗口时的BlockUI

在服务器端渲染时使用cookie的ReactJS

使用服务器端 REST 调用时,PayPal Javascript SDK 是否支持 AUTHORIZE 意图?

使用服务器端处理时,防止为初始页面加载数据

数据表服务器端-使用HTML

使用异步数据获取的服务器端渲染

从服务器端使用 Laravel/Lumen 插入数据

使用哪个,会话,Cookie,服务器端数据?

Marklogic 服务器端 Javascript:使用显式提交时的 XDMP-CONFLICTINGUPDATES