> 백엔드 개발 > PHP 튜토리얼 > hijack - php 这到底是要闹怎样啊 ...

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

WBOY
풀어 주다: 2016-06-06 20:51:55
원래의
1114명이 탐색했습니다.

有个类是这样 ...

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' );
로그인 후 복사
관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