PHP SQL注入とXSS攻撃を防ぐ


つまり、SQLコマンド、JSスクリプトなどをWebフォームに挿入してドメイン名やページリクエストのクエリー文字列を提出したり入力したりすることで、最終的にサーバをだまして悪意のあるSQLコマンドを実行することになる.ユーザー名入力ボックスに「or 1=1」と入力し、パスワードを勝手に入力します.この場合の合成後のSQLクエリ文は「#」となり、mysqlではコメント記号となります.これにより、井戸番号の後ろの内容はmysqlでコメント内容と見なされ、実行されなくなります.
select * from users where username='' or 1=1  

このリスクに関する市販の方法が大きく推し進められ、コードが乱雑になっている.360 WebscanはSQL注入とXSS攻撃を防ぐソースコードを提供しており、プロジェクトに参照するだけでよい.
webscan_switch           = $webscan_switch;
        $this->webscan_white_directory  = $webscan_white_directory;
        $this->webscan_white_url        = $webscan_white_url;
        $this->webscan_get              = $webscan_get;
        $this->webscan_post             = $webscan_post;
        $this->webscan_cookie           = $webscan_cookie;
        $this->webscan_referer          = $webscan_referer;
    }

    //     
    private function webscan_arr_foreach($arr)
    {
        static $str;
        static $keystr;
        if (!is_array($arr))
        {
            return $arr;
        }

        foreach ($arr as $key => $val)
        {
            $keystr = $keystr . $key;
            if (is_array($val))
            {
                $this->webscan_arr_foreach($val);
            }
            else
            {
                $str[] = $val . $keystr;
            }
        }
        return implode($str);
    }

    //       
    private function webscan_StopAttack($StrFiltKey, $StrFiltValue, $ArrFiltReq, $method)
    {
        $StrFiltValue = $this->webscan_arr_foreach($StrFiltValue);
        if (preg_match("/" . $ArrFiltReq . "/is", $StrFiltValue) == 1 || preg_match("/" . $ArrFiltReq . "/is", $StrFiltKey) == 1)
        {
            return true;
        }
        else
        {
            return false;
        }

    }

    //        
    private function webscan_white($webscan_white_name, $webscan_white_url = array())
    {
        $url_path = $_SERVER['SCRIPT_NAME'];
        $url_var  = $_SERVER['QUERY_STRING'];

        if (preg_match("/" . $webscan_white_name . "/is", $url_path) == 1 && !empty($webscan_white_name))
        {
            return false;
        }
        foreach ($webscan_white_url as $key => $value)
        {
            if (!empty($url_var) && !empty($value))
            {
                if (stristr($url_path, $key) && stristr($url_var, $value))
                {
                    return false;
                }
            }
            elseif (empty($url_var) && empty($value))
            {
                if (stristr($url_path, $key))
                {
                    return false;
                }
            }

        }
        return true;
    }

    //   
    public function check()
    {
        // get    
        $getfilter = "\\<.>|<.>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\(.*\)|sleep\s*?\(.*\)|\\b(group_)?concat[\\s\\/\\*]*?\\([^\\)]+?\\)|\bcase[\s\/\*]*?when[\s\/\*]*?\([^\)]+?\)|load_file\s*?\\()|]*?\\bon([a-z]{4,})\s*?=|^\\+\\/v(8|9)|\\b(and|or)\\b\\s*?([\\(\\)'\"\\d]+?=[\\(\\)'\"\\d]+?|[\\(\\)'\"a-zA-Z]+?=[\\(\\)'\"a-zA-Z]+?|>||<.>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\(.*\)|sleep\s*?\(.*\)|\\b(group_)?concat[\\s\\/\\*]*?\\([^\\)]+?\\)|\bcase[\s\/\*]*?when[\s\/\*]*?\([^\)]+?\)|load_file\s*?\\()|]*?\\b(onerror|onmousemove|onload|onclick|onmouseover)\\b|\\b(and|or)\\b\\s*?([\\(\\)'\"\\d]+?=[\\(\\)'\"\\d]+?|[\\(\\)'\"a-zA-Z]+?=[\\(\\)'\"a-zA-Z]+?|>|| $_SERVER['HTTP_REFERER']);

        if ($this->webscan_switch && $this->webscan_white($this->webscan_white_directory, $this->webscan_white_url))
        {
            if ($this->webscan_get)
            {
                foreach ($_GET as $key => $value)
                {
                    if ($this->webscan_StopAttack($key, $value, $getfilter, "GET"))
                        return true;
                }
            }
            if ($this->webscan_post)
            {
                foreach ($_POST as $key => $value)
                {
                    if ($this->webscan_StopAttack($key, $value, $postfilter, "POST"))
                        return true;
                }
            }
            if ($this->webscan_cookie)
            {
                foreach ($_COOKIE as $key => $value)
                {
                    if ($this->webscan_StopAttack($key, $value, $cookiefilter, "COOKIE"))
                        return true;
                }
            }
            if ($this->webscan_referer)
            {
                foreach ($referer as $key => $value)
                {
                    if ($this->webscan_StopAttack($key, $value, $postfilter, "REFERRER"))
                        return true;
                }
            }
            return false;
        }
    }
}

?>

次のように呼び出されます.
// Webscan
$Webscan = new Webscan();
if ($Webscan->check()) {
    exit('            ');
}