2014-10-03 75 views
3

我们记录了所有发生在我们的代码中的异常,并且堆栈跟踪相关联。密码作为堆栈跟踪中显示的参数

的问题来自这样的功能:

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

当一个异常被该函数抛出,堆叠跟踪包含使用的参数:用户密码被显示在纯文本。

我该如何处理?我是否应该重写Authenticate函数以仅接受加密的密码?我可以不允许这个特定参数显示在堆栈跟踪中吗?

任何想法是值得欢迎的。

编辑

我使用getTraceAsString功能来记录跟踪。

+0

你使用的是默认的Exception :: getTrace()吗? xdebug有一个[collect params](http://xdebug.org/docs/all_settings#collect_params)设置,可能会有用。 – 2014-10-03 07:43:17

+0

一秒钟修补程序将使用'preg_replace'将对'Exception :: getTraceAsString'的调用打包调用。 – mudasobwa 2014-10-03 07:49:33

回答

2

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

See this example来自Exception::getTrace() docs的评论。

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; 
    } 
+2

你的回答确实对我有帮助,但是这个功能只记录了最后一个功能。我选择使用这个:http://php.net/manual/fr/exception.gettraceasstring.php#114980 – Getz 2014-10-03 08:26:28

1

两件事情,我建议:

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

  2. 身份验证应该只接受密码的哈希版本

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

理想的方法当然是使用类似Xdebug这样的默认设置collect_params is 0,这意味着变量不显示在堆栈轨迹上。

+0

谢谢。客户端不能看到堆栈跟踪,只能由管理员查看,但他们不必看到用户的密码。我们使用Xdebug,但仅限于我们的开发环境,而不是生产环境。 – Getz 2014-10-03 07:51:41