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

php中文网
发布: 2016-06-06 20:51:55
原创
1281人浏览过

有个类是这样 ...

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();
登录后复制

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

BRANDMARK
BRANDMARK

AI帮你设计Logo、图标、名片、模板……等

BRANDMARK 180
查看详情 BRANDMARK

之前我控制其他开发人员无法碰到 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速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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