通过PHP混淆javascript代码的简单方法

时间:2012-12-07 14:20:52

标签: php javascript jquery

我想免费下载给我的网络访问者,但我会隐藏下载链接,直到他们点击facebook like按钮。在他们喜欢它之后,jquery将使按钮处于活动状态并将“href”属性添加到标记,包含文件的路径,因此用户将能够单击该链接并下载该文件。

问题是,用户在浏览器中查看html源代码时可以轻松查看路径。 有什么简单的方法在PHP(我把JavaScript代码里面的javascript代码),使路径更难读?

当人们能够对其进行反混淆时,这很好。我只是想让非高级用户更难阅读,因此人们会考虑使用该链接,而不是找到一种方法来对代码进行反混淆。

谢谢

4 个答案:

答案 0 :(得分:2)

真正正确执行此操作的唯一方法当然是按下按钮以往返服务器以通过ajax或其他方式检索URL。

但是如果你不想这样做,只是想模糊它,那就有很多选择。例如,Base-64编码在PHP和JavaScript中都有很好的支持,因此您可以在PHP端编码路径(使用base64_encode)并在按下按钮时解码JavaScript(使用任何一个在Stack Overflow上讨论了几个解决方案here

答案 1 :(得分:1)

您可以尝试这样的事情:

ob_start();
# Insert regular JavaScript here...
$generatedoutput = ob_get_contents();
ob_end_clean();
$generatedoutput = str_replace("\\\r\n", "\\n", $generatedoutput);
$generatedoutput = str_replace("\\\n", "\\n", $generatedoutput);
$generatedoutput = str_replace("\\\r", "\\n", $generatedoutput);
$generatedoutput = str_replace("}\r\n", "};\r\n", $generatedoutput);
$generatedoutput = str_replace("}\n", "};\n", $generatedoutput);
$generatedoutput = str_replace("}\r", "};\r", $generatedoutput);
require('javascriptpacker.php');
$myPacker = new JavaScriptPacker($generatedoutput, 62, true, false);
$packed = $myPacker->pack();
echo($packed);

并添加这种方式:

<script language="JavaScript" type="text/javascript" src="js.php"></script>

N.B:最初来自sites.google.com/a/vansteenbeek.net/archive/obfuscate_javascript,现在是404

答案 2 :(得分:1)

也许您可以只存储路径服务器端,并且一旦项目被“喜欢”,前端就会将特殊代码传递给远程端点。

$([however you're binding to the like button]).on('click', function() {
 $.getJSON('/download_link.php', {'key': <some unique key>}, function(response) {
   if(response.status == 'valid') {
     $('<div><a href="' + response.path + '">Download the item now!</a></div>').appendTo('body');
   }
   else {
     alert('invalid security key');
   }
 });
});

如果您担心人们很容易看到例程,那就去打包机(http://dean.edwards.name/packer/)。这不安全,但它会阻止你的普通乔很容易看到代码。

仅供参考,上面的代码在打包时看起来像这样:

eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('$([m h\'9 e l 2 5 6]).7(\'8\', 3() {\n     $.b(\'/c.d\', {\'1\': <f g 1>}, 3(0) {\n       i(0.j == \'k\') {\n         $(\'<4><a n="\' + 0.o + \'">p 2 q r!</a></4>\').s(\'t\');\n       }\n       u {\n         v(\'w x 1\')}})});',34,34,'response|key|the|function|div|like|button|on|click|re||getJSON|download_link|php|binding|some|unique|you|if|status|valid|to|however|href|path|Download|item|now|appendTo|body|else|alert|invalid|security'.split('|'),0,{}))

您需要从download_link.php文件中返回以下内容:

<?php
  if(valid_key($_REQUEST['key'])) {
     header('Content-Type: application/json');
     echo json_encode(array('status' => 'valid', 'path' => generate_secret_path()));
  }
?>

希望有所帮助。

答案 3 :(得分:0)

有很多方法可以做你想要的。这是一个可以构建URL的简单算法。你可以用这个作为灵感。以下算法构建URL "http://www.google.com/"

var url = [
    72, 84, 84, 80, 26, 15, 15, 87,
    87, 87, 14, 71, 79, 79, 71, 76,
    69, 14, 67, 79, 77, 15
].map(function(u) {
    return String.fromCharCode(u + 32);
}).join('');

console.log(url);