Xss 处理

预防xss,页面中不同区域的字串应该使用不同的手段来处理,而不是一概的htmlspecialchars,简单+实用。

<?php
/**
 * Xss 处理
 *
 * 作者: 刘卫锋 (kevonliu@tencent.com)
 * 创建时间: 2013-07-04
 *
 * $Id: Xss.php 48518 2013-07-05 03:35:04Z kevonliu $
 */

class Xss {

    /**
     * 处理链接字串
     *
     * @param string $str
     * @return string
     */
    public static function link($str) {

        $pairs = array(
            '\'' => '%27',
            '"'  => '%22',
            '<'  => '%3C',
            '>'  => '%3E',
        );

        return strtr($str, $pairs);
    }

    /**
     * 处理js中的字串
     *
     * @param string $str
     * @return string
     */
    public static function js($str) {

        // See ECMA 262 section 7.8.4 for string literal format
        $pairs = array(
            // "\\" => "\\\\",
            // "\"" => "\\\"",
            // '\'' => '\\\'',
            '\"' => '\\x22',
            '\'' => '\\x39',
            '\\' => '\\x92',

            # To avoid closing the element or CDATA section
            '<' => '\\x3c',
            '>' => '\\x3e',

            # To avoid any complaints about bad entity refs
            '&' => '\\x26',

            # Work around https://bugzilla.mozilla.org/show_bug.cgi?id=274152
            # Encode certain Unicode formatting chars so affected
            # versions of Gecko don't misinterpret our strings;
            # this is a common problem with Farsi text.
            "\xe2\x80\x8c" => "\\u200c", // ZERO WIDTH NON-JOINER
            "\xe2\x80\x8d" => "\\u200d", // ZERO WIDTH JOINER
        );

        return strtr($str, $pairs);
    }

    /**
     * 处理html中的字串
     *
     * @param string $str
     * @return string
     */
    public static function html($str) {

        $pairs = array(
            '"'  => '&quot;',
            '\'' => '&#039;',
            '&'  => '&amp;',
            '>'  => '&gt;',
            '<'  => '&lt;',
        );
        return strtr($str, $pairs);
    }

}

?>

以上是php版本的代码,其他语言均类似。
欢迎指正,共同进步~~ 

25
Nov 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

获取客户端IP用什么方式?

在这个灌水盛行的年代,我们必须要对那些心怀不轨,总是想着做点啥坏事的青年们,致以亲切的祝福:最近还好吗,是不是闲的蛋疼。

本博客使用Typecho 程序搭建,添加验证码插件后,垃圾评论还是有不少。隔个5-6天就有20多条,前几天修正了验证码插件当中的一个bug,稍微减缓了一点,不过还是有一些。这里就再对后台 “同一IP发布评论的时间间隔限制为N钟”这个功能动点手脚吧。首先要说明的是,这个功能并不能阻挡这些“灌水青年”的恶劣行为,这是因为基于Typecho程序,这个IP可以伪造,致使上面的设置起不到作用。但是这并不能认为是Typecho的bug,因为当你了解了它的用意之后就会明白。

阅读剩余部分...

10
Nov 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

程序员如何面对需求变化

在工作中也接触过各种各样的项目,有的注重时间,有的注重质量,有的注重成本。有些项目会随着时间的推移侧重点会有所改变,比如刚开始可能注重质量、后来开始注重成本、最后可能注重时间,因此在这个变化中项目经理为了整体把控好这个项目,一些需求的变动也是再所难免。即使没有上面说的这些情况,一个项目从开始到结尾,需求的变化肯定是会有的。对于互联网行业,一个新产品的出现往往会立为一个项目,这里主要也是针对这样项目来进行描述。产品需求需求变化意味着什么,意味着程序要要不停的修改之前编写的代码,同时也就意味着不能按时下班。那么程序员怎么才能够更好的应对产品的这些快速的需求变化呢?于是乎,业界的高人提到了敏捷、迭代,但是真正能运用好,还是要经过千锤百炼。

阅读剩余部分...

3
Nov 2013
AUTHOR WiFeng
CATEGORY C/C++,Web
COMMENTS No Comments

C++五种内存分配方法的区别

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。 
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。 
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。 
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在《const的思考》一文中,我给出了6种方法) 

阅读剩余部分...

3
Nov 2013
AUTHOR WiFeng
CATEGORY C/C++
COMMENTS No Comments

如何编写高性能的应用程序

在这个硬件性能日新月异的年代里,我们充分的享受着硬件带给我们的“免费午餐”,似忽软件的效率问题已经不再是一种被开发者关心的问题,但是,随着CPU的主频提高步伐越来越慢,高速缓存也不是可以无限制增加,新技术的使用逐渐被用来提高硬件的性能,这时候,要充分发挥这些新特性,软件的支持就显得很重要了,于是,程序的运行效率再一次映入我们的视野,新时代的软件优化,我们该何去何从? 

阅读剩余部分...

