【问题标题】:How to return a function instead of only values如何返回函数而不是仅返回值
【发布时间】:2021-09-27 16:39:14
【问题描述】:

这是我在服务器端的代码

socket.on('new message', msg => {
   io.emit('new message', {
     name: socket.username,
     msg: msg   
   });
  });

在客户端

socket.on('new message', function(data) {
    var item = document.createElement('div');
    item.textContent = data.name+data.msg;
    messages.appendChild(item);
    window.scrollTo(0, document.body.scrollHeight);
   });

它有效,但我想确保安全并尽可能少地公开源代码,所以我想知道这是否可以反过来做,像这样?

socket.on('new message', msg => {
   io.emit('new message', () => {
    var item = document.createElement('div');
    item.textContent = socket.username+msg;
    messages.appendChild(item);  
   });
  });

socket.on('new message', function(data) {
    data();
   });

这行不通,但如果有办法请告诉我。

【问题讨论】:

  • 你不能像从服务器端那样控制客户端。 javascript 必须在客户端上运行。
  • 我认为你不能通过socket.io发送不可序列化的数据
  • 更广泛地说,如果能够读取您的 JavaScript 源代码会为您打开安全漏洞,那么您的架构本身就有缺陷。浏览器内 JavaScript 的本质是至少需要以浏览器可读的格式传输源代码。
  • 你的意思是我需要序列化函数以便客户端可以接收它?
  • @snksaint 一个函数不可序列化...您可以发送一个字符串并在浏览器中对其进行评估,但在客户端评估字符串存储的代码默认情况下会导致灾难。客户端运行的代码不能被信任,默认情况下,您需要确保您的服务器验证所有输入数据,但在客户端,您无能为力(一切客户端都是用户-可修改)

标签: javascript node.js socket.io


【解决方案1】:

您似乎在使用socket.io,它通过 WebSockets 发送 JSON 数据,并且 JavaScript 函数无法序列化为 JSON。

您可以通过将代码作为字符串发送并调用 eval 在当前上下文中运行它来实现此功能。

但是除了不安全之外(如果发送的代码可能会受到用户输入的影响,并且没有适当的清理可能会导致在浏览器上远程执行代码),人们仍然可以看到正在发送和运行的代码他们的浏览器的网络选项卡或通过其他方式检查网络流量。

归根结底,您无法真正隐藏浏览器上运行的内容,您可以努力对其进行混淆(有很多工具可以做到这一点),但这只会让您更难弄清楚功能,并非不可能。

【讨论】:

  • 不是试图隐藏它,而是阻止用户最终更改它。
  • @snksaint 一个足够称职的用户可以通过多种方式实现这一点,因为代码在他们本地机器上的浏览器中运行。一个这样的例子是简单地从控制台将自己连接到您的 WebSocket 服务器并运行他们想要的任何功能。
  • @snksaint 没有什么能阻止用户在浏览器上更改 javascript 中的任何内容。您必须在适用的情况下进行服务器端验证和清理,并且不要将客户端代码用于后端算法。在您的特定情况下,什么可以阻止用户仅更改 socket.on 的原型并对后端发出的数据(或方法或其他)做任何他们想做的事情?
  • 所以你的意思是他们可以读取我在服务器端 js 文件中的所有内容??从const app = require("express")();一路向下??
  • @snksaint 不,只有发送到浏览器的代码,你不能(完全)隐藏那里的任何东西。最终用户无法查看/影响服务器端(或后端)上的代码。
【解决方案2】:

对不起,但我不明白你为什么要向用户隐藏将 div 附加到 dom。

任何真正想查看客户端逻辑的用户都可以这样做,因为他们已经可以使用所有内容。如果您试图“混淆”您的代码和逻辑,那么我建议您再考虑一下。

编辑:如果您真的想继续,请将其粘贴到浏览器开发工具的控制台选项卡中。

function a(b) {
  return b + 1;
}

String(a);

你应该可以弄明白的。

【讨论】:

  • @snksaint 这不是您在原始问题中想要做的示例。
  • 所以您希望在您的网站上发生 xss 攻击?好吧,继续吧。
  • 好好想想吧。您不再使用.createElement.innerText.appendChild。而且由于您在其中有 html 标签 (<span>),因此您必须执行类似 .innerHTML 的操作。现在,如果用户决定称自己为<script>alert('xss')</script>,该怎么办?
  • 不值得和你争论,因为很明显你对xss还不太了解。但我会告诉你,你所做的一切都是徒劳的。
  • @snksaint 现在更清楚了,您不知道 xss 是什么。请搜索一下什么是xss攻击。这是一个资源owasp.org/www-community/attacks/xss
猜你喜欢
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2017-03-10
  • 2013-09-17
  • 1970-01-01
相关资源
最近更新 更多