プロが教える店舗&オフィスのセキュリティ対策術

現在、掲示板をPHPで作っています。
入力された文字列の無効化と許可タグの分別に正規表現を使いたいと考えております。

そこで、現状では、まずすべての < > を特殊文字に変換し、その後に、許可タグ(属性)のタグを < > にもどそうとしています。

たとえば、fontタグならcolorとsizeを許可しようとして、次のような正規表現を作ってみましたが、うまくいきません。

/&lt;font((( )*(color=)[\"\']?.{1,7}[\"\']?)|(( )*(size=)[\"\']?.{1,2}[\"\']?))*&gt;/i

正規表現はまだ勉強し始めたところで、おかしなところだらけだと思いますが、何かヒントだけでもいただけたらと思います。

どうぞよろしくお願いします。

A 回答 (1件)

$extention[] = "/&lt;(font(?:(?: color=[\"\']?(?:&quot;)?[#0-9a-z]{1,20}[\"\']?(?:&quot;)?)?|(?: size=[\"\']?(?:&quot;)?[\d]{1,2}[\"\']?(?:&quot;)?)?)*)&gt;/i";


$extention[] = "#&lt;(/font)&gt;#i";

foreach($extention as $ext){
$tag = preg_replace($ext,"<$1>",$tag);
}

こんなのはどうでしょうか。
多分" や 'が&quot;になってるんじゃないかな?と思います。
勘ですが。

この回答への補足

試行錯誤の末、なんとかできるようになりました。

アドバイスありがとうございました。

補足日時:2005/11/29 13:45
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまい申し訳ございませんでした。

ご教示いただいたとおり試してみますと、キッチリしていした属性の時のみ処理できるようになりました。

しかし、下記のように

$tag = "<font size=10 color='red'>テスト</font>";
$tag = str_replace(array("<",">"),array("/&lt;","&gt;#i"),$tag);

foreach($extention as $ext){
$tag = preg_replace($ext,"<$1>",$tag);
}

print $tag;

とすると、結果が

/<font size=10 color='red'>#iテスト/</font>#i

と、タグの前後に / #i がついてしまうのです。
勉強不足で試行錯誤を繰り返しているのですが、
2つ目の正規表現のデリミタ部分にある # は何を表しているのでしょうか?
これを / に変えるとエラーとなってしまいます。

お礼日時:2005/11/25 15:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!