0

我们有什么:

  • 一堆 apache nginx。
  • 论坛小板。

通过 Apache 授权正常进行,但使用 nginx 作为 mkhash 函数:

    function mkhash($username, $password, $salt = false) {
    global $config;

    if (! $salt) {
    // Create some sort of salt for the hash
     $salt = substr(base64_encode(sha1(rand(). time(), true). $config['cookies']['salt']), 0 , 15) ;

     $generated_salt = true;
    }

     // Generate hash (method is not important as long as it's strong)
     $hash = substr(base64_encode(md5($username . $config['cookies']['salt']. sha1($username . $password . $salt . ($config['mod']['lock_ip']? $_SERVER['REMOTE_ADDR']:''), true), true)), 0 , 20);

    if (isset($generated_salt))
     return array($hash, $salt);
    else
     return $hash;
    }

没有返回正确的值,授权失败。验证如下:

    if ($cookie[ 1 ]! == mkhash($cookie[0], $user['password'], $cookie[2] ) {
     // Malformed cookies
     destroyCookies();
     mod_login();
     exit;
    }

为了成功登录条件不应该被执行。

示例通过nginx返回值(登录失败):

  • cookie0:管理员
  • cookie1:IB37H5U7hCi6Br9M09V
  • cookie2: Nn2wUxlnirvgzkn
  • mkhash: fN1jv3t9ccThde0Kp30h

示例通过apache返回值(登录成功):

  • cookie0:管理员
  • cookie1:SgaMoQ07upLoz9Q7Wdz6
  • cookie2:Zp6BQ2b20Jsh 1R
  • mkhash: SgaMoQ07upLoz9Q7Wdz6

Apache 挂在 82 端口上(如果在该端口上处理得当,身份验证成功)。Nginx 本身只取静态文件,动态内容取自 Apache。可能是什么原因?

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_connect_timeout 120;
        proxy_send_timeout 120;
        proxy_read_timeout 180;
    }
4

1 回答 1

3

在您的哈希生成中,您使用$_SERVER['REMOTE_ADDR']

这将始终设置为 127.0.0.1。

您需要将其更改$_SERVER['HTTP_X_REAL_IP']为获得相同的 IP 地址(X-Real-IP 是您在 nginx.conf 中定义的)

于 2013-11-03T13:06:26.470 回答