-2

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

问题是,用户在浏览器中查看 html 的源代码时可以轻松看到路径。php中是否有任何简单的方法(我将javascript代码放在PHP文件中)使路径更难阅读?

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

谢谢

4

4 回答 4

3

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

但是,如果您不想这样做,而只是想掩盖它,那么有很多选择。例如, Base-64编码在 PHP 和 JavaScript 中都有很好的支持,因此您可以在 PHP 端(使用base64_encode)对路径进行编码,并在按下按钮后在 JavaScript 上解码(使用Stack Overflow 上讨论几种解决方案中的任何一种)。

于 2012-12-07T14:28:09.633 回答
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>

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

于 2012-12-07T14:24:00.143 回答
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/)。它不安全,但它会阻止您的普通 joe 轻松查看代码。

仅供参考,打包时上面的代码如下所示:

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()));
  }
?>

希望有帮助。

于 2012-12-07T14:32:43.857 回答
0

There are lots of ways to do what you want. Here's a simple algorithm that can build a URL. You can use this as inspiration. The following algorithm builds the 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);
于 2012-12-07T14:31:08.707 回答