安全なコミュニティサイトのための module.textsanitizer.php カスタマイズ

悪意のあるユーザーから、他のユーザーを守るために以下のHackをmodule.textsanitizer.phpにかけています。

主に、アカウントハック対策として、外部URLへのリンク(イメージも含め)を禁止。また、主に管理用として自分が許可するURLとブログモジュールなどサイト内に[img][url]タグで{XOOPS_URL}リンクを貼り付ける機能は許可するHackです。

■makeClickable機能の拒否
http://などから始まる文字列を自動でリンクをつけてくれる機能

    function &makeClickable(&$text)
    {
//        $patterns = array("/(^|[^]_a-z0-9-=\"'\/])([a-z]+?):\/\/([^, \r\n\"\(\)'<>]+)/i", "/(^|[^]_a-z0-9-=\"'\/])www\.([a-z0-9\-]+)\.([^, \r\n\"\(\)'<>]+)/i", "/(^|[^]_a-z0-9-=\"'\/])ftp\.([a-z0-9\-]+)\.([^, \r\n\"\(\)'<>]+)/i", "/(^|[^]_a-z0-9-=\"'\/:\.])([a-z0-9\-_\.]+?)@([^, \r\n\"\(\)'<>\[\]]+)/i");
//        $replacements = array("\\1<a href=\"\\2://\\3\" target=\"_blank\">\\2://\\3</a>", "\\1<a href=\"http://www.\\2.\\3\" target=\"_blank\">www.\\2.\\3</a>", "\\1<a href=\"ftp://ftp.\\2.\\3\" target=\"_blank\">ftp.\\2.\\3</a>", "\\1<a href=\"\\2@\\3\">\\2@\\3</a>");
//        $ret = preg_replace($patterns, $replacements, $text);
//        return $ret;
        return $text;
    }

■[url]タグによる外部リンクの拒否
[url]でXOOPS_URL、または自分で許可するサイト以外へのリンクを無効化し、単なるテキスト表示にします。

//        $patterns = "/\[url=(['\"]?)(http[s]?:\/\/[^\"'<>]*)\\1](.*)\[\/url\]/sU";
//        $replacements = '<a href="\\2" target="_blank">\\3</a>';
//        $patterns = "/\[url=(['\"]?)(ftp?:\/\/[^\"'<>]*)\\1](.*)\[\/url\]/sU";
//        $replacements = '<a href="\\2" target="_blank">\\3</a>';
//        $patterns = "/\[url=(['\"]?)([^\"'<>]*)\\1](.*)\[\/url\]/sU";
//        $replacements = '<a href="http://\\2" target="_blank">\\3</a>';
        $patterns = "/\[url=(['\"]?)(http[s]?:\/\/www.xoops.org\/[^\"'<>]*)\\1](.*)\[\/url\]/sU";	// www.xoops.orgへのリンクを許可
        $replacements = '<a href="\\2" target="_blank">\\3</a>';
        $patterns = "/\[url=(['\"]?)(".preg_quote(XOOPS_URL,"/")."[^\"'<>]*)\\1](.*)\[\/url\]/sU";	// XOOPS_URL内リンクを許可
        $replacements = '<a href="\\2" target="_blank">\\3</a>';

■[img]タグでの外部サイトからの読み込みを禁止する
[img]http://(罠サイトURL)[/img]とされた場合、最悪この記述があるページを開いた途端にActiveXが動作し、ウイルスに感染する危険があります。

//        $patterns = "/\[img align=(['\"]?)(left|center|right)\\1]([^\"\(\)\?\&'<>]*)\[\/img\]/sU";  //元の記述をコメントアウト。
//        $patterns = "/\[img]([^\"\(\)\?\&'<>]*)\[\/img\]/sU";  //元の記述をコメントアウト。
        $patterns = "/\[img align=(['\"]?)(left|center|right)\\1](".preg_quote(XOOPS_URL,"/")."[^\"\(\)\?\&'<>]*)\[\/img\]/sU";  //XOOPS_URLは許可
        $patterns = "/\[img](".preg_quote(XOOPS_URL,"/")."[^\"\(\)\?\&'<>]*)\[\/img\]/sU";
        $patterns = "/\[img align=(['\"]?)(left|center|right)\\1](http[s]?:\/\/www.xoops.org\/[^\"\(\)\?\&'<>]*)\[\/img\]/sU";  //www.xoops.orgは許可
        $patterns = "/\[img](http[s]?:\/\/www.xoops.org\/[^\"\(\)\?\&'<>]*)\[\/img\]/sU";
        $patterns = "/\[img align=(['\"]?)(left|center|right)\\1 id=(['\"]?)([0-9]*)\\3]([^\"\(\)\?\&'<>]*)\[\/img\]/sU";
        $patterns = "/\[img id=(['\"]?)([0-9]*)\\1]([^\"\(\)\?\&'<>]*)\[\/img\]/sU";
        if ($allowimage != 1) {
            $replacements = '<a href="\\3" target="_blank">\\3</a>';
            $replacements = '<a href="\\1" target="_blank">\\1</a>';
            $replacements = '<a href="\\3" target="_blank">\\3</a>';
            $replacements = '<a href="\\1" target="_blank">\\1</a>';
            $replacements = '<a href="'.XOOPS_URL.'/image.php?id=\\4" target="_blank">\\5</a>';
            $replacements = '<a href="'.XOOPS_URL.'/image.php?id=\\2" target="_blank">\\3</a>';
        } else {
            $replacements = '<img src="\\3" align="\\2" alt="" />';
            $replacements = '<img src="\\1" alt="" />';
            $replacements = '<img src="\\3" align="\\2" alt="" />';
            $replacements = '<img src="\\1" alt="" />';
            $replacements = '<img src="'.XOOPS_URL.'/image.php?id=\\4" align="\\2" alt="\\5" />';
            $replacements = '<img src="'.XOOPS_URL.'/image.php?id=\\2" alt="\\3" />';

xoops_urlを識別するコード出典:GIJOE氏
http://www.xugj.org/modules/QandA/index.php?post_id=5097
THANKS avtx30氏 wahyu氏 GIJOE氏