Php 使用xdebug时避免用户名/密码泄漏

Php 使用xdebug时避免用户名/密码泄漏,php,security,xdebug,Php,Security,Xdebug,我已经为错误跟踪设置了xdebug,我在登录表单上看到了一个问题。只要用户尝试登录xdebug就会抛出一个带有usernamepassword的堆栈跟踪。现在的问题是如何用占位符字符替换这些字符,例如*,以避免登录用户名/密码 这不是生产服务器嗯,您真的打开了生产错误报告功能吗?这么勇敢的人:) 禁用它!生产部门应该记录错误,永远不要显示错误。这有点晚了,但我一直在寻找这个问题的答案,但没有找到任何答案。这是我想到的 使用setter(或构造函数)将凭据传递给auth模型,而不是直接传递给可能有

我已经为错误跟踪设置了
xdebug
,我在登录表单上看到了一个问题。只要用户尝试登录
xdebug
就会抛出一个带有
username
password
的堆栈跟踪。现在的问题是如何用占位符字符替换这些字符,例如
*
,以避免登录用户名/密码


这不是
生产服务器

嗯,您真的打开了生产错误报告功能吗?这么勇敢的人:)


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

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

使用setter(或构造函数)将凭据传递给auth模型,而不是直接传递给可能有错误的任何函数:

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()设置密码散列


额外好处:如果您担心人们阅读日志,您可以使用加密箱公钥,该公钥保存在一台有空隙的计算机中。这可以让你在不丢失数据的情况下混淆它们。@Elon我没有说它的生产。如果它不是生产,那么就不可能泄露任何东西,对吗?@Elon我的重点不是生产与否,它的问题是,是否可以使用xdebug或一般意义上的覆盖堆栈跟踪消息将这些替换为
占位符
,如果记录了错误,纯文本密码可能最终会出现在日志中-这是一个安全问题。您是否想添加一些说明,说明为什么会这样做,或者这背后的原理是什么,谢谢。我在回答中补充了更多细节。