成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用Hashids來保護你的數(shù)據(jù)庫主鍵

jk_v1 / 2999人閱讀

摘要:使用注意該庫并不是一個加密庫,所以不建議用來加密敏感數(shù)據(jù),我們的數(shù)據(jù)庫主鍵并不是業(yè)務(wù)上的敏感數(shù)據(jù),所以這個沒關(guān)系。

為什么要保護數(shù)據(jù)庫主鍵?

數(shù)據(jù)庫主鍵一般是有序自增主鍵,極易被爬蟲抓取數(shù)據(jù),作為應(yīng)用開發(fā)者,這是不應(yīng)該的,你辛辛苦苦收集的數(shù)據(jù)轉(zhuǎn)眼之間被其他人給抓取了,是不是很大的損失?

Hashids的介紹
generate short unique ids from integers

理解為數(shù)字編碼庫即可,幾乎支持市面上所有語言。

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 for
PHP使用
$hashids = new HashidsHashids("this is my salt");
$id = $hashids->encode(1, 2, 3);
$numbers = $hashids->decode($id);
注意

該庫并不是一個加密庫,所以不建議用來加密敏感數(shù)據(jù),我們的數(shù)據(jù)庫主鍵ID并不是業(yè)務(wù)上的敏感數(shù)據(jù),所以這個沒關(guān)系。

Yii2的使用

由于該編解碼是獨立與業(yè)務(wù)之外的,所以需要處理的地方在下面:

接收請求數(shù)據(jù)的自動解碼

響應(yīng)數(shù)據(jù)的自動編碼(本文只針對JSON響應(yīng)處理,有需要的可以添加ResponseFormatter自行處理)

這兩個步驟不應(yīng)該提現(xiàn)在控制器中,控制器拿到的數(shù)據(jù)是解碼好的,響應(yīng)的數(shù)據(jù)是原始數(shù)據(jù),然后我們在響應(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);
                }
            }
        }
    }
}
處理請求數(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
                ]
            ]
        ],
測試

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.請求測試,這個加密過的hash讀者可能解不開,因為我們用的salt不一樣,替換為你自己的即可

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)測試

GET /site/b

5.響應(yīng)內(nèi)容如下

{
    "app_id": "XaYeAV2q80pkB4KL",
    "app": {
        "app_id": "LOnMp3QR5lryDgRK"
    }
}
寫在最后

不知道這個算不算AOP編程?個人覺得算,在業(yè)務(wù)邏輯之外處理,業(yè)務(wù)層對外部輸入和自身輸出是透明的(理解為業(yè)務(wù)層自己不知道加解密)。

本文核心在于兩個遞歸方法,其他語言類似,像nodejs可以使用中間件來處理。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29086.html

相關(guān)文章

  • hashids插件庫解決序列id易泄露易推導(dǎo)的問題

    摘要:自增序列類型數(shù)字主鍵,完全的自動增長,容易被判斷推導(dǎo)出其他的主鍵值。本方案就是使用解決易推導(dǎo)的問題,并且在數(shù)據(jù)量不大的情況下也不大。這些是彼此獨立生成的,碰撞風(fēng)險非常小,可以忽略不計。是可以根據(jù)鹽值反向解碼的。增量輸入被破壞以保持不可思議。 ID管理方式的介紹 32位UUID轉(zhuǎn)Base64編碼,快速的id生成方案,問題在于編碼可讀性差,長度太長,查詢效率低。 自增序列類型數(shù)字主鍵,完...

    lentrue 評論0 收藏0
  • 優(yōu)雅的 ID 混淆擴展包 Laravel Hashid

    摘要:整合了等高性能編碼算法,并提供了統(tǒng)一的優(yōu)雅的簡單易用的調(diào)用接口,將敏感數(shù)據(jù)混淆編碼成可還原的非連續(xù)的安全的標(biāo)識符。重構(gòu)現(xiàn)有的發(fā)碼生成機制使用數(shù)據(jù)庫自帶的索引主鍵,但是對外進行混淆。對加密串進一步混淆,并生成安全的字符串。 Laravel Hashid 整合了 [Base62], [Base64], [Hashids], [Optimus] 等高性能編碼算法,并提供了統(tǒng)一的、優(yōu)雅的、簡單...

    Cheriselalala 評論0 收藏0
  • 自如2018新年活動系統(tǒng) — 搶紅包

    摘要:活動規(guī)模既然公司對自如客這么闊,那對我們員工也得夠意思,所以年底我們共準(zhǔn)備了個活動。拆分后,紅包占有只需操作,響應(yīng)性能已不是問題。 首發(fā)于 樊浩柏科學(xué)院 2017 年是自如快速增長的一年,自如客突破 100 萬,管理資產(chǎn)達(dá)到 50 萬間,在年底成功獲得了 40 億 A 輪融資,而這些都要感謝廣大的自如客,公司為了回饋自如客,在六周年活動時就發(fā)放了 6000 萬租住基金,當(dāng)然年底散幣活...

    fanux 評論0 收藏0
  • 自如2018新年活動系統(tǒng) — 搶紅包

    摘要:活動規(guī)模既然公司對自如客這么闊,那對我們員工也得夠意思,所以年底我們共準(zhǔn)備了個活動。拆分后,紅包占有只需操作,響應(yīng)性能已不是問題。 首發(fā)于 樊浩柏科學(xué)院 2017 年是自如快速增長的一年,自如客突破 100 萬,管理資產(chǎn)達(dá)到 50 萬間,在年底成功獲得了 40 億 A 輪融資,而這些都要感謝廣大的自如客,公司為了回饋自如客,在六周年活動時就發(fā)放了 6000 萬租住基金,當(dāng)然年底散幣活...

    learning 評論0 收藏0
  • 一個 PHP 擴展: 根據(jù)數(shù)字生成唯一的字符串 ID

    摘要:是一個可以生成唯一的非順序的字符串號碼,它還可以對這些進行解密,你可以利用它來加密你不想暴露給用戶的數(shù)字。安裝你可以設(shè)置一些選項在里,或者你也可以在構(gòu)造方法里面設(shè)置,但是我推薦你在中設(shè)置,這樣你可以擁有更好的性能。 Hashids 是一個可以生成唯一的非順序的字符串 ID 號碼,它還可以對這些 ID 進行解密,你可以利用它來加密你不想暴露給用戶的數(shù)字 ID。 安裝 $ git clon...

    G9YH 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<