我有xdebug
设置用于错误跟踪,我在登录表单上看到问题。只要用户尝试登录,xdebug
就会以username
password
引发堆栈跟踪。现在问题是如何用占位符字符替换那些例如*
,以避免登录用户名/密码。使用xdebug时避免泄漏用户名/密码
这是不是一个PRODUCTION SERVER
我有xdebug
设置用于错误跟踪,我在登录表单上看到问题。只要用户尝试登录,xdebug
就会以username
password
引发堆栈跟踪。现在问题是如何用占位符字符替换那些例如*
,以避免登录用户名/密码。使用xdebug时避免泄漏用户名/密码
这是不是一个PRODUCTION SERVER
这有点晚,但我一直在寻找这个问题的答案,并没有发现任何。这是我想出的。
使用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()
嗯,你真的打开错误报告上的生产?这样一个勇敢的人:)
禁用它!生产应该记录错误,永远不要显示它们。
奖励:如果你关心的人阅读的日志,你可以使用['\钠\ crypto_box_seal()'](https://paragonie.com/book/pecl-libsodium /read/08-advanced.md#crypto-box-seal)与一个crypto_box公共密钥,密钥保存在一个airgapped计算机中。这可以让你混淆它们而不会丢失数据。 –
@Elon我没有说它的生产。 – sakhunzai
如果不是生产,那么就没有机会泄漏任何东西,对吧? –
您想添加一些描述为什么这应该工作或背后的哲学是什么,谢谢。 – sakhunzai
我在答案中增加了更多细节。 –