PHP Serialize Function - Добавление сериализованных данных в mysql, а затем выборка и отображение - PullRequest
0 голосов
/ 21 марта 2012

Я хочу знать, безопасна ли функция сериализации 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, так как я смогу определить привилегии. И даже я добавляю модуль для создания пользовательских групп, имеющих пользовательские привилегии. Как мне этого добиться, помня об эффективности? Пожалуйста, помогите: |

Я не собираюсь использовать сериализованные данные для поиска

Моя база данных: -

Database Structure

Database Content

Примечание: - Привилегии пользователей будут предоставляться через: privileges_level

Примечание: - В привилегиях_пропуске я хочу добавить все привилегии в сериализованную форму.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 21 марта 2012
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) Если вы постоянно вносите небольшие обновления в один фрагмент данных вочень большой блоб, усилия MySQL значительно увеличены.

2) потеря функциональности: я думаю, вам это не нужно для пользовательских настроек.

1 голос
/ 21 марта 2012

Я хочу знать, безопасна ли функция сериализации PHP на 100%

Эта функция не имеет никакого отношения к безопасности вообще.Это просто способ представить сложную структуру данных в виде строки.это все.
Безопасность базы данных - это другой вопрос, совершенно безразличный к источнику формы данных.

, если мы храним сериализованные данные в базе данных и хотим что-то сделать после их извлечения,будет ли это хорошим способом.

Определенно НЕ
Таким образом, вы портите всю аккуратную идею реляционных баз данных , которыми вы являетесьпредположительно с использованием.
Данные должны присутствовать в базе данных в виде Normal , что означает атомарный - каждый объект занимает отдельную ячейку.Не целый набор неструктурированных недоступных данных без возможности установить связь с другими данными.

что происходит в этом коде

ничего толкового.

Ответить на вопрос из заголовка

  • Не храните сериализованные данные в mysql
  • Создайте таблицу / структуру таблиц, которая представляет структуру данных вашего приложения, сохраняя все биты данных разделенными и доступными.

Я не собираюсь использовать сериализованные данные для поиска

Это всего лишь заблуждение из-за отсутствия опыта.

Добро пожаловать через пару месяцев, с вопросом«Помоги мне переделать мои настройки! Это выходит из-под контроля!»

1 голос
/ 21 марта 2012

Все, что может быть преобразовано в первоначальную форму, никогда не было сделано в целях безопасности.

Сериализация - это один из удобных методов для переноса специфичного для php представления объекта или массива в текст, чтобы вы могли сохранить его в собственном файле или передать его по TCP

base64_encoding также имеет аналогичное назначение, полезно, если вам нужно перенести двоичный файл с платформы на другую платформу (например, если вы создаете приложение, которое позволяет пользователям загружать изображения на ваш сервер)

gz * compress - это просто функция сжатия строк.

Суть в том, что если вы хотите «защитить» свои данные, используйте односторонний хеш, такой как sha или md5.

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

Для хранения привилегий лучше просто создать отдельную таблицу для хранения имени и идентификатора привилегий и, если вы хотите включить несколько привилегий для каждого пользователя, создать таблицу мостов для сопоставления между вашими пользователями и их привилегиями. Если у одного пользователя есть одна привилегия, просто добавьте идентификатор привилегии для каждого пользователя в таблице пользователей.

- РЕДАКТИРОВАТЬ

Если у вас есть много настраиваемых правил для каждой привилегии, просто продолжайте и сделайте это в любом случае, 100 - это очень управляемое число даже при самой базовой установке установки mysql, нет проблем.

Одной из идей является создание другой таблицы, которая сопоставляет набор привилегий группе, и если у вас может быть пользователь, имеющий доступ к одной или нескольким группам, то ваша таблица сопоставления будет переходить от пользователя к группе.

0 голосов
/ 21 марта 2012

Предлагаю попробовать MongoDB

Это документно-ориентированная база данных. Вы можете хранить и извлекать объект или массив напрямую. Нет необходимости сериализации.

...