PHP+jQueryでクロスサイトスクリプティング

  • このエントリーをはてなブックマークに追加

ふと思い立ってごりごりと開発しようとするも、それほど頻繁に開発するわけでもないので、つい忘れてしまいがちなのでメモ。

流れとしては以下のとおり
1. PHPで外部サイトのHTMLを取得
 ※これで同ドメイン内でのajaxとして利用可能になる
2. jQueryでajax

文字にすると簡単なのに、なぜこれを毎度毎度忘れてしまうのか…

手順1:PHPで外部サイトのHTMLを取得

具体的なコードは以下の通り。

<?php
    if(isset($_GET["url"]) && preg_match("/^https?:/",$_GET["url"])){

        echo file_get_contents($_GET["url"]);
    }else{
        echo "error";
    }
?>

このPHPを同一ドメイン内に設置してjQueryから読みに行くだけ。
URLパラメータがhttpまたはhttpsなら…という感じ。

HTMLデータが出力されるので、ajaxの戻り値もDOMオブジェクトとして扱えます。

JSONなどを返すURLに対しても利用できますが、正しくパース可能なデータかどうかを確認する必要があります。
(それでドハマりしたのは、また別のお話…)

他の文字列を返すURLに対しても、必ず想定した文字列かどうかは確認しておいた方が安心です。

手順2:jQueryでajax

jQueryから上記のPHPに対して、ajaxします。
取得したい外部サイトのURLは、URLパラメータとして渡してあげればOK。

$.ajax({
    url: "前述のPHPファイル名?url="+url

あとはHTMLでパースしようが、ごりごりとDOMをいじろうが思いのまま。
素敵!

おまけ:取得したHTMLの抽出

jQueryでajaxした後のデータを抽出するときに、ついつい忘れがちなのでこちらもあわせてメモ。

$.ajax({
    url: "前述のPHPファイル名?url="+url
}).then(function(hoge){
    const hogehoge = $($.parseHTML(hoge));
    $fuga = $('セレクタ',hogehoge).html();
    $piyo = $('セレクタ',hogehoge).text();

HTMLをパースするかどうかは置いておいて…
抜き出したら変数に入れておいた方があとあと楽な気がする。
抜き出す際は第2引数にajaxの戻り値orパース後の変数名を入れてあげる。

$('セレクタA','セレクタB')

この書き方は「セレクタBの中にあるセレクタA」という意味。
(雑な説明)

ajaxの戻り値がHTMLオブジェクトまたはDOMオブジェクト扱い(?)なので、セレクタBの方に入れても問題ない…ということですね。

$('セレクタA,セレクタB')

こっちだと通常のCSSセレクタ同様それぞれに対して処理になるので、ちょっと注意しておきましょう。

$fuga = $('セレクタ',hogehoge).eq(0).html();

これも覚えておきたい(自分が忘れがち)記述。
配列の何番目か指定するメソッド。
配列と同様に「0」スタート。
「0」の場合も明示してあげると、あとで自分が楽になります。

jQueryだけでクロスドメイン制約をクリアする方法もありますが…
ぶっちゃけこっちの方がシンプルで分かりやすい。
PHPが動く前提ですが、このご時世にPHP使えないサーバーで開発することもないでしょう。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*