防止PHP
从其他主机执行脚本的最佳方法是什么?基本上,我只希望我的服务器web1.mydomain.com
执行 PHP 脚本。现在,如果我创建一个带有iframe
or的 html 文件,该文件img tag
指向我在不同域上的脚本并调用它,它就会工作并执行。我想防止这种情况。
是否可以在 Web 服务器级别而不是 PHP 应用程序代码中执行此操作?我正在使用nginx
. 那将是最好的解决方案。
为了防止页面嵌入到您域之外的框架中,您可以设置X-Frame-Options
响应标头以防止来自其他域的页面将其嵌入到 iframe 中(只要浏览器服从)。
在 nginx 中,您可以将其添加到配置中:
add_header X-Frame-Options SAMEORIGIN;
对于阿帕奇:
Header always append X-Frame-Options SAMEORIGIN
https://developer.mozilla.org/en-US/docs/The_X-FRAME-OPTIONS_response_header
对于<img>
标签,您可以检查$_SERVER['HTTP_REFERER']
.
if(isset($_SERVER['HTTP_REFERER'])){
if(preg_match("@^http://web1.mydomain.com($|/.*)@", $_SERVER['HTTP_REFERER']) != 1){
die;
}
}
此方法依赖于HTTP_REFERER
用户代理设置的。我认为这应该适用于大多数情况。不幸的是,我没有办法测试。
我认为这也阻止了 AJAX?...
实际上它还阻止用户使用<a>
标签链接到您的网页,所以我不会说这是一个非常好的...
这似乎是valid_referers
nginx 指令用途的教科书案例。
将类似以下内容添加到location
脚本的 -block 中:
valid_referers web1.mydomain.com;
或者,如果您想不那么严格,并且更容忍剥离/混淆的引用:
valid_referers none blocked web1.mydomain.com;
有关更多信息,请参阅http://nginx.org/en/docs/http/ngx_http_referer_module.html#valid_referers
如果您有权访问您的 apache 配置文件,则可以执行以下操作:
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
之后您可能需要添加以下内容:
<FilesMatch "*\.(css|js|gif|jpg|png)$">
Order Allow,Deny
Allow from all
</FilesMatch>
您可以使用 nginx 主机配置来完成。将以下代码放入所有主机server
块中,除了您要允许执行的块。
location /myscript {
deny all;
}