网络安全愈来愈发达的今天, 系统安全是每一位开发者都须要考虑的问题, 好比用户注册, 若是提交的数据不作安全验证, 那么有些人或许会提交一堆的垃圾数据,长此以往你的数据库中的僵死数据会很是的多,影响正常数据的查询效率,同时你的系统也许就在某一天over了。因此安全一直都是咱们工做考虑的重点。那么通常都会对提交的数据作安全的验证 好比通用的sign加密验证, sign 到底是怎么个验证方法呢? php
1. 首先是数据库api, 表结构的设计取决于本身的状况, 最基本的设计: 算法
字段 数据库 |
type api |
Is null 数组 |
Auto_increment 安全 |
comment 服务器 |
id 网络 |
Int(11) post |
not ui |
|
自增id |
Api_name |
Varchar(25) |
Not null |
|
应用的名称 |
key |
Varchar(32) |
Not null |
|
应用的key |
secret |
Varchar(32) |
Not null |
|
应用的密钥 |
2. 上面尚未提到sign到底是怎么的回事儿呢?
第二步就是生成本身的sign, 每次提交的数据都要加上sign提交给后台。
Sign的算法通常都是采用对提交的数据进行排序后+secret后MD5
$key = "c4ca4238a0b923820dcc509a6f75849b"; $secret = "28c8edde3d61a0411511d3b1866f0636";
如:
$data = array( 'username' => 'anziguoer@sina.com', 'sex' => '男', 'age' => '12', 'addr' => '北京市海淀区' );
// 传递的参数中必须有 key, sign, timestamp
$postData = array( "key" => $key, "timestamp" => time() );
// 通常状况提交到后台的数据在除了要提交的信息还要加上一些验证的数据 ($postData就是这样的数据) // 将用户提交的数据和必须的参数一块儿排序(正序或者是倒序均可以, 子要保证验证的算法和加密的算法一致便可) // 获取sign function getSign($secret, $data) { // 对数组的值按key排序 ksort($data); // 生成url的形式 $params = http_build_query($data); // 生成sign $sign = md5($params.$secret); return $sign; }
//将用户的数据和默认的数据合并 $psotData = array_merge($postData, $data); // 发送的数据中吧sign带上 $psotData[‘sign’] = getSign($secret, $data); // 数据组合好后能够吧数据发送到后台
3. 第三步就是在服务器端吧获得的数据进行验证处理.
对必须的参数进行验证:
1) . 经过key在api的数据库中查找是否存在secret的值,没有则验证失败
2) . 对传递过来的数据中验证sign参数是否存在, 不存在, 验证失败。
3) . 对时间'timestamp'参数进行验证,大于10分钟的数据验证失败。
4) 、对出去sign的全部参数进行验证, 生成的sign和传递过来的sign参数是否一致, 不一致验证失败。
5) . 若是上面的有验证经过后就能够执行下面的逻辑代码.
/** * 验证sign是否合法 * @param [type] $secret [description] * @param [type] $data [description] * @return [type] [description] */ function verifySign($secret, $data) { // 验证参数中是否有签名 if (!isset($data['sign']) || !$data['sign']) { echo '发送的数据签名不存在'; die(); } if (!isset($data['timestamp']) || !$data['timestamp']) { echo '发送的数据参数不合法'; die(); } // 验证请求, 10分钟失效 if (time() - $data['timestamp'] > 600) { echo '验证失效, 请从新发送请求'; die(); } $sign = $data['sign']; unset($data['sign']); ksort($data); $params = http_build_query($data); // $secret是经过key在api的数据库中查询获得 $sign2 = md5($params.$secret); if ($sign == $sign2) { die('验证经过'); }else{ die('请求不合法'); } }
最后送上腾讯的sign加密原理:http://www.qcloud.com/wiki/签名参数sign生成说明