预防注入的4条建议

1.假定所有输入都是可疑的,必须对所有输入中的script、iframe等字样进行严格的检查。这里的输入不仅仅是用户可以直接交互的输入接口,也包括HTTP请求中的Cookie中的变量,HTTP请求头部中的变量等;

2.不要仅仅验证数据的类型,还要验证其格式、长度、范围和内容;

3.不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行;

4.对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出,即使在输入做了编码等操作,在各处的输出点时也要进行安全检查;

阅读更多

狭隘不仅是事业发展的障碍 更是人生的障碍

狭隘的人通常会多少有些自负,自负本没有什么错,但过于自负走向极端的结果就会出现狭隘。

狭隘的人生是无趣和烦闷的,你在无形中竖起来一座高墙,将周围人封于墙外,每日里还要提防有人进入。

程序员这个职业注定是一个不断学习,与人分享,与人交流,取长补短和持续积累的漫长过程。我们应该时刻保持谦虚、开放和分享的心态,因为我们热爱技术,我们不是一个人在战斗。

地球不会因为少了谁就会停止转动,团队也是如此。

对于一个在团队中的程序员来说,你去混淆Javascript代码,给团队中其他人增加阅读难度的这种事情,毫无职业道德可言。如此狭隘的心胸会和没有操守的做法,不仅会毁了你的前程,同样会毁了你的人生。

最后,望各位共勉!

简单几行PHP代码 搞定Slave数据库的连接平均分布

对于访问量较大的动态网站来说,后端MySQL数据库通常会采用主从(Master / Slave)同步的架构设计。

如果资金宽裕,可以购买昂贵的f5负载均衡器来解决多台Slave数据服务器的访问。还可通过免费的开源软件LVS来实现多台后端Slave数据服务器的访问,但LVS的设置比较繁琐,需要具备一些网络技术方面的知识储备,门槛还是较高的。

那么,是否还有更简单的方法呢?下面我来分享一段PHP代码,简单几行,就可以搞定多台后端Slave数据库的连接平均分布。

<?php
//定义多个数据库服务器信息
$slaveDbList = array(
    '1' => array('DB_HOST'=>'192.168.1.1', 'DB_USER'=>'slaveuser', 'DB_PW'=>'123456'),
    '2' => array('DB_HOST'=>'192.168.1.2', 'DB_USER'=>'slaveuser', 'DB_PW'=>'123456')
);

//定义hash矩阵
$slaveHashList = array(
    '0'=>'1', '1'=>'1', '2'=>'1', '3'=>'1', '4'=>'1', '5'=>'1', '6'=>'1', '7'=>'1',
    '8'=>'2', '9'=>'2', 'a'=>'2', 'b'=>'2', 'c'=>'2', 'd'=>'2', 'e'=>'2', 'f'=>'2'
);

//获取客户端ip,并计算hash代码
$clientIp = getClientIp();
$ipHash = substr(md5($clientIp), 0, 1);

//声明数据库连接信息
define('SLAVE_DB_HOST',         $slaveDbList[$slaveHashList[$ipHash]]['DB_HOST']); //数据库服务器地址
define('SLAVE_DB_USER',         $slaveDbList[$slaveHashList[$ipHash]]['DB_USER']); //用户名
define('SLAVE_DB_PW',           $slaveDbList[$slaveHashList[$ipHash]]['DB_PW']);   //密码
define('SLAVE_DB_NAME',         'test'); //数据库名称
define('SLAVE_DB_CHARSET',      'utf8'); //编码格式

function getClientIp()
{
    $clientIp = null;
 
    if ($clientIp !== null) return $clientIp;
    if (isset($_SERVER)) {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            foreach ($arr as $ip) {
                $ip = trim($ip);
                if ($ip != 'unknown') {
                    $clientIp = $ip;
                    break;
                }
            }
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $clientIp = $_SERVER['HTTP_CLIENT_IP'];
        } else {
            if (isset($_SERVER['REMOTE_ADDR'])) {
                $clientIp = $_SERVER['REMOTE_ADDR'];
            } else {
                $clientIp = '0.0.0.0';
            }
        }
    } else {
        if (getenv('HTTP_X_FORWARDED_FOR')) {
            $clientIp = getenv('HTTP_X_FORWARDED_FOR');
        } elseif (getenv('HTTP_CLIENT_IP')) {
            $clientIp = getenv('HTTP_CLIENT_IP');
        } else {
            $clientIp = getenv('REMOTE_ADDR');
        }
    }
    preg_match("/[\d\.]{7,15}/", $clientIp, $onlineIp);
    $clientIp = !empty($onlineIp[0]) ? $onlineIp[0] : '0.0.0.0';
    return $clientIp;
}
?>

阳光部落原创,更多内容请访问http://www.sunbloger.com/

列举WEB网页常用的DOCTYPE声明

HTML 5

<!DOCTYPE html>

 HTML 4.01 Strict

该 DTD 包含所有 HTML 元素和属性,但不包括展示性的和弃用的元素(比如 font)。不允许框架集(Framesets)。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd">

 HTML 4.01 Transitional

该 DTD 包含所有 HTML 元素和属性,包括展示性的和弃用的元素(比如 font)。不允许框架集(Framesets)。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">

阅读更多

从技术岗位走向管理岗位:机会是留给有准备的人

做好本职工作是第一步

技术人员能管理好自己,出色完成本职工作是第一步。在领导交给你任务时,要主动制定工作计划,定期向领导汇报工作进展,出了问题及时 沟通,且要勇于承担责任,同时确保工作顺利进行。如果能让领导对你的工作完全信任和放心,那么你在自我管理上就已经准备好了。

阅读更多

WordPress母公司融资1.6亿美元:估值11.6亿

上个月Fortune爆料博客平台运营商Automattic(更熟悉的称谓是WordPress母公司)正在寻求超过1亿美元的新一轮融资,在投资圈引发追逐。今日,Automattic CEO Matt Mullenweg正式宣布公司已完成由Insight Venture Partners领投的1.6亿美元融资,新进投资者/机构包括Chris Sacca、Endurance。此前在去年5月,Automattic还通过二级市场融资5000万美元。目前这家创立9年的公司估值11.6亿美元,正式迈入十亿美元俱乐部。

阅读更多

阳光部落回国了

阳光部落(http://www.sunbloger.com/)在国外的服务器上漂泊了3年多,如今已回归国内,虽然在回归路上遇到种种艰辛,但还是回来了。希望阿里云不要让我失望,真没精力再搬一次了。

在SVN中进行分支开发的最佳实践

1.在分支上做开发的时候,必须定期使分支与主干同步,避免开发完成后合并(merge)回主干时出现严重冲突(confict)。

2.进行合并前,处理掉工作副本上的所有本地修改,方便合并失败时进行回滚(revert)。

3.进行合并时,特别注意 新增/删除 操作,因为很多冲突都是这类操作引起的。

4.完成一个分支的功能并合并回主干后,抛弃该分支,后续其它功能的开发使用新建的分支。