在PHP中,清理/转义字符串以在异常消息中使用它是否是一种好的做法?
我想知道,对于输出来说,异常消息通常被认为是安全的吗?或者,如果异常消息包含不安全的字符串,是否可以?(用于XSS等) 什么样的卫生处理比较合适 例如 我个人认为,在catch()块中,来自异常的消息必须被视为潜在的不安全消息,因为它可能来自任何地方。但是throw()语句仍然可以尝试使消息变得合理 但也许有人可以提供更详细的建议,例如基于通用php框架的标准在PHP中,清理/转义字符串以在异常消息中使用它是否是一种好的做法?,php,exception,sanitization,Php,Exception,Sanitization,我想知道,对于输出来说,异常消息通常被认为是安全的吗?或者,如果异常消息包含不安全的字符串,是否可以?(用于XSS等) 什么样的卫生处理比较合适 例如 我个人认为,在catch()块中,来自异常的消息必须被视为潜在的不安全消息,因为它可能来自任何地方。但是throw()语句仍然可以尝试使消息变得合理 但也许有人可以提供更详细的建议,例如基于通用php框架的标准 注意:我们不要争论InvalidArgumentException是否是在这种情况下使用的正确或合适的异常类。这是一个又快又脏的示例,重
注意:我们不要争论InvalidArgumentException是否是在这种情况下使用的正确或合适的异常类。这是一个又快又脏的示例,重点应该放在字符串处理上。关于如何使用异常没有严格的规则,只有不应公开内部工作的规则 无论消息包含什么,用户都无法从语义上或安全地读取异常InvalidArgumentException 在下面的示例中,自定义异常
HTTPException
的意思是“要输出到客户端”。该消息将包含与应用程序、浏览器和用户相关的信息
处理接口(例如UI和浏览器)的类和函数将因用户错误引发HTTP异常,或因致命错误引发常规异常
/**
* Class HTTPException
*
* new HTTPException($message, $code)
* new Exception($message, $code)
*
* Arguments are compatible:
* $message, error message
* $code, http error code
*/
class HTTPException extends Exception
{
}
// Further up the stack
try {
// ...
} catch (HTTPException $exception) {
// Catch HTTP exception
// Respond directly to user with message
// or create error screen from template
} catch (Exception $exception) {
// Catch any exception.
// Return 500 error or any other error.
}
我要指出的另一件事是,InvalidArgumentException
更适合于无效参数,即格式无效、类型无效等
PHP缺少本质上的内置异常,但您可以自己创建它们。构建标准异常的一个好来源是.NET
对于您的函数,我将使用,KeyNotFoundException
,因为它准确地描述了问题所在,并且只要值的类型和格式正确,它就不会无效
因此,新代码可能如下所示:
class NotFoundHttpException extends HttpException
{
public function __construct($message, Exception $previous = null)
{
parent::__construct($message, 404, $previous);
}
}
try {
$v = lookupOrExplode(/* args */);
} catch (KeyNotFoundException $exception) {
throw new NotFoundHttpException(
sprintf('Key "%s" not found in lookup table.',
$exception->getKey()));
}
我会考虑每当一个输出有用户输入时,它需要像所说的那样逃脱,除非你正在输出用户创建的内容(用户输入到一个字段中并提交给你的应用程序),所以不需要逃避内容,除非你的应用程序只是内部使用的,我强烈建议不要“按原样”输出它们……是的。。但是,在将变量$key插入异常消息之前,是否应该对其进行清理?以及进行何种转义。。因为此时我们不知道异常消息将显示在哪里。关于自定义异常类,您是对的。但这应该属于单独的Q/a。这里我只对如何处理字符串感兴趣。我将更新问题以澄清这一点。否则,这看起来是一个有用的答案。@donquixote啊,好吧,与字符串的相关性被我的思维过程所取代,用户自己的数据可以反馈给他们,而无需转义。这是除非它需要HTML转义,但这不是给定名称的“此函数”的责任。Ok。我认为可能发生的最糟糕的事情是(a)消息中插入的字符串非常长,或者(b)它包含引号字符,这使得字符串看起来好像会在那里结束。这两个都是可以生存的。如果你在开始时更新帖子指出这一点,我会将其标记为接受。可能还有其他有趣的答案,比如“在框架X中,有一个策略,异常消息应该被削减到300个字符”。@donquixote我真的不能这样做,因为这不是我会做的。对我来说,如果密钥太长,就不会出现这样的异常,因为它会首先通过长度验证检查。
class NotFoundHttpException extends HttpException
{
public function __construct($message, Exception $previous = null)
{
parent::__construct($message, 404, $previous);
}
}
try {
$v = lookupOrExplode(/* args */);
} catch (KeyNotFoundException $exception) {
throw new NotFoundHttpException(
sprintf('Key "%s" not found in lookup table.',
$exception->getKey()));
}