因此,我最近一直在编写一个脚本来混淆客户端代码,以保护知识产权,而不会干扰结果页面的外观或交互性。过程如下:
- HTTP 请求进来,.htaccess 重定向 (.*) 到 parse_request.php
- parse_request.php 创建一个“phpURLParser”类,其类变量本质上是 $_SERVER 变量的副本
- phpURLParser 查看请求的路径,有时还会查看主机、引用者或其他服务器端信息以确定如何做出反应。有几种可能的反应
一种。请求的对象是 .js 或 .css 文件。将文件传递给 YUI Compressor 并发送输出
湾。请求的对象是图像或应用程序。通过文件而不做任何更改
C。请求的对象包含 HTML。将每个 ASCII 字符替换为其等效的 2 位十六进制字符并发送以下 javascript:
<script type="text/javascript">
var x="~lots of hex~";
var y="";
for(i=0; i<x.length; i+=2){
y += unescape('%'+x.substr(i,2));
}
document.write(y);
</script>
所以网站被大量的十六进制和一个小的 javascript 所取代,以将十六进制恢复为原始形式。我在examples.chikachu.com/colorbox/example1上有一个这个设置的例子(我没有编码ColorBox,它是一个免费的jQuery工具,我选择使用它,因为它允许我测试几个不同的javascript特性并确保它们都工作)
现在解决问题:
事实证明,这在 99% 的时间里都有效。但是 AJAX 让它生气了。单击其中一个 AJAX 示例(在“其他内容类型”下)看起来会将您重定向到新页面。但是,查看地址栏或查看页面源代码将证明您仍在同一页面上。使用 Chrome 中的 Inspect Element 工具(或 Firefox 中的 Firebug)将显示网页的内容完全被 AJAX 请求的内容所取代。
如果我稍微修改 parse_request.php 以允许 AJAX 请求的文件不受伤害地通过,一切正常。没问题。因此,出于某种原因,我的脚本用有意义的 HTML 对应物替换了十六进制字符串,它覆盖了整个网站,而不是很好地将自身插入到 <div> 对象的范围内。
基本上这里是预期的非混淆 HTML:
<html>
<head>
...
</head>
<body>
<div id="colorbox">
<INSERT AJAX HERE>
</div>
...
</body>
</html>
仅对 AJAX 进行了混淆,我期望以下内容:
<html>
<head>
...
</head>
<body>
<div id="colorbox">
<script type="text/javascript">
var x="asdfasdfasdfasdf";
var y="";
for(i=0; i<x.length; i+=2){
y += unescape('%'+x.substr(i,2));
}
document.write(y);
</script>
</div>
...
</body>
</html>
我希望此处的 document.write() 行将在 javascript 的位置(在 <div> 内)写入 y。如果我弄错了,那不是 document.write() 的工作方式,我仍然希望它在文档末尾写 y 。而是将整个文档替换为 y。为什么会这样,我的解决方案是什么?