網絡安全愈來愈發達的今天, 系統安全是每一位開發者都須要考慮的問題, 好比用戶註冊, 若是提交的數據不作安全驗證, 那麼有些人或許會提交一堆的垃圾數據,長此以往你的數據庫中的僵死數據會很是的多,影響正常數據的查詢效率,同時你的系統也許就在某一天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生成說明