質問: 以前はWordpressを使っていたので、Wordpressのesc_url()という関数を使用していました。 esc_url()という関数にURLの文字列を通すと、URLに使用できない文字などを一括で削除してくれて非常に便利だったのですが、今回はWordpressを使用せずに生phpでサイトを作ろうと思っているため、esc_url()関数を使用することができません。 POSTされてきたURLを安全にWEB上に表示するため、一般的にどのような方法が使われているのかわからず、この度質問してみました。 初歩的な質問で大変恥ずかしいのですが、ご存知の方がいらっしゃいましたら、ご教授いただけましたら幸いです。 何卒、宜しくお願いいたします。
回答: 単に表示するだけであればhtmlspecialcharsでHTMLエスケープすればよいですが、追記で示されたようにA要素等を用いてリンクの形にする場合は、スキーム(プロトコル)の確認は必須です。 通常は、前方一致で、http: か https: で始まっていることを確認すればよいと思います。esc_urlはtelnetやgopherなどもデフォルトで許容していますが、通常これらは不要かと思います。 スキームのチェックをしていないと、以下のようなリンクが作られてしまい、クロスサイトスクリプティング脆弱性になります。 ``` 外部へのリンク ``` 上記の例では、リンクを選択するとJavaScriptとしてalert()関数が実行します。 したがって手順としては下記の通りとなります。 * まずURLが http: または https: で始まっていることを確認する * 前記検査がOKならば、URL全体をhtmlspecialcharsでエスケープする * URLをhrefなどの属性値として表示する場合はダブルクォートで囲むことを忘れないこと