LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 718|回复: 0

使用PHP的命令行模式搭建基于MySQL的Squid认证

[复制链接]
发表于 2004-12-18 11:37:56 | 显示全部楼层 |阅读模式
使用PHP的命令行模式搭建基于MySQL的Squid认证
用MySQL存储验证用户数据,就可以很方便的用PHP网站管理了,哈哈
之所以使用PHP脚本,是因为偶只有PHP懂一点点,并且手头有PHP中文手册。(随时查阅,哈哈哈哈……)
那么,开始吧
我用的是Debian,所以Squid和Apache、PHP4、MySQL的安装很简单的啦。apt-get就行了

PHP脚本:
[PHP]
#!/usr/bin/php -q
<?php
//连接MySQL数据库的设置
//MySQL服务器名,通常都是localhost
$servername = 'localhost';
//数据库用户名
$dbusername = 'dbusername';
//数据库用户密码
$dbpassword = 'dbpassword';
//数据库名
$dbname = 'dbname';
//存储认证帐号的数据表
$tablename = 'users';
//存储用户名的字段
$usercolumn = 'usercolumn';
//存储密码的字段
$pwdcolumn = 'pwdcolumn';

//通过STDIN获取输入。STDIN是PHP命令行模式下的常量,相当于$stdin = fopen('php://stdin', 'r');
    while (STDIN){
        unset($link_id,$input,$username,$password,$input_array,$result,$fetch_array);
        //连接数据库并选择数据库,出错则输出ERR。
        if (!$link_id = mysql_connect($servername,$dbusername,$dbpassword)){
            print("ERR\n");
            exit();
        }
        if(!mysql_select_db($dbname,$link_id)){
            print("ERR\n");
            mysql_close($link_id);
            exit();
        }
        //获取输入。输入格式是 “用户名 密码”
        $input=fgets(STDIN,256);
        if ($input==""){
            $input_array[0]="";
            print("ERR\n");
        }else{
        //将输入分割为用户名和密码。我的算法显然是很笨的,Webmin的perl脚本(后面有)简直美妙啊,可惜不懂-_-!
            $input_array=split(" ",$input);
            $username=$input_array[0];
            if($username==""){
                print("ERR\n");
            }else{
                $input_array[0]="";
                $password=rtrim(ltrim(join(" ",$input_array)),"\n");
                if($password==""){
                    print("ERR\n");
                }else{
                //查询数据库,正确则输出OK,错误输出ERR
                    $password=encryptpwd($username,$password);
                    $query="SELECT * FROM ".$tablename." WHERE ".$usercolumn."='".$username."' AND ".$pwdcolumn."='".$password."' AND active='1'";
                    $result=mysql_query($query,$link_id);
                    if ($result){
                        $num_rows=mysql_num_rows($result);
                        if ($num_rows==1){
                            print("OK\n");
                        }else{
                            print("ERR\n");
                        }
                    }else{
                        print("ERR\n");
                    }
                    mysql_free_result($result);
                }
            }
        }
        mysql_close($link_id);
    }

function encryptpwd($username,$password){
//密码加密函数
$mode=1;
    switch ($mode) {
        case 0:
            $salt=$username;
            //$salt = substr(time(), -2);
            $encrypted=crypt($password,$salt);
            break;
        case 1:
            $encrypted=md5($password);
            break;
        case 2:
            $encrypted=base64_encode(md5($password));
            $encrypted="$$encrypted$";
            break;
    }
    return $encrypted;
}
?>
[/PHP]
写完后保存在某个位置,比如/etc/squid/php_auth.php
然后设为可执行

  1. #chmod 755 /etc/squid/php_auth.php
复制代码


建立MySQL数据库:
PhpMyadmin很方便的
先建立一个数据库,起个名字
然后输入以下内容建立数据表并插入数据。表名和字段名可以自己设置啦


  1. CREATE TABLE `users` (
  2.   `uid` int(11) NOT NULL auto_increment,
  3.   `usercolumn` varchar(16) NOT NULL default '',
  4.   `pwdcolumn` varchar(64) NOT NULL default '',
  5.   PRIMARY KEY  (`uid`)
  6. ) TYPE=MyISAM ;

  7. INSERT INTO `users` VALUES ('','001', MD5('001'));
复制代码




测试:

  1. #/etc/squid/php_auth.php  回车后会等待输入
复制代码

输入
  1. 001 001 用空格分隔用户名和密码,回车
复制代码

正确会显示OK,错误显示ERR
Ctrl+C退出


Squid的外部认证程序其实只需要能从STDIN获取输入,并且能正确时输出OK\n,错误输出ERR\n就行了,用什么语言写都是可以的。

好了,脚本已经写好,数据库也有了,现在该让Squid知道我们要它用我们写的脚本来验证用户了

Squid的设置:
在/etc/squid/squid.conf中添加这些


  1. auth_param basic realm Squid proxy server  #会在验证窗口显示哦
  2. auth_param basic program /etc/squid/php_auth.php #外部认证程序
  3. auth_param basic credentialsttl 2 hour #验证信任时间(大概是这样吧),过了这个时间就会重新要求验证
  4. auth_param basic children 5 #客户验证程序数目

  5. #acl设置
  6. acl auth proxy_auth REQUIRED #要求访问验证

  7. #代理约束规则
  8. #http_access deny !auth #没验证的没得看哦
  9. http_access allow auth  #验证的pass pass啦
复制代码



还有,要验证就不能透明代理。唉,这让偶相当郁闷

附:Webmin的Squid认证脚本。正则表达式看不懂啊

  1. #!/usr/bin/perl
  2. # squid-auth.pl
  3. # A basic squid authentication program

  4. open(AUTH, $ARGV[0]);
  5. while(<AUTH>) {
  6.         s/\r|\n//g;
  7.         s/#.*$//;
  8.         if (/^(\S+):(\S+)/) {
  9.                 $auth{$1} = $2;
  10.                 }
  11.         }
  12. close(AUTH);

  13. $| = 1;
  14. while(<STDIN>) {
  15.         s/\r|\n//g;
  16.         local ($u, $p) = split(/\s+/, $_);
  17.         print $auth{$u} &&
  18.               $auth{$u} eq crypt($p, $auth{$u}) ? "OK\n" : "ERR\n";
  19.         }
复制代码


补充说明:
当用户更改了用户名或密码后,还需要

  1. #squid -f -k reconfigure
复制代码


否则验证就通不过,我也不知道为什么
可以在修改用户名和密码的PHP里面加一条
[PHP]
exec("squid -k reconfigure");[/PHP]

并且还有因为apache和squid的运行用户不同,php无法成功执行以上命令,所以我把apache的运行用户改成和squid一样
把/etc/apache/httpd.conf里面
  1. User www-data
复制代码

改成
  1. User proxy
复制代码


这样就都没问题了,不过不知道会不会有什么安全问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表