网页密码验证问题

网页密码验证问题

要实现像路由器一样的登陆密码功能(在浏览器内直接输入url不能打开,必须先验证了主界面的密码之后才能打开),该怎么做,思路是怎样的呢?
查查http的WWW-Authenticate
未验证时,发送401应答
多谢回复, 能否写点简单的例子,因为我不是专门从事web方面的开发,只是想在做的产品中做个简单的类似路由器的管理功能;
可以用session,每页前面加入session验证,如果没有相应的值就跳转到登录页,登录页的功能也简单,验证后加入session信息就ok。
你可以试试以下的解决办法:

1. 使用BOA自己的认证
据说boa.org上的原版boa是不支持认证的,而uclinux带的boa支持认证,可以去google一下看看。
至于认证的具体配置方法,没找到这方面的资料,如果实在不行的话,看看boa的源代码也许能知道。

2. 使用CGI发401进行认证
这个我做到了,但只能弹出密码输入框,而在httpd下,输入的密码服务器没法获得。
测试服务器: wnidows xp + apache-2.0
源代码:

[Copy to clipboard] [ - ]
CODE:
#include <stdio.h>
#include <stdlib.h>

int main() {
  char * p_username, * p_password;
  extern char ** environ;      // stdlib.h中指向所有环境变量的指针
  char ** pp_env;

  p_username = getenv("REMOTE_USER" ) ;
  p_password = getenv("REMOTE_PASS" ) ;

  if (p_username && p_password
      && strcmp(p_username, "abc") == 0 && strcmp(p_password, "123" ) == 0) {

    printf("Content-Type: text/html\n\n" );
    printf("Username = %s, pass = %s<br/>\n", p_username, p_password);

    for (pp_env = environ; *pp_env; pp_env++) {
      printf("%s<br/>\n", *pp_env);
    }
  } else {
    printf("Status: 401 Unauthorized\n" );
    printf("WWW-Authenticate: Basic realm=\"Enter your password:\"\n\n" );
    printf("Unauthorized\n" );
  }

  return 0;
}

编译后放到cgi-bin下执行,能出来密码输入框,但无论输入什么,
auth.exe得到的环境变量里都没有REMOTE_USER和REMOTE_PASS。
枚举了环境变量,里面确实没有。

apache的官方文档的Q&A(可以google httpd REMOTE_USER)上说,
只有使用apache自己的认证功能时,才会设置REMOTE_USER和REMOTE_PASS。
也就是说,通过CGI发送401的方法,apache不会负责给你设置这两个环境变量,
也就没法做认证了。

另外据我所知,apache在使用mod_php、mod_perl等模块方式运行程序(而不是CGI时)时,
可以进行认证。具体实现方法不详,不过肯定跟你的问题无关了。

上面这个程序你可以试试看,也许BOA会给你设置REMOTE_USER和REMOTE_PASS也不一定。
to : odacharlee

这段代码是怎么跟网页联系的呢?
我需要在网页中怎么写,让网页一打开就先运行这段代码编译的cgi程序呢?之前我做的都是通过form来做的

直接在浏览器中执行就行了啊

gcc -o auth.cgi auth.c
cp auth /var/www/cgi-bin/

然后
http://yourip/cgi-bin/auth.cgi


QUOTE:
原帖由 odacharlee 于 2008-11-6 11:39 发表
直接在浏览器中执行就行了啊

gcc -o auth.cgi auth.c
cp auth /var/www/cgi-bin/

然后
http://yourip/cgi-bin/auth.cgi

一直不知道用 c 如何写成cgi  原来这么简单   学习了
测试了,也只能显示个验证框,如果要保存信息,得修改boa源码!


不过,按照odacharlee 提供的代码的思路,不使用服务器的认证,
做一个网页专门用于密码验证的,成功后把验证成功标志写入一个临时文件,然后其它的网页每次打开时先从这个临时文件中获取验证标志,如果成功则继续后面的显示,
但什么时候清除验证标志是个问题?主页关闭时?看来还是修改web server源码方便些!

果然……在网上找到的资料也都是说要修改源代码的。