如何阻止对我的 JavaScript 文件的直接访问?
Posted
技术标签:
【中文标题】如何阻止对我的 JavaScript 文件的直接访问?【英文标题】:How can I block direct access to my JavaScript files? 【发布时间】:2011-09-14 04:56:32 【问题描述】:我使用 Minify 来缩小和缓存我的所有脚本请求。 我只希望我的用户能够访问 JavaScript 文件的缩小版本。
Minify 位于www.example.com/min
,我的脚本位于www.example.com/scripts
。如何阻止对 doc_root/scripts
的直接访问,这是我未缩小的 javascript 文件所在的位置。我宁愿不把它们放在文档根目录之外,但这是一个选项。
请注意,我使用的是 Zend Framework,所以我的应用程序的实际根目录转移到了www.example.com/public
。一个 htaccess 文件处理重写。
【问题讨论】:
阻止直接访问应该解决什么问题? 我将 cmets 包含在我未缩小的 JavaScript 代码中(大多数其他人也是如此)。在部署时手动缩小我的代码并确保我上传了正确的版本是一件很痛苦的事情。我使用 Minify 自动执行此操作,但未缩小的版本仍在公开中。 真正的解决方案是让 CSS 和 JS 文件像 php 文件一样保密。这要么意味着在服务器上以某种方式执行它们,这似乎没有用或不可能,要么使用真正安全的浏览器访问隧道隐藏它们,这可能是不可能的。 【参考方案1】:您不能只在doc_root/scripts
中使用一个.htaccess 文件来阻止所有通过Web 访问HTTP 上的.js
文件吗?
它不会停止缩小,因为它提供了间接访问。
所以在doc_root/scripts/.htaccess
,类似于
<Files ~ "\.js$">
order allow,deny
deny from all
</Files>
注意.htaccess
文件的位置在这种情况下很重要。
【讨论】:
谢谢,重写规则有效。一旦允许,我就会接受。【参考方案2】:您实际上无法阻止面向最终用户的代码。即使您使用 PHP 或其他服务器端语言提供它并阻止直接请求,当然仍然可以使用许多工具直接读取它。
您应该牢记这一点进行编码,并注意 javascript cmets、业务知识等。
更新:
但是,如果您谈论的是最终用户不需要访问的代码,您可以像您提到的那样将其移出服务器根目录,或者您可以阻止目录中的文件 (或整个目录)。使用 Apache 的 .htaccess 很容易。
order deny, allow
deny from all
您还可以在 .htaccess 文件中使用 mod_rewrite 将源文件重定向到缩小版本。
RewriteEngine On
RewriteRule /scripts/(.*)$ /min/$1 [L,NC]
【讨论】:
我不太关心他们是否会接触到缩小版。我知道任何有足够决心的人都能理解它们。我只是希望他们不要在我未缩小的代码中看到 cmets。 哦,我看错了。您只想阻止源文件,而不是缩小的文件。我会更新我的答案。 那么不要将原始未挖掘版本保存在可公开访问的区域。将它们移到文档根目录之外,如果您不能这样做,请将它们放入“无法猜测”的子目录中,并且不要在任何公开页面中引用它。【参考方案3】:取决于您使用的服务器。假设它是 Apache,您可以将其添加到您的 .htaccess 文件中:
<Directory ~ "\scripts">
Order allow,deny
Deny from all
</Directory>
或者类似的东西..
【讨论】:
【参考方案4】:唯一的方法是检查推荐人,并不是每个人都发送它们,或者发送一个真实的。换句话说,您不能阻止任何真正想要某物的人直接访问。无法 100% 准确确定请求是直接请求还是通过 <script src=....>
类型请求完成。
【讨论】:
【参考方案5】:要让您的 Javascript 真正运行,用户的浏览器必须最终能够读取它。 因此,没有真正的方法可以“阻止”对您的脚本文件夹的访问(准确地说,您可以,但这会破坏您的网站,因为浏览器不会看到这些文件以运行它们。)
一种解决方案可能是混淆,这会使 javascript 代码更难阅读/理解,但最终用户会看到代码,并且通过一些坚持不懈的逆向工程,它可以被去混淆。
我看到有人做的另一件事是创建一个“空”js.html 页面,并将他们所有的 javascript 插入页面中的脚本标签(嵌入,而不是外部),然后从他的主页发出 ann ajax 请求js.html 并将其嵌入页面底部。一种迂回的方式,但用户在查看源代码时不会看到 js,除非使用诸如 firebug 之类的开发工具。
请注意,最后一个选项也可能会导致一些延迟,具体取决于您加载的代码数量。但这里的关键不是阻止对您的脚本的访问,而是让它们更难获取/读取/复制。
编辑:哎呀,也误读了。我认为在这种情况下最好的解决方案是在脚本文件夹中使用 htaccess 文件拒绝所有访问
【讨论】:
【参考方案6】:这个答案比问题要新一点(只有几年,没什么)
您不能拒绝对 JavaScript 文件的访问,因为它们无法通过 <script>
标签访问。
但我找到了解决方法:
RewriteEngine On
RewriteRule ^.*\.js$ /invalid.html [R=301,L]
将它放在您的 .htaccess 文件中,该文件位于您的 web 主文件夹中。 (在 htdocs 或 public_html 下)。 这将自动重定向每个人。所以他们看不到它。
【讨论】:
这会产生同样的问题。 script 标签只会加载invalid.html
,JS 代码永远不会被执行。
真的吗?因此,如果您包含带有<script>
标签的脚本,它会被执行,如果您直接从浏览器访问.js
文件,它会被重定向?以上是关于如何阻止对我的 JavaScript 文件的直接访问?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据域名阻止对我的 api-gateway url 的任何请求?
如何使用 js/uml 对我的 JavaScript 文件进行反向工程?