搜索
首页后端开发PHP7PHP 7.4允许从 __toString() 抛出异常

PHP 7.4允许从__toString() 抛出异常(Allow Exceptions from __toString())

介绍

目前禁止从__toString()抛出异常,并将导致致命错误。这就使得调用任意代码变得很危险,并使其成为一个有问题的通用API。此RFC旨在取消此限制。

当前行为的基本原理是,在整个引擎和标准库的许多地方都执行了字符串转换,并不是所有地方都准备“正确地”处理异常,即尽可能早地处理异常。

从技术角度来看,这种限制最终是无效的,因为字符串转换期间的异常仍然可以由将可恢复错误转换为异常的错误处理程序触发:

set_error_handler(function() {
    throw new Exception();
});
 
try {
    (string) new stdClass;
} catch (Exception $e) {
    echo "(string) threw an exception...\n";
}

事实上,Symfony利用这个漏洞来绕过当前的限制。不幸的是,这依赖于$errcontext参数,它在PHP 8中消失了.

尽管如此,在我们对该代码库中的字符串转换进行了全面审核之前,过去关于该主题的讨论一直没有放松这种限制。这已在附加的实现请求中完成。

建议

允许从__toString()抛出异常,它的行为与往常一样。不再触发致命错误。

另外,将“不能转换为字符串”和“__toString()必须返回一个字符串值”可恢复的致命错误转换为正确的错误异常,这与PHP 7中建立的错误策略一致。

扩展准则

想要优雅地处理来自字符串转换的异常的扩展作者,应该考虑以下准则:

● 如果zval_get_string()、convert_to_string()和friends生成一个异常,它们仍然会生成一个字符串。这个字符串被保证是暂存的。这意味着没有必要释放它,但可以这样做。在上下文中,您可以选择更方便的选项。

● 如果从对象到字符串的转换失败,则字符串转换的结果将为空字符串,如果将数组转换为字符串,并且错误处理程序将结果通知提升为异常,则为“Array”。(这种行为和以前一样。)

● 通常情况下,使用通常的if (EG(exception))检查来检查是否抛出了异常就足够了:

zend_string *str = zval_get_string(val);
if (EG(exception)) {
    // Possibly free other resources here.
    return;
}

除此之外,还提供了一些帮助api,将转换建模为容易出错的操作:

// Like zval_get_string() but returns NULL on conversion failure.
zend_string *str = zval_try_get_string(val);
if (!str) {
    // Possibly free other resources here.
    return;
}
// Main code.
zend_string_release(str);
 
 
// Like zval_get_tmp_string() but returns NULL on conversion failure.
zend_string *tmp, *str = zval_try_get_tmp_string(val, &tmp);
if (!str) {
    // Possibly free other resources here.
    return;
}
// Main code.
zend_tmp_string_release(tmp);
 
 
// Like convert_to_string() but returns a boolean indicating conversion success/failure.
if (!try_convert_to_string(val)) {
    // Possibly free other resources here.
    return;
}
// Main code.

如果转换失败,try_convert_to_string()将不会修改原始值。因此,使用它比使用convert_to_string()和异常检查更安全。

虽然检查每一个字符串转换肯定会使您处于安全的一方,但忽略这些检查通常只会导致一些不必要的计算和可能的冗余警告。您应该注意的主要事情是修改持久结构(如数据库)的操作。

不向后兼容的变更

从可恢复的致命错误到错误异常的转换在技术上是BC中断的。

翻译:https://wiki.php.net/rfc/tostring_exceptions

以上是PHP 7.4允许从 __toString() 抛出异常的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器