ここで、セキュリティ上、JavascriptをURLの中に入れられないようにしたいのですが、それも含めてどう処理すればいいでしょうか?
文章としてJavascriptを説明することも予想されるので、URLの中にねじ込まれなければいいと考えています。
はてなダイアリーXSS対策 がお役に立てれば幸いです。
また、PHP には parse_url という関数があり、
返り値
完全におかしな形式の URL については、parse_url() は FALSE を返し、E_WARNING を発生します。それ以外の場合は 連想配列が返され、その中には以下の要素(のうち少なくともひとつ)が含まれます。
とありますので、返り値を判断するのはいかがでしょうか?
掲示板のような形で入力された内容を表示する事を前提に考えています。
これでいかがでしょうか。
$str = '<strong>テスト</strong>テストURLはhttp://xxx.xxxです。<a href="javascript:alert(¥'test¥');">クリック</a>'; $str = htmlspecialchars($str); $str = preg_replace("/(https?:¥/¥/[¥/¥w¥.¥?¥+-%&=~]+)/i", "<a href=¥"$1¥">$1</a>", $str); print $str;
ありがとうございます。
このプログラムでは、URLに
http://www.aaa.com/?a=%3Cscript%3alert('アラーと')%3C/script%3E
のようにjavascriptを含めたXSSなどに対応できているのでしょうか?
すいません。
2の回答者です。
先程の回答では問題がありました。
htmlspecialcharsを使うと「&」「"」などの処理が面倒なのでこれではダメでしょうか。
<html> <head> <meta http-equiv="content-type" content="text/html; charset=euc-jp"> </head> <body> <? $str = '<a href="http://www.aaa.com/?a=%3Cscript%3alert(¥'アラーと¥')%3C/script%3E">クリック</a>'; $str = ereg_replace("<", '<', $str); $str = ereg_replace(">", '>', $str); $str = preg_replace("/(https?:¥/¥/[¥/¥w¥.¥?¥+-=%~&]+)/i", '<a href="$1">$1</a>', $str); print $str; ?> </body> </html>
[¥/¥w¥.¥?¥+-=%~&]の「&」を半角に置き換えて試してください。
<a href="http://www.aaa.com/?a=%3Cscript%3alert('アラーと')%3C/script%3E">クリック</a>
こちらは、2の質問でdingdingさんが回答した所と表示と同じになります。
ちなみに
先程「&」が「&amp;」となってしまいましたので「&」は全角で書いています。
ご迷惑をおかけしました。
ポイントは不要です。
大変詳細な解説ありがとうございます。
試してみます。
ありがとうございます。
ありがとうございます。
この関数は知りませんでした。ためになります。