最近做一个文章发布系统,突然发现我的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 "一种证明方案"

Nginx 自动禁止爬虫IP采集

### 背景最近我们有一个公开服务提供给客户查询关键词的热度值,由于这个API做在官方网站上,自然没有用户登陆,也没有很高查询成本,所以设计上没有任何鉴权无法进行身份认定,于是就被一个爬虫开了超高并发请求,直接后端的AWS Tomcat CPU被用尽,导致无法响应。爬虫显然...… Continue reading

Redis原子性事务Lua应用

Published on June 28, 2020