iframeアプリケーションに選択的なフレームバーストを実装したいと思います。
私のiframeはで利用可能ですwww.mywebsite.con/iframe.aspx?lic=1234
iframeをホストしているサードパーティのウェブサイトが(PayedWebsited1.con
OR PayedWebsited2.con
)であり、lic=1234
オプションも存在する場合は、iframeを表示します。他の詐欺師については、バナナを展示してください!
どうすればいいですか?
iframeアプリケーションに選択的なフレームバーストを実装したいと思います。
私の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 ファイルは、指定した iframe を、生成した「1 回限りの」キーで置換または要素に挿入する JavaScript 関数を出力する必要があります。ファイルは次のようになります。
<?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.";
}
次のような方法で、お客様に iframe の代わりにこの JavaScript コードを含めてもらいます。
<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 を出力できる直後に、次のようなものを呼び出すことができます。
この特定の技術的な問題ではなく、一般的な問題の解決策を指摘しようとします。私の知る限り、すべての Web ブラウザで行われるセキュリティ対策では不可能です。
彼らのアプリとあなたのアプリの間で何らかのハンドシェイクが必要であり、それはサーバー側で行う必要があります。
すべてのPayedWebsiteにはパスワードが必要です (または、静的 IP がある場合はそれを使用できます)。サーバーの内部で (CURL を使用している可能性があります)、パスワードを POST 経由で送信する必要があります。次に、iframe で使用されるトークンを返します。
iframe.aspx?lic=1234&token=d16evg5tr44e0trty45xp6es5
また、トークンは一度しか機能しません。そのため、iframe を開く必要があるたびにこのプロセスを繰り返す必要があります。そして、有効なトークンを含まないすべての接続を拒否します。
私は .NET の専門家ではありませんが、iframe コンテンツの読み込み時にクライアントがページに送信する参照ヘッダーを追跡することで、ソリューションを簡単に解決できるようです。
参照ヘッダーに関する別の質問を参照することをお勧めします: aspx .net で http ヘッダー リファラーを検証する方法
基本的に、次のことを行います
セキュリティ上の理由から、お使いのブラウザでは、javascript を使用して親ページ (つまり、ページを表示する iframe を含むページ) の URL を検出することはできません。
私が考えることができる唯一の解決策は次のとおりです。
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.
}
}
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
ありがとうございます!