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或一般意义上的覆盖堆栈跟踪消息将这些替换为
占位符
,如果记录了错误,纯文本密码可能最终会出现在日志中-这是一个安全问题。您是否想添加一些说明,说明为什么会这样做,或者这背后的原理是什么,谢谢。我在回答中补充了更多细节。