• 实现vertical-align的几种办法

    Posted on 2011-07-07

    一个简单的例子:

    <div style="vertical-align: middle; height: 100px;">
        <span>hello world!</span>
    </div>
    

    可以看到”hello world!”并没有垂直居中。网上有很多人从很多不同地方面进行分析,其实简单概括就一句话:
    vertical-align的作用范围仅限标签(“display:table-cell”)或”display:inline-block”元素。

    那么如何实现垂直居中呢?

    最简单的方法,当父容器的高已知时,可以简单地设定要剧中的元素的line-height为父容器的高度即可实现垂直局中。如:

    <div style="vertical-align: middle; height: 100px;">
        <span style="line-height: 100px;">hello world!</span>
    </div>
    

    第二个方法,当父容器高度未知,子元素高度已知时,可以依次这样做:

    1. 设置父容器position:relative 或 position:absolute.
    2. 设置子元素position:absolute 且 top:50%.
    3. 设置子元素margin-top: -子元素高度的二分之一.

    喜欢简单的方式?

    喜欢简单的人们可以使用下面的javascript代码(需要jQuery),原理是在要垂直局中的元素外包一层:

    $(function(){
        $('.vertical-align-middle').wrapInner(
          '<table height="100%" width="100%">
            <tr><td style="vertical-align: middle;"></td>
            </tr>
          </table>');
    });
    

    注: 将要垂直居中的容器class设成vertical-align-middle即可,如前一例:

    <div class="vertical-align-middle" style="height: 100px;">
        <span>hello world!</span>
    </div>
    

    enjoy it!

    Continue Reading "实现vertical-align的几种办法"→

  • PHP实现Singleton

    Posted on 2011-06-17

    什么是Singleton

    The Singleton pattern applies to situations in which there needs to be a single instance of a class. The most common example of this is a database connection. Implementing this pattern allows a programmer to make this single instance easily accessible by many other objects.

    目前的一个项目有几个模块需要实现Singleton,于是想实现一个Singleton基类来使这些模块通过继承该基类实现Singleton。

    <?php
    class Singleton
    {
        protected static $instances;
    
        public static function getInstance()
        {
            if(!isset(self::$instances)) {
                self::$instances = new __CLASS__;
            }
            return self::$instances;
        }
    
        protected function __construct() { }
    
        protected function __clone() { }
    
    }
    

    这是一个Singleton的PHP实现,然而这时希望通过如下代码使Database类实现Singleton是不可行的:

    <?php
    class Database extends Singleton { }
    

    因为__CLASS__获得的永远只是父类(Singleton)而不是子类,所以无法获知子类类信息,自然也就无法实现子类的单例。

    PHP5.3 提供了get_called_class()函数,透过此函数可以实现Singleton的继承

    其它实现方式

    为了能在PHP5.3以前实现Singleton的继承,我们可以定义一个静态数组来维护类的实例,定义以及使用方法如下:

    <?php
    class Singleton
    {
        protected static $instances = array();
    
        public static function getInstance($className)
        {
            if(!isset(self::$instances[$className])) {
                self::$instances[$className] = new $className;
            }
            return self::$instances[$className];
        }
    
        protected function __construct() { }
    
        protected function __clone() { }
    
    }
    
    class Database extends Singleton
    {
        public function hello()
        {
            echo 'hello';
        }
    }
    
    Singleton::getInstance('Database')->hello();
    

    Continue Reading "PHP实现Singleton"→

  • 由一次恶意日志分享看人人的CSRF漏洞

    Posted on 2011-05-14

    前几天在人人上看到同学发的一条包含链接的状态,我随手点开这个链接,发现跳转到了人人上的一篇日志。当时没多想就关掉了,过一会儿再看自己的人人主页发现多了一条和同学一样内容的状态。我马上意识到与刚才日志有关,于是查看那篇日志的源代码,发现如下代码:

    <img src="http://rrurl.cn/{……}/" height="0" />
    

    意识到src中的网址可能有问题,于是wget了一下,发现该网址会跳转到http://status.renren.com/doing/updateNew.do?content={……}。也就是说浏览器为了下载这幅”图像“,访问了updateNew.do,这样如果你已经登录了人人,就会自动发出状态。这就是一次典型的CSRF攻击。

    什么是CSRF攻击?

    CSRF – Cross-site Request Forgery 字面意思指跨站点请求伪造,也就是跨站漏洞攻击,通常用来指 WEB 网站的这一类漏洞,即在某个恶意站点的页面上,促使访问者请求你的网站的某个 URL(通常会用 POST 数据方式),从而达到改变服务器端数据的目的。这一类攻击依赖于你的网页中的表单,脆弱的表单很容易受到攻击。

    解决方案

    CSRF攻击相对来说比较容易让人忽视且难以防范。简单来讲可以采用以下方案尝试解决:

    1. 不允许通过GET方式提交数据
    2. 可以采用生成临时"session_key"来做单次验证,验证后即重置

    Continue Reading "由一次恶意日志分享看人人的CSRF漏洞"→