0

我想知道 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 我想以序列化形式添加所有权限。

谢谢。

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.

如果应用程序确实是无模式的并且有很多可选参数并没有出现在每条记录中,那么将数据序列化到一列中可能比有许多额外的 NULL 列更好。

这将回答你的问题

您需要注意:

1) 如果你不断地对一个非常大的 blob 中的一条数据进行小更新,那么 MySQL 必须付出的努力就会大大增加。

2)功能损失:我认为您不需要它来进行用户设置。

于 2012-03-21T05:32:34.903 回答
1

任何可转换回其原始形式的东西都不是出于安全目的而制作的。

序列化是将对象或数组的 php 特定表示转换为文本的便捷方法之一,以便您可以将其保存在本机文件中或通过 TCP 传输

base64_encoding 也有类似的用途,如果您需要将二进制文件从一个平台传输到另一个平台(例如,如果您正在构建一个允许用户将图像上传到您的服务器的应用程序)

gz*compress 只是一个字符串压缩函数。

底线是,如果您想“保护”您的数据,请使用单向哈希,例如 sha 或 md5。

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

对于存储权限,最好只创建一个单独的表来存储权限名称和 ID,如果您想为每个用户启用多个权限,请创建一个桥接表来映射您的用户及其权限。如果一个用户有一个权限,那么只需在您的用户表中的每个用户中添加一个 privilege_id。

- 编辑

如果你对每个权限有很多自定义规则,不管怎样就去做吧,即使是最基本的 mysql 安装设置,100 也是一个非常易于管理的数字,没问题。

一个想法是创建另一个将一组权限映射到组的表,如果您可以让用户访问一个或多个组,那么您的映射表将是从用户到组的。

于 2012-03-21T05:25:20.787 回答
1

我想知道 PHP 序列化函数是否 100% 安全

此功能与安全性完全无关。这只是将复杂数据结构表示为字符串的一种方式。就这样。
数据库安全是另一回事,与数据形式的来源完全无关。

如果我们将序列化的数据存储到数据库中并想在获取它之后做一些事情,这会是一个不错的方法吗?

绝对不是
这样,您破坏了您应该使用的关系数据库的整个简洁概念。
数据应该以正常形式存在于数据库中,这意味着原子 - 每个实体占据不同的单元格。不是一大堆无法与其他数据建立任何关系的非结构化不可访问数据。

这段代码发生了什么

没有什么明智的。

从标题回答问题

  • 不要在mysql中存储序列化数据
  • 创建代表应用程序数据结构的表/表结构,保持所有数据位分离和可访问。

我不会使用序列化数据进行搜索

由于缺乏经验,这只是一种错觉。

欢迎几个月后回来,带着一个问题“帮我重做我的设置!它已经失控了!”

于 2012-03-21T05:37:54.317 回答
0

我建议你应该试试 MongoDB

它是一个面向文档的数据库。您可以直接存储和检索对象或数组。无需序列化。

于 2012-03-21T05:41:29.713 回答