Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

QUERY_STRING check in cgi.c



広瀬です。

AN HTTPD を作っている中田さんから
#AN HTTPD <URI:http://www.st.rim.or.jp/~nakata/>

以下のような指摘と、code を頂きました。
#元々の問題は IIS シリーズと AN HTTPD を Win9x で動作させた時に
#namazu.cgi で QUERY(引数?)が無いと QUERY_STRING が作成されないため
#security check に引っかかって動作しないというものでした。

--- ここから ---
AN HTTPD を Win9x で動作させた時にQUERYを指定しないで動作させた時に
環境変数の QUERY_STRING が無いのは以下のような理由がある。

(1)Win95/98 では 空の環境変数をセットすると
      環境変数自体をセットしない。

(2)CGI/1.1では、空の環境変数 と セットされていない環境変数
      は同じとみなす。
#<URI:http://search.ietf.org/internet-drafts/draft-coar-cgi-v11-03.txt>の
#6.1. Request Metadata (Metavariables) に、
#>    This specification does not distinguish between the
#>    representation of null values and missing ones. Whether null
#>    or missing values (such as a query component of "?" or "",
#>    respectively) are represented by undefined metavariables or by
#>    metavariables with values of "" is implementation-defined.
#とあります。
#Metavariables が UNIX の場合に Environment Variables になるというのは、
#どこかに記述があったと思います。
#Windows の場合については、CGI/1.2 では触れられるようです。

(3)QUERY_STRING は空の場合があるが、CGIで SCRIPT_NAME が空
      のことはない。

したがって、cgi.c の get_query_string() は、汎用で、以下のようにしたらど
うだろうかと思います。
ご検討いただければ幸いです。

static char *
get_query_string(void) 
{
    int contlen;
    char *script_name    = "";
    char *query_string   = "";

    if ((script_name = getenv("SCRIPT_NAME"))) {
        /* 
	 * get SCRIPT_NAME from environmental variables.
	 */
	if ((query_string = getenv("QUERY_STRING")) == NULL) {
            /*
             *  if QUERY_STRING is not set, should be "".
             */
            query_string = "";
        }
        contlen = strlen(query_string);
        if (contlen > CGI_QUERY_MAX) {
            printf(MSG_MIME_HEADER);
            printf(_("Too long QUERY_STRING"));
            exit(EXIT_FAILURE);
        }
  } else {
        return NULL;
    }
    return query_string;
}
--- ここまで ---

で、6.1.8. QUERY_STRING には
	:
   Servers MUST supply this value to scripts. The QUERY_STRING
   value is case-sensitive. If the Script-URI does not include a
   query component, the QUERY_STRING metavariable MUST be defined
   as an empty string ("").

とあると思うのですが、結局どっちだと理解するのが正しいのでしょう?
ご意見を聞かせていただけると助かります。_o_
#上記のような方向で修正すれば __WIN32 は取れるのですが、
#security の話ですし。。
#cmd と cgi を分けたとはいえ QUERY 周りは。。


   Best regards,
----
Ken-ichi Hirose  kenzo-@xxxxxxxxxx