0

0

hijack - php 这到底是要闹怎样啊 ...

php中文网

php中文网

发布时间:2016-06-06 20:51:55

|

1284人浏览过

|

来源于php中文网

原创

有个类是这样 ...

abstract class foo {
    static private $bar;

    static public function processor() {

        // some logic
        self::$bar = 'result';

    }

    static public function getBar() {
        return self::$bar;
    }
}

之前一直很美好很安全 ... foo::getBar() 的结果永远是只读且可信的 ...

结果现在新增了一个功能可以往一个定义好的类上面贴闭包 ...

$evil = Closure::bind( function() {
        self::$bar = 'hijack!';
}, null, 'foo' );

$evil();

这就好像蚂蝗一样 ... 我完全无法控制这东西的权限 ...

Transor
Transor

专业的AI翻译工具,支持网页、字幕、PDF、图片实时翻译

下载

之前我控制其他开发人员无法碰到 class foo 的定义 ... 这个类就是绝对安全的 ...

立即学习PHP免费学习笔记(深入)”;

现在不行了 ... 任何人都可以随意修改 private 的内容 ...

于是求解 ... 贴闭包这个功能是为什么会产生的 ..? 原本这个功能想解决的问题是什么 ..?

以及我有没有一种方法可以指定一个类不能被贴 ..?

回复内容:

有个类是这样 ...

abstract class foo {
    static private $bar;

    static public function processor() {

        // some logic
        self::$bar = 'result';

    }

    static public function getBar() {
        return self::$bar;
    }
}

之前一直很美好很安全 ... foo::getBar() 的结果永远是只读且可信的 ...

结果现在新增了一个功能可以往一个定义好的类上面贴闭包 ...

$evil = Closure::bind( function() {
        self::$bar = 'hijack!';
}, null, 'foo' );

$evil();

这就好像蚂蝗一样 ... 我完全无法控制这东西的权限 ...

之前我控制其他开发人员无法碰到 class foo 的定义 ... 这个类就是绝对安全的 ...

立即学习PHP免费学习笔记(深入)”;

现在不行了 ... 任何人都可以随意修改 private 的内容 ...

于是求解 ... 贴闭包这个功能是为什么会产生的 ..? 原本这个功能想解决的问题是什么 ..?

以及我有没有一种方法可以指定一个类不能被贴 ..?

查了下,分享下收获,顺便顶贴关注“保护成员变量的解决办法”:

Closure object support makes injecting behaviour into classes much more elegant — as they can give you a access to the classes’ properties. It can also simplify templating engines alot, by putting the template inside the closure.

来源:http://css.dzone.com/articles/closure...,文章里用Silex框架做了例子,不用改动被bind的类,也可以获得对象的上下文。

某些不得以的场景下,behavior(行为)可以脱离对某个类的归属,理论上更符合面对对象的抽象了,即具有相同行为的类并不需要继承自同一个父类。

至于成员保护的问题,各语言都会讨论,目前主流的意见是,语言设计层面实际不能避免这个问题。你确实可以锁定某一个class的源代码,但如果你的实现是基于接口的(这也是主流做法),你控制不了到底被调用的是哪个class。锁定源代码只能做到君子自律,但代码毕竟是团队作品。

所以只能从编程规范上下手了,即让程序员来负起这个责任。比如:如果希望保护(不管是public,还是protected)某个成员,就约定变量名前面要加“_”,如此,代码检查工具就很可以轻松地当警察:

$evil = Closure::bind( function() {
        self::$_bar = 'hijack!'; // 你不应该这么做,虽然代码是合法的
}, null, 'foo' );

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

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

相关专题

更多
深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

1

2026.01.06

mc.js网页版入口地址大全
mc.js网页版入口地址大全

本专题整合了mc.js网页版入口地址大全以及mc.js1.8.8版本汇总,阅读专题下面的文章了解更多详细内容。

36

2026.01.05

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

19

2026.01.05

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

49

2026.01.05

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.05

python设置中文版教程合集
python设置中文版教程合集

本专题整合了python改成中文版相关教程,阅读专题下面的文章了解更多详细内容。

4

2026.01.05

从零到实战:Python 编程系统入门专题
从零到实战:Python 编程系统入门专题

本专题面向零编程基础及初学者,系统讲解 Python 编程语言的核心知识与实战技巧。内容涵盖 Python 基础语法、数据结构、函数与模块、常用标准库、简单算法思维,以及真实应用场景下的小项目实战。通过循序渐进的学习路径,帮助读者快速建立编程思维,掌握 Python 在数据处理、自动化脚本及日常开发中的实际应用能力,为后续深入学习 Web 开发、数据分析或人工智能打下坚实基础。

10

2026.01.05

php代码编辑器入口汇总
php代码编辑器入口汇总

本文整理了主流PHP代码编辑器的官网入口及在线使用链接,阅读专题下面的文章了解更多详细内容。

58

2026.01.04

php代码编辑器地址汇总
php代码编辑器地址汇总

本文整理了主流PHP代码编辑器的官网入口及在线使用链接,阅读专题下面的文章了解更多详细内容。

0

2026.01.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号