javascript - 使用来自外部服务器的 JS 检测 PHP 中的原始网站 URL
问题描述
假设我们有两个网站https://aa.tld
(WS_A) 和https://bb.tld
(WS_B)。假设我们有第三台服务器https://ss.tld
(SS),其中托管了一些脚本,例如小型 javascript 框架。这个小框架为网站管理员提供例如无垃圾邮件的电子邮件表单或短信服务。
这个 JS 框架嵌入在 WS_A 和 WS_B 中,并带有一个常规的 JS 链接,例如<script src="https://ss.tld/w/widget.js" type="text/javascript"></script>
在服务器端 (SS) 使用 htaccess 将其转换为 widget.php,其中 widget.php 的行为类似于使用 PHP 标头输出 JSheader('Content-Type: text/javascript; charset=utf-8');
我的问题是:是否可以在这个 SS 脚本上使用 PHP 来检测原始网站 URL,例如https://aa.tld
or https://bb.tld
?
目的是我希望脚本仅向 WS_A 提供电子邮件表单,向 WS_B 提供电子邮件和短信。而且我不想使用 JS 开关,window.location.href
因为用户可以https://ss.tld/w/widget.js
使用此脚本挖掘并获取有关其他网站的信息,并且可能会使用诸如 MozFF 管理工具之类的浏览器破坏该脚本。
欣赏你的想法,谢谢。
更新以下答案以分享我的经验
现在我很高兴。
在网站 WS_A 上:<script src="https://ss.tld/w/856z6gg4" type="text/javascript" crossorigin="anonymous"></script>
在 HTACCESS 中:RewriteRule ^([a-zA-Z0-9-/+]+)$ js.php?key=$1 [L]
这里是 SS php 脚本(实验性,工作):
<?php
ob_start('ob_gzhandler');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header("Access-Control-Allow-Headers: X-Requested-With");
header('Content-Type: text/javascript; charset=utf-8');
function servername($url) {
$res = parse_url($url);
return $res['host'];
}
$keys = array(
'856z6gg4'=>'aa.tld'
);
$origin = filter_var ( $_SERVER['HTTP_ORIGIN'], FILTER_SANITIZE_URL);
$referer = filter_var ( $_SERVER['HTTP_REFERER'], FILTER_SANITIZE_URL);
$key = filter_var ( $_GET['key'], FILTER_SANITIZE_STRING);
$fromarray = $keys[$key];
if (array_key_exists($key, $keys)) {
if (isset ($referer) && $referer != '' && $fromarray == servername($referer) && $fromarray == servername($origin)) {
echo 'document.writeln ("domain ' . $referer . ' is checked with HTTP_REFERER.<br />");';
}
else if ($fromarray == servername($origin)) {
echo 'document.writeln ("domain ' . $origin . ' is checked with HTTP_ORIGIN.<br />");';
} else echo 'document.writeln ("domain not allowed.<br />");';
} else echo 'document.writeln ("domain not allowed.<br />");';
ob_end_flush();
?>
解决方案
你可以使用$_SERVER['HTTP_REFERER'];
,但有些浏览器不发送这个。
我建议您在 serverA 和 B 中放置一个参数,例如:在 serverA
<script src="https://ss.tld/w/widget.js?host=A" type="text/javascript"></script>
在服务器 B
<script src="https://ss.tld/w/widget.js?host=B" type="text/javascript"></script>