gpt4 book ai didi

php - 从字符串重新创建 HTML 文档的正确方法?

转载 作者:行者123 更新时间:2023-12-02 20:15:07 26 4
gpt4 key购买 nike

首先,我很便宜! :) 我买不起我的域名的静态 IP,也买不起那些花哨的证书...所以我没有 SSL/HTTPS。

我在这里想要完成的是推出我自己的“HTTP 加密”。这是我到目前为止所取得的成就:

  1. 修改了现有代理脚本 (Glype/PHProxy) 以“加密”(目前为 Base64)回显输出。 (顺便说一句,我将整个内容包装在 body 元素中)
  2. 编写了一个 GreaseMonkey 脚本来“解密”加密的输出。

这东西适用于简单的网站。但是当我加载复杂的网站(如浏览器游戏)时,JavaScript 就被破坏了(顺便说一句,当我关闭加密时,脚本可以完美地呈现游戏)。

通过 FireBug 检查后,我注意到 head 元素的内容被放置在 body 元素中。这种情况并不总是发生,所以我怀疑 PHP 抛出了格式错误的输出,但我使用离线工具解码了 Base64,并且 HTML 看起来没问题。

这是 PHP 的示例输出:

<html><body>PGh0bWw+DQo8aGVhZD4NCjx0aXRsZT5IZWxsbzwvdGl0bGU+DQo8L2hlYWQ+DQo8Ym9keT4NCjxoMT5IZWxsbyBXb3JsZDwvaDE+DQo8L2JvZHk+DQo8L2h0bWw+</body></html>

这是从 Firebug 解码的 HTML(经过 GM 脚本处理后):

<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>

这是我用于解码 PHP 输出的 GM 脚本:

function utf8_decode (str_data) {
var tmp_arr = [],
i = 0,
ac = 0,
c1 = 0,
c2 = 0,
c3 = 0;

str_data += '';

while (i < str_data.length) {
c1 = str_data.charCodeAt(i);
if (c1 < 128) {
tmp_arr[ac++] = String.fromCharCode(c1);
i++;
} else if (c1 > 191 && c1 < 224) {
c2 = str_data.charCodeAt(i + 1);
tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
i += 2;
} else {
c2 = str_data.charCodeAt(i + 1);
c3 = str_data.charCodeAt(i + 2);
tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}

return tmp_arr.join('');
}

function base64_decode (data) {
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
ac = 0,
dec = "",
tmp_arr = [];

if (!data) {
return data;
}

data += '';

do { // unpack four hexets into three octets using index points in b64
h1 = b64.indexOf(data.charAt(i++));
h2 = b64.indexOf(data.charAt(i++));
h3 = b64.indexOf(data.charAt(i++));
h4 = b64.indexOf(data.charAt(i++));

bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;

o1 = bits >> 16 & 0xff;
o2 = bits >> 8 & 0xff;
o3 = bits & 0xff;

if (h3 == 64) {
tmp_arr[ac++] = String.fromCharCode(o1);
} else if (h4 == 64) {
tmp_arr[ac++] = String.fromCharCode(o1, o2);
} else {
tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
}
} while (i < data.length);

dec = tmp_arr.join('');
dec = utf8_decode(dec);

return dec;
}

document.documentElement.innerHTML = base64_decode(document.body.innerHTML);

我认为问题是我将解码后的 HTML 分配给 document.documentElement.innerHTML,并且这样做会将整个内容放入 body 元素中?

所以问题是,从字符串重新创建 HTML 文档的正确方法是什么?

最佳答案

由于您只是使用 Base 64 编码,并且正如 @Battle_707 所说,问题出在 dom 事件上,为什么不发送一个重定向到 data url 的页面呢? 。这样浏览器应该触发所有正确的事件。

但是说真的,只要获得证书并访问 dyndns.com,base 64 就不会为您带来额外的安全性

编辑

既然您提到转向 AES,如果您能找到 JS AES 实现,您可以使用我的建议,构建数据 URL 客户端并重定向到该客户端。

function openPageFromString(html){
location="data:text/html,"+encodeURIComponent(html);
}

关于php - 从字符串重新创建 HTML 文档的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6406842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com