jQueryの勉強も兼ねて、デッドリンクチェッカーを作りました。ハイパーリンクであれば、画像も対象です。非同期通信で、同時接続数はチューニング可能にしています。(デフォルト値は2)クライアントはもちろん、サーバにも負荷がかかりますので、同時接続数は適宜、試してください。
WordPressのbloginfo(“url”)から順次HTMLソース内のハイパーリンクを辿ります。HTMLソースで相対パス表示の場合、当チェックの実行パス(=http://example.com/wp-admin/)からの相対解釈になってしまう対処に、少し手こずりましたが、[javascript]相対URLを絶対URLにする関数に救われました。
なお、重複チェックは無限ループになるため、当然除外し、外部ドメインについては、1階層までチェックします。つまり、対象WordPressサイトのリンク品質を確保するためのツールです。
使い方
- dead-link-checker.zipをダウンロード
(最新版はhttp://typista.it-creates.com/wp-content/uploads/dead-link-checker.zip) - プラグインディレクトリに解凍
- ダッシュボードからアクティベート
- リンクチェックの実行は、「ダッシュボード」→「設定」→「Dead Link Checker Plugin」→「start」ボタン。
以上で、bloginfo(“url”)からリンクを辿り、リンクチェックを開始します。中断も可能です。
正常なページは、一覧から消えていき、エラーの場合は、HTTPステータスコードとそのリンクを含むURL(非同期の複数コネクション実行のため、最新1つで上書き)も表示します。
制限事項
jQuery(JavaScript)を利用したチェックのため、このプラグインでのエラー検知が万全ではないようです。
これは、(予想の域を越えませんが)jQuery、というよりJavaScript(?)では、クロスドメインでのHTTP通信不可のため、擬似的にサーバサイドで回避(*1)しています。この対処(出力)が万全でないのかも知れません。
また、現状ではハイパーリンクのみの抽出のため、JSやCSSは対象外です。
今後の対応
大きな機能追加要件として、被リンクゼロチェック機能、つまりどこからもリンクされていない画像等を抽出する機能を想定しています。が、これはかなり難航するかも知れません。
小粒要件としては、JSやCSSのデッドリンクチェックへの対応です。formへの対応は決めかねています。
その他、チェック結果表示のポップアップウィンドウ化 or iframe化や体裁、それらのオプション設定などなどです。
追記
外部リンクのチェック用サーバサイドスクリプト(上記*1)がXSS攻撃に悪用される危険性がありました。
バージョン0.1をご利用の方は、0.2以降にアップデートしてください。
Ktai Styleの作者Yuriko様にご指摘いただき、修正しました。
追記2
Yuriko様から、さらにご指摘いただき、XSS攻撃対策が不完全でしたので、修正しました。
バージョン0.3bにアップデートをお願いします。
なお、バージョン0.3bでは、feed等のXMLを対象としたリンクチェックが不完全な状態です。この不具合よりも、XSS対策版を優先すべきという観点で、リリースさせていただきます。
このデバッグ/修正に時間がかかりそうですが、対策完了次第、リリースいたします。
もし、当プラグインをご利用いただいている方がいらしたら、大変ご迷惑をおかけしますが、今しばらくお待ちください。
3 comments
WP フォーラムにも書きましたが、念のためここにも書いておきます。
万全でないというか、getcrossdomain.php は世界中の誰からも使用可能となっていて、かつ、取得した HTML をそのまま吐くという仕様のため、非常に危険です。**即刻公開を中止し**、改善するようお願いします。簡単に各種 XSS 攻撃が可能と思われます。
プラグインの詳細を確認はしていませんが、getcrossdomain.php でリンク先の存在チェックをするならば、404 Not Found になるか否かを返せば、比較的安全になるかと思います。
ご指摘ありがとうございました。
確かに外部リンクの場合は、ステータスを返すだけで充分でしたので、v.0.2としてアップデートしました。
また、v.0.1をダウンロードされてしまった方がいたら、ご迷惑をおかけしますが、アップデートをお願いします。
対応ありがとうございます。残念ながら、まだ不十分です。
(略・・・0.2を利用されている方が悪用の的にならないように一応伏せます by typista)
自サイトの場合はクロスドメイン制限がかからないため、JavaScript から直接アクセスすればよく、getcrossdomain.php はステータスコードを返すだけにした方がいいでしょう。
あと、file_get_contents() で外部サイトにアクセスするには php.ini で allow_url_fopen が true でないといけません。そうでないサーバーでは利用不可能です。ちょっと面倒ですが、fsockopen でソケットを作って fread した方がいいでしょう。
By submitting a comment you grant typista a perpetual license to reproduce your words and name/web site in attribution. Inappropriate and irrelevant comments will be removed at an admin’s discretion. Your email is used for verification purposes only, it will never be shared.