Heim  >  Artikel  >  Backend-Entwicklung  >  hijack - php 这到底是要闹怎样啊 ...

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

WBOY
WBOYOriginal
2016-06-06 20:51:551076Durchsuche

有个类是这样 ...

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 的定义 ... 这个类就是绝对安全的 ...

现在不行了 ... 任何人都可以随意修改 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 的定义 ... 这个类就是绝对安全的 ...

现在不行了 ... 任何人都可以随意修改 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' );
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn