我想为我的 iframe 应用程序实现选择性 Framebursting。
我的 iframe 可在www.mywebsite.con/iframe.aspx?lic=1234
当托管我的 iframe 的第三方网站是 ( PayedWebsited1.con
OR PayedWebsited2.con
) 并且该lic=1234
选项也存在时,显示 iframe。对于任何其他作弊者,展示香蕉!
我该怎么做?
我想为我的 iframe 应用程序实现选择性 Framebursting。
我的 iframe 可在www.mywebsite.con/iframe.aspx?lic=1234
当托管我的 iframe 的第三方网站是 ( PayedWebsited1.con
OR PayedWebsited2.con
) 并且该lic=1234
选项也存在时,显示 iframe。对于任何其他作弊者,展示香蕉!
我该怎么做?
问题是,该许可证号不会有任何帮助 - 无论您将使用服务器端解决方案还是在 javascript 中。作弊者将能够在 PayedWebsite1.com 中看到该许可证号。
如前所述,您无法获取父框架位置,但您可以获得引荐来源 - 如果您的页面在 iframe 中加载,则它等于父框架。
if (window.top.location !== document.location) { // only if we're in iframe
// we get host of our referrer
var host = document.referrer.match(new RegExp("(http|https)://(.*?)/.*$"))[2];
host = host.toLowerCase(); // convert to lower case
var myHost = document.location.host.toLowerCase();
if (
host !== myHost // so we can click on links in an iframe
&& host !== 'payedwebsite1.com'
&& host !== 'payedwebsite2.com'
) {
window.top.location.href = document.location.href;
}
}
请注意,这种技术可以被击败。更多信息请访问http://javascript.info/tutorial/clickjacking
对于较新的浏览器,您可以发送特殊标头:
X-Frame-Options: DENY
逻辑保持不变,仅在服务器端。检查推荐人,如果 PayedDomain 或您自己的域,请继续。否则,发送此标头。
如果您的第三方用户可以包含 javascript 文件,或者理想情况下在绘制页面之前在 ASP 中发送请求,我会这样做:
Javascript
在您的服务器上构建一个 ASP(我使用 PHP,因此我的示例是 PHP)页面,该页面检查引用者和许可证号以匹配您数据库中的帐户。然后,ASP 文件应输出 javascript 函数,这些函数将使用您生成的“一次性使用”密钥替换或插入您指定的 iframe 元素。该文件可能类似于以下内容:
<?php
$lic = $_GET['lic']; // Do better validation (short for demo purposes)
if (valid_license($lic, $_SERVER['HTTP_REFERER'])) {
$one_time_key = get_access_key($lic);
?>
function drawIframe() {
document.getElementById('iframe_target').innerHTML = "<iframe src='mysite.php?key=<?php echo $one_time_key;?>'></iframe>";
}
<?php
}
else {
echo "You are not authorized to use this service.";
}
让您的客户以类似于以下方式包含此 javascript 代码作为 iframe 的替换:
<script src="http://www.yoursite.com/preauth.php?lic=1234"></script>
<script>drawIframe();</script>
<div id="iframe_target"></div>
在 iframe 加载的页面上,立即根据传递给 iframe 的值检查您生成的密钥。如果有效,请立即删除或更改密钥的状态,以便您知道它已被使用。然后显示适当的应用程序。
ASP
如果您可以让您的用户在他们的服务器中向您的 url 发出请求,您将避免向用户公开任何有风险的信息,例如许可证。$key = file_get_contents("http://www.yoursite.com/preauth.asp?lic=1234");
他们可以在使用您刚刚生成的一次性使用密钥输出 iframe 之后立即调用类似的东西。
出于安全考虑,您的浏览器将不允许您使用 javascript 来检测父页面的 URL(即包含显示您页面的 iframe 的页面)。
我能想到的唯一解决方案是:
Request.UrlReferrer
获取推荐人在您呈现的页面上,您应该有一个文字,如果您想阻止人们构筑您的页面,您可以简单地添加强制框架所需的 javascript。
不幸的是,如果禁用 Javascript,这将使您的代码无用...
希望这可以帮助?
protected void page_load(object sender, EventArgs e)
{
bool killFrames = false;
if(Request.QueryString["lic"] == null)
killFrames = true;
if(!killFrames && Request.UrlReferrer != null)
{
// do some database check against the LIC and Referrer
// and set killFrames accordingly.
}
if(killFrames)
{
literalFrame.Text = "<script type=\"text/javascript\">if(top.location != location) { top.location.href = document.location.href; }</script>";
// or show the bananas
}
else
{
// render the page accordingly.
}
}
我将尝试为您的一般问题而不是这个特定的技术问题指出一个解决方案,据我所知,这对于所有网络浏览器所做的安全预防措施都是不可能的。
您需要在他们的应用程序和您的应用程序之间进行某种握手,并且必须在服务器端完成。
每个付费网站都应该有一个密码(或者如果他们有一个静态 IP,你可以使用它)。在他们的服务器内部(可能使用 CURL),他们会通过 POST 向您发送他们的密码;然后你返回一个在 iframe 中使用的令牌。
iframe.aspx?lic=1234&token=d16evg5tr44e0trty45xp6es5
并且令牌只能使用一次;因此每次需要打开 iframe 时都必须重复该过程。并且您拒绝所有不包含有效令牌的连接。
我不是 .NET 专家,但看起来您的解决方案可以通过跟踪客户端在加载 iframe 内容时发送到您的页面的引荐标头来轻松解决。
您可能想参考有关引用标头的另一个问题: 我们应该如何在 aspx .net 中验证 http 标头引用者
基本上,您将执行以下操作
Global.asax
成功了!
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
Dim ref As String = HttpContext.Current.Request.ServerVariables("HTTP_REFERER")
If Not ref.Contains("PayedWebsited1") And Not ref.Contains("PayedWebsited2") Then
Response.Redirect("MYDOMAIN", True)
End If
End Sub
谢谢大家!