最近做一个文章发布系统,突然发现我的PHP基础只是很薄弱,尤其是保存文章content部分的时候经常出现转义问题。

首先我们需要对POST和GET数据做自动转义过滤,那么我们需要判断服务器是否开启了自动转义,否则我们可能出现重复转义。

if ( ! get_magic_quotes_gpc() ) {
    function clean($data) {
        if (empty($data))
            return $data;
        else
            return is_array($data) ? array_map('clean', $data) : addslashes($data);
        }

    if (!empty($_GET)) {
        $_GET  = clean($_GET);
    }
    if (!empty($_POST)) {
        $_POST = clean($_POST);
    }

    $_COOKIE   = clean($_COOKIE);
    $_REQUEST  = clean($_REQUEST);
}

情况1:
通过上面的操作我们得到的数据就已经自动转义的

比如POST的text数据: this” is a test
那么$_POST[‘text’]: this\” is a test
在入库时候后mysql值会自动去掉转义的符号,而显示 this” is a test
入库的时候如果再做了一次mysql_real_escape_string 则会显示 this\” is a test

也就是说mysql_real_escape_string和addslashes只要选择一种使用
据说mysql_real_escape_string会更加安全一些,但是这个函数必须在mysql连接以后才使用。所以大部分源码都采用addslashes。

情况2:
如果这个时候我们需要保存的是文章关键词,或者文章标题。
假若填写的POST使用的title为: 为什么1 + 2 > 2 “一种证明方案”
这里出现了大于号和引号,那么我们就应该在入库的时候将大于号转化成> 双引号转化成"这样读取以后才不会出现html代码。这时候我们就需要使用htmlspecailchars()这个函数。

function escape($data, $quotestyle=ENT_COMPAT) {
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            unset($data[$key]);

            $data[escape($key)] = escape($value);
        }
    } else {
        $data = htmlspecialchars($data, $quotestyle, 'UTF-8');
    }

    return $data;
}

入库后则显示:为什么1 + 2 &gt  2 "一种证明方案"

在敏捷回顾会议中引导使用ORID

头一次接触ORID方法在2015年的一次敏捷回顾上,但是还不知道它,当天围坐在小会议室中通过该方法总结迭代开发经验,使我很有收获。ORID工作法很好理解,几乎一听就会,只是日常工作中我们总会选择更偷懒的方法,而忽略了总结过程中思考和逻辑的重要性。根据百度百科,ORID是一种...… Continue reading

生产环境Linux部署

Published on July 12, 2017

SVN 迁移到 GitLab

Published on June 17, 2017