摘要:使用注意該庫(kù)并不是一個(gè)加密庫(kù),所以不建議用來加密敏感數(shù)據(jù),我們的數(shù)據(jù)庫(kù)主鍵并不是業(yè)務(wù)上的敏感數(shù)據(jù),所以這個(gè)沒關(guān)系。
為什么要保護(hù)數(shù)據(jù)庫(kù)主鍵?
數(shù)據(jù)庫(kù)主鍵一般是有序自增主鍵,極易被爬蟲抓取數(shù)據(jù),作為應(yīng)用開發(fā)者,這是不應(yīng)該的,你辛辛苦苦收集的數(shù)據(jù)轉(zhuǎn)眼之間被其他人給抓取了,是不是很大的損失?
Hashids的介紹generate short unique ids from integers
理解為數(shù)字編碼庫(kù)即可,幾乎支持市面上所有語言。
available in JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Perl 6, Swift, Clojure, Objective-C, C, C++11, D, F#, Go, Erlang, Lua, Haskell, OCaml, Elixir, Rust, Smalltalk, ColdFusion, Groovy, Kotlin, Nim, VBA, Haxe, Crystal, Elm, ActionScript, CoffeeScript, Bash, R, TSQL, PostgreSQL and forPHP使用
$hashids = new HashidsHashids("this is my salt"); $id = $hashids->encode(1, 2, 3); $numbers = $hashids->decode($id);注意
該庫(kù)并不是一個(gè)加密庫(kù),所以不建議用來加密敏感數(shù)據(jù),我們的數(shù)據(jù)庫(kù)主鍵ID并不是業(yè)務(wù)上的敏感數(shù)據(jù),所以這個(gè)沒關(guān)系。
Yii2的使用由于該編解碼是獨(dú)立與業(yè)務(wù)之外的,所以需要處理的地方在下面:
接收請(qǐng)求數(shù)據(jù)的自動(dòng)解碼
響應(yīng)數(shù)據(jù)的自動(dòng)編碼(本文只針對(duì)JSON響應(yīng)處理,有需要的可以添加ResponseFormatter自行處理)
這兩個(gè)步驟不應(yīng)該提現(xiàn)在控制器中,控制器拿到的數(shù)據(jù)是解碼好的,響應(yīng)的數(shù)據(jù)是原始數(shù)據(jù),然后我們?cè)陧憫?yīng)中處理。
代碼 助手類(HashidsHelper)class HashidsHelper { public static function encode($id) { $hashids = new HashidsHashids("salt",16); return $hashids->encode($id); } public static function decode($hash) { $hashids = new HashidsHashids("salt",16); $data= $hashids->decode($hash); return empty($data)?null:$data; } public static function decodeArray(array $hashes) { return array_map([HashidsHelper::class, "decode"], $hashes); } /** * 遞歸編碼 * @param array $data */ public static function encodeRecursive(array &$data) { foreach ($data as $key => &$value) { if (is_array($value)) { self::encodeRecursive($value); continue; } if (strpos($key, "id") !== false && is_numeric($value)) { $data[$key] = static::encode($value); } } } /** * 遞歸解碼 * @param array $data */ public static function decodeRecursive(array &$data) { foreach ($data as $key => &$value) { if (is_array($value)) { self::decodeRecursive($value); continue; } if (strpos($key, "id") !== false) { if (is_string($value)) { $id = static::decode($value); $data[$key] = $id ?? $value; } elseif (is_array($value)) { $data[$key] = static::decodeArray($value); } } } } }處理請(qǐng)求數(shù)據(jù)($_POST,$_PUT,$_GET)提交過來的數(shù)據(jù)
1.新建JsonParser繼承Yii自帶的JsonParser,代碼如下
class JsonParser extends yiiwebJsonParser { /** * @inheritDoc */ public function parse($rawBody, $contentType) { $data = parent::parse($rawBody, $contentType); if ($data !== null) { HashidsHelper::decodeRecursive($data); } return $data; } }
2.新建Request集成Yii自帶的Request,重寫getQueryParams,代碼如下:
public function getQueryParams() { $data = parent::getQueryParams(); if ($data !== null) { HashidsHelper::decodeRecursive($data); } return $data; }
3.配置web.php的components,更改為我們自定義的處理器
"request" => [ "class" => appcomponentsRequest::class, // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation "cookieValidationKey" => "123456", "enableCsrfValidation" => false, "parsers" => [ "application/json" => appcomponentswebJsonParser::class ] ],處理響應(yīng)數(shù)據(jù)
1.新建JsonResponseFormatter繼承Yii的JsonResponseFormatter,代碼如下:
class JsonResponseFormatter extends yiiwebJsonResponseFormatter { /** * @inheritDoc */ public function format($response) { if ($response->data !== null) { HashidsHelper::encodeRecursive($response->data); } parent::format($response); } }
2.配置web.php的components,替換response組件
"response" => [ "class" => appcomponentswebResponse::class, "format" => Response::FORMAT_JSON, "formatters" => [ "json" => [ "class" => appcomponentswebJsonResponseFormatter::class, "prettyPrint" => YII_DEBUG ] ] ],測(cè)試
1.SiteController添加方法
public function actionA($corporation_id) { $data = Yii::$app->request->post(); var_dump($data, $corporation_id); } public function actionB() { return [ "app_id" => 1, "app" => [ "app_id" => 2 ] ]; }
2.請(qǐng)求測(cè)試,這個(gè)加密過的hash讀者可能解不開,因?yàn)槲覀冇玫膕alt不一樣,替換為你自己的即可
POST /site/a?corporation_id=XaYeAV2q80pkB4KL { "corporation_id": "XaYeAV2q80pkB4KL", "applet":{ "id":"XaYeAV2q80pkB4KL", "appid":"xxxxxx" } }
3.響應(yīng)的內(nèi)容如下:
array(2) { ["corporation_id"]=> int(1) ["applet"]=> array(2) { ["id"]=> int(1) ["appid"]=> string(6) "xxxxxx" } } int(1)
4.響應(yīng)測(cè)試
GET /site/b
5.響應(yīng)內(nèi)容如下
{ "app_id": "XaYeAV2q80pkB4KL", "app": { "app_id": "LOnMp3QR5lryDgRK" } }寫在最后
不知道這個(gè)算不算AOP編程?個(gè)人覺得算,在業(yè)務(wù)邏輯之外處理,業(yè)務(wù)層對(duì)外部輸入和自身輸出是透明的(理解為業(yè)務(wù)層自己不知道加解密)。
本文核心在于兩個(gè)遞歸方法,其他語言類似,像nodejs可以使用中間件來處理。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/29086.html
摘要:自增序列類型數(shù)字主鍵,完全的自動(dòng)增長(zhǎng),容易被判斷推導(dǎo)出其他的主鍵值。本方案就是使用解決易推導(dǎo)的問題,并且在數(shù)據(jù)量不大的情況下也不大。這些是彼此獨(dú)立生成的,碰撞風(fēng)險(xiǎn)非常小,可以忽略不計(jì)。是可以根據(jù)鹽值反向解碼的。增量輸入被破壞以保持不可思議。 ID管理方式的介紹 32位UUID轉(zhuǎn)Base64編碼,快速的id生成方案,問題在于編碼可讀性差,長(zhǎng)度太長(zhǎng),查詢效率低。 自增序列類型數(shù)字主鍵,完...
摘要:整合了等高性能編碼算法,并提供了統(tǒng)一的優(yōu)雅的簡(jiǎn)單易用的調(diào)用接口,將敏感數(shù)據(jù)混淆編碼成可還原的非連續(xù)的安全的標(biāo)識(shí)符。重構(gòu)現(xiàn)有的發(fā)碼生成機(jī)制使用數(shù)據(jù)庫(kù)自帶的索引主鍵,但是對(duì)外進(jìn)行混淆。對(duì)加密串進(jìn)一步混淆,并生成安全的字符串。 Laravel Hashid 整合了 [Base62], [Base64], [Hashids], [Optimus] 等高性能編碼算法,并提供了統(tǒng)一的、優(yōu)雅的、簡(jiǎn)單...
摘要:活動(dòng)規(guī)模既然公司對(duì)自如客這么闊,那對(duì)我們員工也得夠意思,所以年底我們共準(zhǔn)備了個(gè)活動(dòng)。拆分后,紅包占有只需操作,響應(yīng)性能已不是問題。 首發(fā)于 樊浩柏科學(xué)院 2017 年是自如快速增長(zhǎng)的一年,自如客突破 100 萬,管理資產(chǎn)達(dá)到 50 萬間,在年底成功獲得了 40 億 A 輪融資,而這些都要感謝廣大的自如客,公司為了回饋?zhàn)匀缈?,在六周年活?dòng)時(shí)就發(fā)放了 6000 萬租住基金,當(dāng)然年底散幣活...
摘要:活動(dòng)規(guī)模既然公司對(duì)自如客這么闊,那對(duì)我們員工也得夠意思,所以年底我們共準(zhǔn)備了個(gè)活動(dòng)。拆分后,紅包占有只需操作,響應(yīng)性能已不是問題。 首發(fā)于 樊浩柏科學(xué)院 2017 年是自如快速增長(zhǎng)的一年,自如客突破 100 萬,管理資產(chǎn)達(dá)到 50 萬間,在年底成功獲得了 40 億 A 輪融資,而這些都要感謝廣大的自如客,公司為了回饋?zhàn)匀缈停诹苣昊顒?dòng)時(shí)就發(fā)放了 6000 萬租住基金,當(dāng)然年底散幣活...
摘要:是一個(gè)可以生成唯一的非順序的字符串號(hào)碼,它還可以對(duì)這些進(jìn)行解密,你可以利用它來加密你不想暴露給用戶的數(shù)字。安裝你可以設(shè)置一些選項(xiàng)在里,或者你也可以在構(gòu)造方法里面設(shè)置,但是我推薦你在中設(shè)置,這樣你可以擁有更好的性能。 Hashids 是一個(gè)可以生成唯一的非順序的字符串 ID 號(hào)碼,它還可以對(duì)這些 ID 進(jìn)行解密,你可以利用它來加密你不想暴露給用戶的數(shù)字 ID。 安裝 $ git clon...
閱讀 1971·2021-11-09 09:46
閱讀 2553·2019-08-30 15:52
閱讀 2522·2019-08-30 15:47
閱讀 1393·2019-08-29 17:11
閱讀 1793·2019-08-29 15:24
閱讀 3562·2019-08-29 14:02
閱讀 2511·2019-08-29 13:27
閱讀 1267·2019-08-29 12:32