簡體   English   中英

PHP序列化功能-向MySQL添加序列化數據,然后獲取並顯示

[英]PHP Serialize Function - Adding serialized data to mysql and then fetch and display

我想知道PHP序列化功能是否100%安全,如果我們將序列化的數據存儲到數據庫中並希望在獲取數據后執行某些操作,這將是一種不錯的方法。

例如:-我有一個具有不同用戶權限的網站,現在我想將特定特權的權限設置存儲到我的數據庫中(我要存儲的數據是通過php序列化功能完成的),現在當用戶登錄時在我想獲取此數據並為客戶設置特權。

現在我可以做這件事了,我想知道的是,這是最好的方法還是可以做的更有效的事情。

另外,我正在瀏覽php手冊並找到了此代碼,有人可以向我解釋一下此代碼中發生的事情:-[特別是為什么使用base64_encode?]

<?php 
mySerialize( $obj ) { 
return base64_encode(gzcompress(serialize($obj))); 
} 

myUnserialize( $txt ) { 
return unserialize(gzuncompress(base64_decode($txt))); 
} 
?>

同樣,如果有人可以提供我自己的代碼來演示如何以最有效的方式執行此操作。

我有一個問題,我有很多字段要作為特權使用,現在可以說我有45個管理員模塊和30個用戶權限/特權模塊。 將來(由於我一直在致力於這個項目),我將添加越來越多的模塊,可以說增加了約100個,因此我將如何定義特權。 甚至我正在添加一個模塊來創建具有自定義權限的自定義組。 牢記效率,我將如何實現? 請幫助:|

我不會使用序列化數據進行搜索

我的數據庫:

數據庫結構

數據庫內容

注意:-用戶權限將通過以下權限授予:privileges_level

注意:-在privileges_permissions中,我要以序列化形式添加所有特權。

謝謝。

Serialization can be attempted or can be a good approach to store user settings 
or preferences – you only really need to store the settings that differ from the
default values.

Serialization is good approach for just storing and getting back data
not for 
searching on the serialized column or update individual value in the column. 

If you want to just store and update user settings as on change and just
deserialize      nothing from php and nothing to do with the values in the column
much specifically. Go for Serialization.

It can in no ways help you maintain 
relationship   with serialized data. The moment you require to make the data
serialized   meaningful or relational. You need to 
normalize.

如果應用程序確實沒有模式,並且具有很多可選參數,而這些可選參數並未出現在每條記錄中,那么將數據序列化為一列可能比擁有許多多余的NULL列更好。

這將回答您的問題

您需要保重:

1)如果您經常在很大的blob中不斷對數據進行小更新,則MySQL必須付出的努力會大大增加。

2)功能喪失:我認為您不需要用戶設置。

任何可轉換回其原始形式的東西都不是出於安全目的。

序列化是將對象或數組的php特定表示形式轉換為文本的便捷方法之一,以便您可以將其保存在本機文件中或通過TCP進行傳輸

base64_encoding也具有類似的用途,如果您需要將二進制文件從一個平台轉移到另一個平台(例如,如果您正在構建一個允許用戶將圖像上傳到服務器的應用程序),則很有用。

gz * compress是一個字符串壓縮函數。

最重要的是,如果您要“保護”數據,請使用一種單向哈希,例如sha或md5。

http://php.net/manual/en/function.hash.php

對於存儲特權,最好只創建一個單獨的表來存儲特權名稱和ID,如果要為每個用戶啟用多個特權,則創建一個橋接表以在用戶及其特權之間進行映射。 如果一個用戶擁有一個特權,那么只需在users表中的每個用戶中添加一個privilege_id。

-編輯

如果您對每種特權有很多定制的規則,那么就繼續進行吧,即使是最基本的mysql安裝設置,100也是一個非常易於管理的數字,沒有問題。

一個想法是創建另一個將一組特權映射到一個組的表,如果您可以讓一個用戶訪問一個或多個組,則映射表將在用戶到組之間。

我想知道PHP序列化功能是否100%安全

此功能與安全性完全無關。 這只是將復雜的數據結構表示為字符串的一種方式。 就這樣。
數據庫安全是另一回事,完全與數據形式的來源無關。

如果我們將序列化的數據存儲到數據庫中並希望在獲取數據后執行某些操作,這將是一個不錯的方法。

當然不
這樣,您就破壞了您正在使用的關系數據庫的整體構思。
數據應該以Normal形式存在於數據庫中,即原子形式 -每個實體占據不同的單元。 並非一大堆非結構化,不可訪問的數據,不可能與其他數據建立任何關系

這段代碼中發生了什么

沒有什么明智的。

回答標題中的問題

  • 不要在MySQL中存儲序列化數據
  • 創建一個表/表結構來表示應用程序的數據結構,並使所有數據位分離並可以訪問。

我不會使用序列化數據進行搜索

由於缺乏經驗,這只是一種幻想。

幾個月后歡迎您回來,並提出一個問題:“幫助我重做我的設置!它已經失控了!”

我建議你應該嘗試MongoDB

這是一個面向文檔的數據庫。 您可以直接存儲和檢索對象或數組。 無需序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM