0

PHP のシリアライズ機能が 100% 安全かどうかを知りたいです。シリアライズされたデータをデータベースに保存し、それを取得した後に何かをしたい場合、それは良い方法でしょうか。

例:- 私はさまざまなユーザー権限を持つ Web サイトを持っています。今、特定の権限のアクセス許可設定をデータベースに保存したいと考えています (保存したいこのデータは、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 では、シリアル化された形式ですべての特権を追加したいと考えています。

ありがとう。

4

4 に答える 4

2
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.

アプリケーションが実際にスキーマレスであり、すべてのレコードに表示されないオプションのパラメーターが多数ある場合は、データを1つの列にシリアル化する方が、NULLの列を追加するよりも優れています。

これはあなたの質問に答えます

あなたは注意する必要があります:

1)非常に大きなBLOB内の1つのデータに常に小さな更新を行う場合、MySQLが実行する必要のある作業は大幅に増加します。

2)機能の喪失:ユーザー設定には必要ないと思います。

于 2012-03-21T05:32:34.903 に答える
1

PHPのシリアル化機能が100%安全かどうか知りたい

この機能はセキュリティとはまったく関係ありません。これは、複雑なデータ構造を文字列として表すための単なる方法です。それで全部です。
データベースのセキュリティは別の問題であり、データの形式のソースにはまったく関係ありません。

シリアル化されたデータをデータベースに保存し、それをフェッチした後に何かをしたい場合、それは良い方法でしょうか。

絶対にありませんこの方法では、おそらく使用しているリレーショナルデータベース
のすっきりとしたアイデア全体を台無しにしてしまいます。 データはデータベースに正規形で存在する必要があります。これはアトミックを意味します。各エンティティは個別のセルを占有します。他のデータとの関係を確立する可能性のない、構造化されていないアクセスできないデータの全体ではありません。

このコードで何が起こっているのか

何も賢明ではありません。

タイトルからの質問に答えるには

  • シリアル化されたデータをmysqlに保存しないでください
  • アプリケーションのデータ構造を表すテーブル/テーブルの構造を作成し、すべてのデータビットを分離してアクセスできるようにします。

シリアル化されたデータを検索に使用するつもりはありません

これは経験不足からの妄想に過ぎません。

「セットアップをやり直すのを手伝ってください!制御不能になります!」という質問で、数か月後にようこそ。

于 2012-03-21T05:37:54.317 に答える
1

元の形式に変換できるものは、セキュリティ目的で作成されたものではありません。

Serialize は、オブジェクトまたは配列の PHP 固有の表現をテキストに転送して、ネイティブ ファイルに保存したり、TCP 経由で転送したりできる便利な方法の 1 つです。

base64_encoding にも同様の目的があり、プラットフォームから別のプラットフォームにバイナリを転送する必要がある場合に役立ちます (たとえば、ユーザーが画像をサーバーにアップロードできるアプリを構築している場合)。

gz*compress は単なる文字列圧縮関数です。

要するに、データを「保護」したい場合は、sha や md5 などの一方向ハッシュを使用してください。

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

特権を保存するには、特権の名前と ID を保存する別のテーブルを作成することをお勧めします。各ユーザーに複数の特権を有効にする場合は、ブリッジ テーブルを作成して、ユーザーとその特権をマッピングします。1 人のユーザーが 1 つの特権を持っている場合は、users テーブルの各ユーザーにprivileged_id を追加するだけです。

- 編集

特権ごとにカスタマイズされたルールがたくさんある場合は、とにかく先に進んでください。100 は、mysql インストールの最も基本的なセットアップでも問題なく、非常に扱いやすい数です。

1 つのアイデアは、一連の権限をグループにマップする別のテーブルを作成することです。ユーザーが 1 つ以上のグループにアクセスできる場合、マッピング テーブルはユーザーからグループになります。

于 2012-03-21T05:25:20.787 に答える
0

MongoDBを試してみることをお勧めします

これはドキュメント指向のデータベースです。オブジェクトまたは配列を直接格納および取得できます。シリアル化する必要はありません。

于 2012-03-21T05:41:29.713 に答える