密码作为参数显示在堆栈跟踪中


Password as argument displayed in stack-trace

我们记录代码中发生的所有异常,并关联堆栈跟踪。

问题来自这个功能:

public function Authenticate($user, $password)
    //Authenticate the user
}

当此函数引发异常时,堆栈跟踪包含所使用的参数:用户密码以纯文本显示。

我该怎么处理?我应该重写Authenticate函数以只接受加密的密码吗?我可以禁止在堆栈跟踪中显示此特定参数吗?

欢迎任何想法。

编辑

我使用getTraceAsString函数来记录跟踪。

您可以使用Exception::getTrace()方法来收集信息,并编写自己的自定义getTraceAsString(),不包括参数。

请参阅Exception::getTrace()文档上的注释中的此示例。

  function MakePrettyException(Exception $e) {
    $trace = $e->getTrace();
    $result = 'Exception: "';
    $result .= $e->getMessage();
    $result .= '" @ ';
    if($trace[0]['class'] != '') {
      $result .= $trace[0]['class'];
      $result .= '->';
    }
    $result .= $trace[0]['function'];
    $result .= '();<br />';
    return $result;
  }

我建议两件事:

  1. 堆栈跟踪不应在客户端上可见(如果还没有)

  2. Authenticate应该只接受密码的哈希版本

这样,即使有人有散列密码的副本,他们也不能用它登录,也不能用它们来反转密码。

当然,理想的方法是使用类似Xdebug的东西,其中collect_params的默认设置为0,这意味着变量不会显示在堆栈跟踪上。