使用来自外部服务器的 JS 在 PHP 中检测原始网站 URL
detect original web site URL in PHP using JS from external server
假设我们有两个网站 https://aa.tld
(WS_A) 和 https://bb.tld
(WS_B)。
假设我们有第三台服务器 https://ss.tld
(SS),其中托管了一些脚本,例如小型 javascript 框架。这个小框架提供了例如向网站管理员发送垃圾邮件的免费电子邮件表格或短信服务。
此 JS 框架嵌入 WS_A 和 WS_B 中,带有常规 JS link,如 <script src="https://ss.tld/w/widget.js" type="text/javascript"></script>
在服务器端 (SS) 使用 htaccess 将其转换为 widget.php,其中 widget.php 的行为类似于使用 PHP header header('Content-Type: text/javascript; charset=utf-8');
输出 JS
我的问题是:是否可以在这个 SS-script 上使用 PHP 来检测原始网站 URL,例如 https://aa.tld
或 https://bb.tld
?
目的是我希望脚本提供例如仅将电子邮件表格发送至 WS_A,将电子邮件和短信发送至 WS_B。而且我不想使用使用 window.location.href
的 JS 开关,因为用户可以挖掘 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= [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'];
,但有些浏览器不发送此信息。
我建议你放一个参数
在服务器A和B
前任:
在服务器A
<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>
假设我们有两个网站 https://aa.tld
(WS_A) 和 https://bb.tld
(WS_B)。
假设我们有第三台服务器 https://ss.tld
(SS),其中托管了一些脚本,例如小型 javascript 框架。这个小框架提供了例如向网站管理员发送垃圾邮件的免费电子邮件表格或短信服务。
此 JS 框架嵌入 WS_A 和 WS_B 中,带有常规 JS link,如 <script src="https://ss.tld/w/widget.js" type="text/javascript"></script>
在服务器端 (SS) 使用 htaccess 将其转换为 widget.php,其中 widget.php 的行为类似于使用 PHP header header('Content-Type: text/javascript; charset=utf-8');
输出 JS
我的问题是:是否可以在这个 SS-script 上使用 PHP 来检测原始网站 URL,例如 https://aa.tld
或 https://bb.tld
?
目的是我希望脚本提供例如仅将电子邮件表格发送至 WS_A,将电子邮件和短信发送至 WS_B。而且我不想使用使用 window.location.href
的 JS 开关,因为用户可以挖掘 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= [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'];
,但有些浏览器不发送此信息。
我建议你放一个参数 在服务器A和B 前任: 在服务器A
<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>