0

因此,我最近一直在编写一个脚本来混淆客户端代码,以保护知识产权,而不会干扰结果页面的外观或交互性。过程如下:

  1. HTTP 请求进来,.htaccess 重定向 (.*) 到 parse_request.php
  2. parse_request.php 创建一个“phpURLParser”类,其类变量本质上是 $_SERVER 变量的副本
  3. 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。为什么会这样,我的解决方案是什么?

4

2 回答 2

1

回答你最后一个问题:打电话

document.write('my_precious_html_code');

将根据何时调用(在 onLoad 事件之前或之后)在页面上附加或覆盖文本。你不应该使用它任何脚本。在此处阅读更多信息:http: //javascript.crockford.com/script.html

一般回答:混淆 HTML 代码没有任何意义。就像在 90 年代后期通过禁用鼠标右键来保护图像一样。我花了不到 3 秒的时间来“破解”你的混淆代码并获得格式精美的 HTML。此外,您的网站以怪癖模式呈现,这可能是您不想要的。

于 2010-09-28T17:39:49.237 回答
0

尝试这样的事情:

<html> 
<head> 
    ... 
</head> 
<body> 
    <div id="colorbox">
        <div id="MYAJAXCONTENT">
        </div>
        <INSERT AJAX HERE> 
    </div> 
    ... 
</body> 
</html> 

<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.getElementById('MYAJAXCONTENT').innerHTML = y; 
        // for the jQuery psychos out there
        // $('#MYAJAXCONTENT').html(y);
        </script> 
    </div> 
    ... 
</body> 
</html> 
于 2010-09-28T18:43:47.670 回答