Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中,清理/转义字符串以在异常消息中使用它是否是一种好的做法?_Php_Exception_Sanitization - Fatal编程技术网

在PHP中,清理/转义字符串以在异常消息中使用它是否是一种好的做法?

在PHP中,清理/转义字符串以在异常消息中使用它是否是一种好的做法?,php,exception,sanitization,Php,Exception,Sanitization,我想知道,对于输出来说,异常消息通常被认为是安全的吗?或者,如果异常消息包含不安全的字符串,是否可以?(用于XSS等) 什么样的卫生处理比较合适 例如 我个人认为,在catch()块中,来自异常的消息必须被视为潜在的不安全消息,因为它可能来自任何地方。但是throw()语句仍然可以尝试使消息变得合理 但也许有人可以提供更详细的建议,例如基于通用php框架的标准 注意:我们不要争论InvalidArgumentException是否是在这种情况下使用的正确或合适的异常类。这是一个又快又脏的示例,重

我想知道,对于输出来说,异常消息通常被认为是安全的吗?或者,如果异常消息包含不安全的字符串,是否可以?(用于XSS等) 什么样的卫生处理比较合适

例如

我个人认为,在catch()块中,来自异常的消息必须被视为潜在的不安全消息,因为它可能来自任何地方。但是throw()语句仍然可以尝试使消息变得合理

但也许有人可以提供更详细的建议,例如基于通用php框架的标准


注意:我们不要争论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()));
}