Discord window.localStorage未定义。如何在Discord页面上访问localStorage?

时间:2018-09-26 03:18:49

标签: javascript local-storage discord

当我在window.localStorage上运行https://stackoverflow.com时,它返回localStorage,但是当我在Discord页面上使用相同的命令时,它每次都会返回undefined

Discord正在执行某些操作以从客户端删除其localStorage吗?如果是这样,是否有办法在localStorage删除之前对其进行更改,防止其被删除或以其他任何方式在undefined之前对其进行访问?

有什么帮助吗?

4 个答案:

答案 0 :(得分:2)

就像用户AkiraMiura提到的那样-“ Discord”页面开发人员已删除window.localStorage属性。他们这样做的方式如下(来自 Reddit post ):

  

Discord如何隐藏localStorage?
  ....

(function()
{
    var privateLocalStorage = window.localStorage;
    delete window.localStorage;
    console.log(privateLocalStorage);
}());
console.log(window.localStorage); //undefined
     

他们在所有本地存储操作所在的位置创建一个闭包,并将localStorage复制到变量,然后从窗口中删除对象。

但是我们可以使用iframe中的localStorage

如果您要使用Discord页面上的 localStorage 来进行还原,则可以使用iframe.src = 'about:blank';从新的iframe中获取它,这使您可以进行工作带有“ Discord”页面的已存储项目。您可以这样写:

window.localStorage = iframe.contentWindow.localStorage;

在iframe加载之后,但是这个localStorage对象来自iframe,因此,您无需编写它-更好的是,如下面的代码所示。

您可以在开发人员控制台中将以下代码放在 "Discord" page 上,您将在控制台输出中获得如下内容:

  

“ 45235333 ... WKDrSWDKIS”

别忘了之前在“ Discord”页面上登录!(甚至不必在此页面上登录)。

代码

var iframe = document.createElement('iframe');
iframe.onload = function()
{
    //Iframes must be appended to the DOM in order to be loaded
    //Iframes do not load immediately nor synchronously
    //now (after load) we can use iframe.contentWindow:
    //window.localStorage = iframe.contentWindow.localStorage; //you can use it, but better is like:
    var ifrLocalStorage = iframe.contentWindow.localStorage;
    //But DO NOT: "document.body.removeChild(iframe);" because after it access on 'Storage' will be denied
    console.log(ifrLocalStorage.getItem('fingerprint'));
    //OUTPUT: "45235333...WKDrSWDKIS"
};
iframe.src = 'about:blank';
document.body.appendChild(iframe);

祝你好运!

答案 1 :(得分:1)

您仍然可以通过编程方式获得访问权限。他们已删除window.localStorage。这是窗口实例的自有属性,但不是数据属性,而是访问器。访问者的get是一种品牌方法,它将返回内部具有localStorage插槽的任何接收者的localStorage值。当前窗口的实际内部localStorage插槽仍然存在,因此您需要的是另一个品牌的get localStorage函数。幸运的是,您可以获得很多方法。

function getLocalStoragePropertyDescriptor() {
  const iframe = document.createElement('iframe');
  document.head.append(iframe);
  const pd = Object.getOwnPropertyDescriptor(iframe.contentWindow, 'localStorage');
  iframe.remove();
  return pd;
}

// You can use pd.get.call, pd.get.apply, or use Reflect.apply; but the simplest
// thing to do is probably to just restore the original property:

Object.defineProperty(window, 'localStorage', getLocalStoragePropertyDescriptor());

window.localStorage.heeeeey; // yr old friend is bak

如果这是一场军备竞赛,则有兴趣隐藏localStorage的一方可以尝试通过返回窗口对象引用的DOM修补每个方法和访问器。即使它们成功了,但最终的词总是在用户方:浏览器扩展内容脚本,其清单文件声明必须在任何其他代码之前对其进行评估。 (这就是为什么可以进行广告拦截的原因。)

存储(无论是sessionStorage实例还是localStorage实例)均不用于保存敏感数据。它根本不受保护。似乎试图隐藏起来,暗示它可能被滥用了。

答案 2 :(得分:0)

reddit上找到。 TL; DR,他们将window.localStorage移至另一个变量,然后删除window.localStorage。

我发现获得localStorage的一种方法(虽然是手动)如下:

1:转到https_discordapp.com_0.localstorage

2:在SQLite Studio中打开https_discordapp.com_0 > Tables > ItemTable

3:转到Data,然后双击它。

4:在00标签下,双击一个值,然后读取/转换十六进制数据,并删除所有其他X十六进制。

答案 3 :(得分:-1)

实际上,我想写其他这篇帖子的解决方案,更流畅。完全加载Discord网站后,将以下代码复制并粘贴到浏览器的控制台中,则window.localStorage还不是undefined

(() => {
  const iframe = document.createElement('iframe');
  iframe.style.display = 'none';
  document.body.prepend(iframe);
  window.localStorage = iframe.contentWindow.localStorage;
  iframe.remove();
})();

Discord开发团队从全局localStorage对象中删除了window键,因此我再次创建并将其添加到DOM之前以使用其localStorage