3
Nov 2013
AUTHOR WiFeng
CATEGORY Jotting
COMMENTS No Comments

从美学角度来看待编写的代码

似漫漫征途,半个世纪,代码发展至今已有大从如同象形文字般的纸孔设计到01机器指令序列、到能进行简单翻译的汇编伪指令集..到后来的结构化程序语言和如今的面向对象语言设计、脚本语言以及更多将来未知的代码语言,可谓层出不穷。在如同物种优胜劣汰般的法则下,代码也随着我们思想力、行动力的不断前进、不断进化。代码对我犹如一座雕像般具有着力与美。 

阅读剩余部分...

3
Nov 2013
AUTHOR WiFeng
CATEGORY Jotting
COMMENTS No Comments

浅谈HTTPS

HTTP是每个web开发人员再熟悉不过的网络传输协议,可是对于他的大哥HTTPS,我们又有多少了解呢?我在这里就把网络上的一些对于他们的阐述整理一番。

阅读剩余部分...

26
Sep 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

fopen / fsockopen

fopen 与 fsockopen 均可以打开一个URL地址,那么究竟有什么区别呢?

第一、用法

Example. Not

   $viart_xml = fopen("http://www.viart.com/viart_shop.xml", "r");

But

   $viart_xml = fsockopen("www.viart.com", 80, $errno, $errstr, 12);

   fputs($viart_xml, "GET /viart_shop.xml HTTP/1.0\r\n");
   fputs($viart_xml, "Host: www.viart.com\r\n");
   fputs($viart_xml, "Referer: http://www.viart.com\r\n");
   fputs($viart_xml, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n\r\n");
从上面的代码可以看到,fopen的参数是 URL 地址,而fsockopen的参数是一个域名。

第二、实现
fopen
1. 更高级,对一些调用细节有一定的封装。
2. 可使用场合:http/ ftp / 本地文件
fsockopen
1. 更底层,基于端口来连接。
2. 可以实现与网络连接相关的所有功能,但是如果要打开一个普通的URL地址,fsockopen还需要指定端口,而fopen却可以根据http协议用默认的80端口,因此在这种情况下,fopen更方便。
3. 对于本地文件,fsockopen好像也是无能为力。

26
Sep 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

js之对象的属性

js 中是可以通过 new function 来达到创建对象的实现,好处自不用多说。来段代码演示一下:
<script>
function student(name, age, sex) {
	var name = name;
	this.age = age;
	sex = sex;
}

var jack = new student("jack", 14, "男");
alert(jack.name); // undefined
alert(jack.age);  // 14
alert(jack.sex);  // undefined
</script>

可以看到在 student 函数内部使用 this 引用赋值的变量是可以使用其对象调用的(如:age),反之却不能被其对象所调用。

为什么会说这个区别呢?这是因为大多数面向对象语言中,在此种这种情况下 this 是可以省去的。如果你已经习惯了 java 或者是 php,那么你写这种 js 时就要多留心了,小心被自己的惯性思维所欺骗。

11
Aug 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

php中json_encode处理

php 中函数很多,用起来都比较顺手。正是这样,久而久之,就会形成一种只看参数名称,不仔细阅读函数用法的坏习惯。比如,其中的 json_encode , 现在大多数网站是采用 UTF8 编码,这种情况下使用 json_encode 是没有任何问题的,但当网站编码是其他时,这就不好了,如下:

<?php

// 字符串
$str = '我是中国人';
$json_str = json_encode($str);
var_dump($json_str, json_decode($json_str));

// 对象
class stu {
	var $age = 10;
	var $name = '老外';
}
$s1 = new stu();
$json_s1 = json_encode($s1);
var_dump($json_s1, json_decode($json_s1));
?>
如果上面文件保存为 UTF8 编码时,结果完全正确,如果保存为其他编码时,结果不是你期望的。

其实这个情况,在手册中是有说明的,如下:
待编码的 value ,除了resource 类型之外,可以为任何数据类型
该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)

那么,如果我们的编码不是 UTF8 时就完全不能使用这个功能吗?可以,需要稍加处理,如下:

define('DEFAULT_CHARSET', 'gbk');

function json_safe_encode($var)
{
    return json_encode(json_fix_cyr($var));
}

function json_fix_cyr($var)
{
    if (is_array($var)) {
        $new = array();
        foreach ($var as $k => $v) {
            $new[json_fix_cyr($k)] = json_fix_cyr($v);
        }
        $var = $new;
    } elseif (is_object($var)) {
        $vars = get_class_vars(get_class($var));
        foreach ($vars as $m => $v) {
            $var->$m = json_fix_cyr($v);
        }
    } elseif (is_string($var)) {
        $var = iconv(DEFAULT_CHARSET, 'utf-8', $var);
    }
    return $var;
} 
上面的例子是假设是 gbk 编码的情况,如果是其他编码情况,聪明的你一定知道该怎么搞了吧~~


11
Aug 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments