以前一直都是直接把id當作get參數在前端各種傳,比如a.com?uid=16
這樣的地址,如果用戶發現了這個規律,只要把16改成17、18、19等等,就可以查看各個用戶的數據了,所以想問問你們是怎麼解決的?
需求不是說不允許用戶查看其它用戶的資料,而是誰都可以看。那為什麼還有這種需求呢?這就好像是微信的微訊號一樣,只要有了微訊號就能搜到那個人,沒有微訊號,也很難透過撞庫、運氣等找到那個人。優酷、馬鈴薯、B站,所有影片網站都沒有直接把影片的id顯示到網址列上的,都是經過加密的。 (如果影片網站在資料庫是不用連續id的,那當我沒說過...事實上我也的確沒看過上述網站的資料庫)
要求是,加上解密速度快,破解很難。 (前者優先)
以前一直都是直接把id當作get參數在前端各種傳,比如a.com?uid=16
這樣的地址,如果用戶發現了這個規律,只要把16改成17、18、19等等,就可以查看各個用戶的數據了,所以想問問你們是怎麼解決的?
需求不是說不允許用戶查看其它用戶的資料,而是誰都可以看。那為什麼還有這種需求呢?這就好像是微信的微訊號一樣,只要有了微訊號就能搜到那個人,沒有微訊號,也很難透過撞庫、運氣等找到那個人。優酷、馬鈴薯、B站,所有影片網站都沒有直接把影片的id顯示到網址列上的,都是經過加密的。 (如果影片網站在資料庫是不用連續id的,那當我沒說過...事實上我也的確沒看過上述網站的資料庫)
要求是,加上解密速度快,破解很難。 (前者優先)
是這樣的,如果你的目的是防止用戶查看別的用戶的數據,那麼你的思路是有點偏差的。
你應該要做的是在後端做鑑權而不是去加密 uid。舉個例子,比如說現在已登入的使用者是uid=16
,那麼當他要求a.com?uid=17
(或其他非16 的頁面),後端應該能判斷他沒有權限並給出對應的回傳(如輸出空白頁面,或是直接拋403 之類)。
至於說怎麼去實現鑑權,簡單的就是把已登入使用者的uid 記錄在$_SESSION['uid']
裡,每次請求的時候判斷$_GET['uid'] == $_SESSION[ 'uid']
是否為真。
2016-10-26 21:51 補充: 題主更新了題目說需求是誰都可以看到用戶資料,只是想把用戶的 uid
隱藏起來。遇到這種情況,我的做法是在用戶表增加一個欄位openid
並將其加入索引,在用戶註冊時可以透過uid
、UNIX 時間戳
、若干長度的隨機字串
等組合後透過md5()
一類的函數來產生一個唯一的openid
,對外公開資料的情況下就透過openid
來檢索資料。
如果你堅持要用加密的方式,可以自己到網上搜一下,已經有很多現成的成熟的解決方案了,我用PHP加解密
為關鍵詞在Google 搜索,第一頁幾乎全都是你想要的東西,例如下面這段程式碼摘自搜尋結果中的第一條,你可以參考(我未做測試)。
<code class="PHP"><?php // 設定金鑰, 負責對資料進行加解密 $key = "ac181c517bdf24ce053556bb280a2dcb"; /** * 加密函數 */ function encrypt($str) { $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); return base64_encode(trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, self::$key, $str, MCRYPT_MODE_ECB, $iv))); } /** * 解密函數 */ function decrypt($str) { $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, self::$key, base64_decode($str), MCRYPT_MODE_ECB, $iv)); } ?></code>
出處:http://jerry17768java.blogspo...
hash some+random some
我覺得你應該加入的是權限判斷的功能,比如根據cookie識別用戶.
加/解密可以用OpenSSL AES:
<code><?php header('Content-Type: text/plain;charset=utf-8'); $data = 'phpbest'; $key = 'oScGU3fj8m/tDCyvsbEhwI91M1FcwvQqWuFpPoDHlFk='; //echo base64_encode(openssl_random_pseudo_bytes(32)); $iv = 'w2wJCnctEG09danPPI7SxQ=='; //echo base64_encode(openssl_random_pseudo_bytes(16)); echo '内容: '.$data."\n"; $encrypted = openssl_encrypt($data, 'aes-256-cbc', base64_decode($key), OPENSSL_RAW_DATA, base64_decode($iv)); echo '加密: '.base64_encode($encrypted)."\n"; $encrypted = base64_decode('To3QFfvGJNm84KbKG1PLzA=='); $decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', base64_decode($key), OPENSSL_RAW_DATA, base64_decode($iv)); echo '解密: '.$decrypted."\n";</code>