cgi中读写本地文件一定要将文件属性设为666

问题:

用c语言写了个cgi脚本,用来读取从网页中输入的字符串,并将该字符串append到本地的一个文本文件data.txt中;

cgi脚本如下,collect.c源文件:

#include 
#include 

#define MAXLEN 80
/* 4 for field name "data", 1 for "=" */
#define EXTRA 5
/* 1 for added line break, 1 for trailing NUL */
#define MAXINPUT MAXLEN+EXTRA+2
#define DATAFILE "./data.txt"
 
void unencode(char *src, char *last, char *dest) {
    for(; src != last; src++, dest++)
        if (*src == '+') {
            *dest = ' ';
        }
        else if(*src == '%') {
            int code;
            if (sscanf(src+1, "%2x", &code) != 1) {
                code = '?';
            }
            *dest = code;
            src +=2;
        }     
        else {
            *dest = *src;
        }
    *dest = '\n';
    *++dest = '\0';
}
 
int main(void) {
    char *lenstr;
    char input[MAXINPUT];
    char data[MAXINPUT];
    long len;

    printf("%s%c%c\n", "Content-Type:text/html;charset=iso-8859-1",13,10);
    printf("Response\n");

    lenstr = getenv("CONTENT_LENGTH");
    if (lenstr == NULL || sscanf(lenstr,"%ld",&len) != 1 || len > MAXLEN) {
        printf("

Error in invocation - wrong FORM probably.\n"); } else { printf("

CONTENT_LENGTH is %ld.

\n", len); // fgets(input, len+1, stdin); fgets(input, len+1, stdin); unencode(input+EXTRA, input+len, data); FILE *fp; fp = fopen(DATAFILE, "a+"); if(fp == NULL) { printf("

Sorry, cannot store your data.

"); } else { printf("

Your data is: %s.

\n", data); fputs(data, fp); } fclose(fp); printf("

Thank you! The following contribution of yours has been stored:

%s\n",data); } return 0; }

网页文件如下,collect.html:



    
    
    


Please input your words:



使用thttpd作为web服务器提供web访问服务。

页面中的内容如下图所示:

cgi中读写本地文件一定要将文件属性设为666_第1张图片


问题是,输入到框中的字符串总不能添加到本地文件data.txt中,提示错误信息如下:

cgi中读写本地文件一定要将文件属性设为666_第2张图片

解决办法:

1. 首先检查脚本collect.c,在命令行中运行编译生成的collect.cgi:

u1204@u1204-zhw:/usr/local/www/data/cgi-bin$ ./collect.cgi 
Content-Type:text/html;charset=iso-8859-1

Response

Error in invocation - wrong FORM probably. u1204@u1204-zhw:/usr/local/www/data/cgi-bin$


由于输入的字符串为空,所以条件“lenstr == NULL”成立,所以会打印输出“

Error in invocation - wrong FORM probably.”。


2. 将collect.c中对本地文件的访问屏蔽掉:

    /// FILE *fp;
    /// // fgets(input, len+1, stdin);
    /// /// fgets(input, len, stdin);
    /// // unencode(input+EXTRA, input+len, data);
    /// fp = fopen(DATAFILE, "a+");
    /// if (fp == NULL) {
    ///     printf("

Sorry, cannot store your data.

");     /// }     /// else {     ///     char tch[] = "How are you!\n";     ///     fputs(tch, fp);     /// }     /// fclose(fp);
重新编译生成collect.cgi,在网页中点击“OK”按钮。可以看到不再有“No data received”的错误提示。

提示收到了一定数量的字符串。


3. 又经过一番折腾,将本地文件data.txt的属性由664改为666,再次点击网页中的“Ok”按钮,终于可以正确显示数据了。

查看本地文件data.txt,发现网页中输入的字符串也正确追加进来了。

注意:该本地文件data.txt需要放到cgi-bin目录下。


问题解决。




你可能感兴趣的:(shell,c语言,web开发)