【问题标题】:CGI- Password from HTML won't printCGI-来自 HTML 的密码不会打印
【发布时间】:2016-10-21 12:28:30
【问题描述】:

我们被要求使用 C、HTML、MySQL 和 CGI​​ 创建一个类似于 twitter 的程序。第一步是创建登录页面,我们会要求用户输入他们的用户名和密码。我使用 CGI x HTML 来做这件事,这是我的程序:

HTML:

<html>
  <body>
    <form action='/cgi-bin/password .cgi'>
    Username: <input type="text" name="user" ><br>
    Password: <input type="password" name ="password" id="password"  maxlength="10">
    <input type ="submit" value='Submit'>
    </form>
  </body>
</html>

CGI:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{

char *data;
char *token;
printf("Content-type:text/html\r\n\r\n");
printf("<!DOCTYPE html><html><head><title>Is Your Password and username this?<title></head><body>");
data = getenv("QUERY_STRING");
  if (data) {
        token = strtok(data, "&");
        while (token) {
              while (*token != '=') 
              {
              token++;
              }
          token++;
          token = strtok(NULL, "&");
          }
    printf("The average is %s\n", token);
  }
  printf("</body></html>");
  exit(EXIT_SUCCESS);
}

问题:输入用户名和密码并按下提交按钮后,cgi 没有打印任何内容。这只是空白区域。如何解决此问题并能够打印用户在用户名和密码框中输入的内容?谢谢!

【问题讨论】:

  • 您不会在解析查询字符串的循环内打印任何内容。在循环之后token 将是NULL(这是循环条件的一部分),您尝试打印该NULL 指针。
  • @Joachim Pileborg 关于如何打印用户名和密码有什么建议吗?那我应该打印 strtok(data) 吗?我对此有点陌生,对不起:((

标签: html c cgi


【解决方案1】:

对于初学者,我建议您复制您从getenv 获得的字符串。你永远不应该修改从getenv 得到的字符串,strtok 会修改它。

此外,当您调用strtok 时,您获得的指针指向name=value 对中名称的开头。通过修改指针变量(您使用token++),您将失去开始并且不再有指向名称的指针。

那我建议你看strchr之类的东西来简化代码,不要有内循环。

把它们放在一起,如果可能的话,你可以做类似的事情

char *data_ptr = getenv("QUERY_STRING");
char data[strlen(data_ptr) + 1];  // +1 for the string terminator
strcpy(data, data_ptr);

char *name = strtok(data, "&");
while (name != NULL)
{
    char *value_sep = strchr(name, '=');
    if (value_sep != NULL)
    {
        *value_sep = '\0';
        char *value = ++value_sep;

        printf("Name = %s\r\n", name);
        printf("Value = %s\r\n", value);
    }
    else
    {
        printf("Malformed query string\r\n");
    }

    name = strtok(NULL, "&");
}

你可以see it in "action" here

【讨论】:

  • 还是不行。我试图运行它,但它编译时出现错误,所以我尝试了:
  • char *data_ptr= getenv("QUERY_STRING");。它现在可以编译,但它仍然打印一个空白页。有什么帮助吗?谢谢
猜你喜欢
  • 2014-12-19
  • 2011-03-11
  • 2021-08-13
  • 2017-03-19
  • 2012-11-05
  • 1970-01-01
  • 2016-05-10
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多