ユーザーが入力した内容のうち、URLの部分をリンクにするという機能をPHPで作ろうと考えています。


ここで、セキュリティ上、JavascriptをURLの中に入れられないようにしたいのですが、それも含めてどう処理すればいいでしょうか?
文章としてJavascriptを説明することも予想されるので、URLの中にねじ込まれなければいいと考えています。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/02/07 14:40:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:inokuni No.1

回答回数1343ベストアンサー獲得回数21

ポイント27pt

はてなダイアリーXSS対策 がお役に立てれば幸いです。


また、PHP には parse_url という関数があり、

返り値

完全におかしな形式の URL については、parse_url() は FALSE を返し、E_WARNING を発生します。それ以外の場合は 連想配列が返され、その中には以下の要素(のうち少なくともひとつ)が含まれます。

とありますので、返り値を判断するのはいかがでしょうか?

id:dingding

ありがとうございます。

この関数は知りませんでした。ためになります。

2007/01/31 17:00:19
id:worldtravel No.2

回答回数34ベストアンサー獲得回数4

ポイント27pt

掲示板のような形で入力された内容を表示する事を前提に考えています。

これでいかがでしょうか。

$str = '<strong>テスト</strong>テストURLはhttp://xxx.xxxです。<a href="javascript:alert(¥'test¥');">クリック</a>';

$str = htmlspecialchars($str);
$str = preg_replace("/(https?:¥/¥/[¥/¥w¥.¥?¥+-%&amp;=~]+)/i", "<a href=¥"$1¥">$1</a>", $str);

print $str;

http://xxx.xxx

id:dingding

ありがとうございます。

このプログラムでは、URLに

http://www.aaa.com/?a=%3Cscript%3alert('アラーと')%3C/script%3E

のようにjavascriptを含めたXSSなどに対応できているのでしょうか?

2007/01/31 17:17:52
id:worldtravel No.3

回答回数34ベストアンサー獲得回数4

ポイント26pt

すいません。

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("<", '&lt;', $str);
	$str = ereg_replace(">", '&gt;', $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;」となってしまいましたので「&」は全角で書いています。

ご迷惑をおかけしました。

ポイントは不要です。

http://xxx.xxx

id:dingding

大変詳細な解説ありがとうございます。

試してみます。

ありがとうございます。

2007/02/01 12:05:30

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません