2015-09-16 24 views
0

我有xdebug设置用于错误跟踪,我在登录表单上看到问题。只要用户尝试登录,xdebug就会以usernamepassword引发堆栈跟踪。现在问题是如何用占位符字符替换那些例如*,以避免登录用户名/密码。使用xdebug时避免泄漏用户名/密码

这是不是一个PRODUCTION SERVER

回答

1

这有点晚,但我一直在寻找这个问题的答案,并没有发现任何。这是我想出的。

使用setter方法(或构造函数)将凭据传递给您的身份验证模式,而不是直接将它们传递到可能有错误的任何功能:

class Auth 
{ 
    protected 
     $username=null, 
     $password=null; 
    ... 
    public function setCredentials($username,$password) 
    { 
     $this->username=$username; 
     $this->password=$password; 
    } 
    public function login() 
    { 
     $result=false; 
     //credentials are not passed to this function 
     //so if something goes wrong they won't end up 
     //in the stack trace 
     ...retrieve user record from database... 
     $result=password_verify($this->password,$data['password_hash'])); 
     if($result) 
     { 
      ...success - finish logging user in... 
     } 
     return $result; 
    } 
    ... 
} 

的setCredentials方法功能很简单,没有什么那会导致异常被抛出。

登录函数不会将凭据作为参数,因此如果出现问题,您的密码将不会以堆栈跟踪(而不是Auth :: login('thisisme','thisismypassword')堆栈跟踪,你会看到Auth :: login())

据我所知,password_verify函数不会抛出异常,但如果你是偏执狂,你可以把它包装在try/catch块:

try 
{ 
    $result=password_verify($this->password,$data['password_hash'])); 
} 
catch(Exception $ex) 
{ 
    error_log(get_class($this).'::'.__FUNCTION__.': password_verify() failed.'); 
} 

密码散列应该已经设置使用password_hash()

http://php.net/manual/en/function.password-hash.php

http://php.net/manual/en/function.password-verify.php

+0

您想添加一些描述为什么这应该工作或背后的哲学是什么,谢谢。 – sakhunzai

+1

我在答案中增加了更多细节。 –

1

嗯,你真的打开错误报告上的生产?这样一个勇敢的人:)

禁用它!生产应该记录错误,永远不要显示它们。

+0

奖励:如果你关心的人阅读的日志,你可以使用['\钠\ crypto_box_seal()'](https://paragonie.com/book/pecl-libsodium /read/08-advanced.md#crypto-box-seal)与一个crypto_box公共密钥,密钥保存在一个airgapped计算机中。这可以让你混淆它们而不会丢失数据。 –

+0

@Elon我没有说它的生产。 – sakhunzai

+0

如果不是生产,那么就没有机会泄漏任何东西,对吧? –