[英]PHP Serialize Successful, Unserialize Failure
我的PHP代碼已序列化但未反序列化,這可能是什么問題?
$serializedColumns = serialize($columnNames);
我得到以下結果html,其中將序列化的字符串存儲到隱藏字段中:
<input id="columns_hidden" name="columns" type="hidden" value="a:3:{i:0;s:8:"Username";i:1;s:8:"Password";i:2;s:11:"AccessLevel";}">
該請求被發送到“ AddData.php”,在這里我有這樣的反序列化代碼:
$columns = unserialize($_REQUEST['columns']);
當我在$columns
上調用print_r
時,它返回一個空白字符串。
當我在$_REQUEST['columns']
上調用print_r
時,它返回:
a:3:{i:0;s:8:\\"Username\\";i:1;s:8:\\"Password\\";i:2;s:11:\\"AccessLevel\\";}
這實際上是一條評論,但我在這里將其放在此處以引起更多關注: 請勿這樣做 。
為什么? -每當您盲目地對請求提供的數據進行反unserialize
,PHP的作用都超出您的想象。 這會創建對您的應用程序有害的對象,而您對此無能為力。
可以使用DOM編輯器或JavaScript輕松地編輯和處理隱藏的輸入,以包含有害代碼,或者可以對您的網站觸發惡意請求,從而迅速將其關閉。
替代方案 -而是使用您可以更輕松地處理的某種形式的數據,例如,使用json_encode
/ json_decode
或經典的implode
/ explode
:
$serializedColumns = implode(',', $columnNames);
和
$columns = explode(',', $_REQUEST['columns']);
由於它是靜態數據處理,因此更加安全可靠。
看來您正在通過htmlspecialchars傳遞序列化的結果 。 這將破壞序列化的數據。 使用其他編碼方法以使其安全地用作html屬性值,即base64_encode :
<?php
$serializedColumns = serialize($columnNames);
?>
<input id="columns_hidden" name="columns" type="hidden" value="<?php echo base64_decode($serializedColumns) ?>">
然后,在您的處理腳本中:
$columns = unserialize(base64_decode($_REQUEST['columns']));
"
是probabably將在連載的方式,如;
不能逃脫。
您可以對值進行base64_encode
並隨后對其進行解碼:
$serializedColumns = base64_encode(serialize($columnNames));
至
$columns = unserialize(base64_decode($_REQUEST['columns']));
當您將數據發布到PHP時,看起來好舊的魔術引號在所有定界引號之前插入\\。 您必須先取消轉義(斜杠),然后才能解碼/反序列化。
如果您對該列使用VARCHAR,請嘗試將MySQL列更改為TEXT。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.