- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我可能听起来有点奇怪,但是,有办法吗?例如,我有一个 PHP 对象 $foo
。
有没有办法通过一些对象加密函数以 HTML 形式(隐藏输入)存储这个对象,然后用解密函数检索。
同样,我可以通过GET方法传递这些对象吗?
最佳答案
正如其他地方已经指出的那样,您可以使用序列化将对象转换为字符串。
$foo = (object) array(
'foo' => 'foo & bär',
'bar' => new StdClass
);
$serialized = serialize($foo);
这给出:
O:8:"stdClass":2:{s:3:"foo";s:10:"foo & bär";s:3:"bar";O:8:"stdClass":0:{}}
如您所见,该字符串中有引号,因此您不能将其插入链接而不冒破坏标记的风险:
<a href="http://example.com?s=O:8:" <-- quote closes href
所以至少你必须 htmlspecialchars或 urlencode那个输出。但是,这仍然会使内容易于阅读。你可以使用 PHP's MCrypt library对字符串进行一些强加密。但是,如果数据确实那么敏感,您可能应该找到另一种传输方式,远离您网站的面向公众的部分。
如果数据不太敏感,那么您可以通过混淆字符串来保护一些 CPU 周期。最简单的方法是通过 gzdeflate
运行它:
echo gzdeflate(serialize($foo));
给出类似的东西
R*.Iq�I,.V�2��.�2�RJ��W�.�24 …
使用 gzdeflate
也将缩短大型序列化字符串。缺点是,它产生的输出不适合通过 HTTP 传输,因此您还必须 base64_encode
那:
echo base64_encode(gzdeflate(serialize($foo)));
然后会给出
87eysFIqLklxzkksLlayMrKqLrYytlJKy89Xsi62MjQAMxXUFJIOLykCiQDlkhKBLH9UfQZW1bW1AA==
这对于传输是安全的,并且与原始序列化字符串相比也相当模糊。因为我们在对字符串进行 base64 编码之前对其进行了压缩,所以任何足够聪明的人在尝试反转它时仍然必须理解压缩后的字符串。
要将字符串变回对象,您可以这样做
unserialize(
gzinflate(
base64_decode(
$obfuscatedString
)
)
)
然后取回你的对象。 Demo
安全注意事项
以上仍然是不安全的。你不应该依赖混淆来保证安全。如果您通过 HTTP 传输一个对象或整个对象图,您必须将它们视为接收端的用户输入。 无法信任用户输入。弄清楚字符串是如何被混淆的恶意用户可以提供更改过的输入。因为您要将对象反序列化回程序流中,所以您必须对生成的对象保持绝对的偏执。
参见 http://www.sektioneins.com/en/advisories/advisory-032009-piwik-cookie-unserialize-vulnerability/一个相关的例子。
关于php - 将 php 对象存储在 html 表单元素上并通过 GET 方法传递 php 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4842140/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!