web-dev-qa-db-ja.com

Cookie内の配列PHP

配列をCookieに保存する適切な方法は? PHPコード例:

$number_ticket=2;
$info[7][5]=1;
$info[8][5]=1;
55
Paul Barrios

データのシリアル化:

setcookie('cookie', serialize($info), time()+3600);

次に、データのシリアル化を解除します。

$data = unserialize($_COOKIE['cookie'], ["allowed_classes" => false]);

データの後、$ infoと$ dataのコンテンツは同じになります。

66
Narcis Radu

配列値をcookieに保存するには、まずそれらを文字列に変換する必要があるため、いくつかのオプションがあります。

CookieをJSONとして保存する

コードを保存する

setcookie('your_cookie_name', json_encode($info), time()+3600);

コードを読む

$data = json_decode($_COOKIE['your_cookie_name'], true);

JavaScriptを使用してフロントエンドでCookieを読み取る必要がある場合にも、JSONを選択することをお勧めします。

実際には、配列を文字列に変換し、文字列を元に戻すencrypt_array_to_string/decrypt_array_from_stringメソッドグループを使用できます。 同じ アレイ。たとえば、整数の配列にexplode/implodeを使用することもできます。

警告:serialize/unserializeを使用しないでください

PHP.netから

enter image description here

Do not pass untrusted user input to unserialize().-Cookieを含むHTTPで送信されるものは信頼できません。

セキュリティに関連する参考資料

別の解決策として、配列を文字列に変換せずにそれを行うこともできます。

setcookie('my_array[0]', 'value1' , time()+3600);
setcookie('my_array[1]', 'value2' , time()+3600);
setcookie('my_array[2]', 'value3' , time()+3600);

$_COOKIE変数を出力すると、次のように表示されます

echo '<pre>';
print_r( $_COOKIE );
die();
Array 
(
 [my_array] => Array 
(
 [0] => value1 
 [1] => value2 
 [2] => value3 
)
 
)

これはPHP機能として文書化されています。

PHP.netから

Cookies names can be set as array names and will be available to your PHP scripts as arrays but separate cookies are stored on the user's system.

96

Cookieでシリアライズおよびアンシリアライズを使用すると、セキュリティ上のリスクがあります。ユーザー(または攻撃者)はCookieデータを変更できます。Cookieデータを非シリアル化すると、サーバーでPHPコードが実行される可能性があります。 Cookieデータは信頼できません。代わりにJSONを使用してください!

PHPのサイト から:

allowed_classesoptions値に関係なく、信頼できないユーザー入力をunserialize()に渡さないでください。シリアル化を解除すると、オブジェクトのインスタンス化と自動読み込みによりコードが読み込まれて実行される可能性があり、悪意のあるユーザーがこれを悪用する可能性があります。シリアル化されたデータをユーザーに渡す必要がある場合は、JSONなどの安全な標準データ交換形式(json_decode()およびjson_encode()を使用)を使用します。

14
Nathan

Cookieは基本的にテキストであるため、JSON文字列としてエンコードして配列を保存できます(json_encodeを参照)。ただし、保存できる文字列の長さに制限があることに注意してください。

6
Rob Agar

serialize() を試してください。配列を文字列形式に変換します。その後、 unserialize() を使用して配列に戻すことができます。 WordPressなどのスクリプトは、これを使用して複数の値を単一のデータベースフィールドに保存します。

Robが言ったようにjson_encode()を使用することもできます。これは、JavaScriptでCookieを読みたい場合に役立つかもしれません。

6
Dunhamzzz

異なるCookieに異なる要素を書き込むこともできます。 Cookie名は配列名として設定でき、PHPスクリプトで配列として使用できますが、ユーザーのシステムには別のCookieが保存されます。 explode()を検討して、1つのCookieに複数の名前と値を設定します。この目的でserialize()を使用することはお勧めしません。セキュリティホールが発生する可能性があるためです。詳細については、 setcookie PHP関数をご覧ください

2
Elzo Valugi

必要なものが見つかりました。これで、訪問した製品をCookieに保存し、後でサイトに戻ったときに表示することができます。

// set the cookies
setcookie("product[cookiethree]", "cookiethree");
setcookie("product[cookietwo]", "cookietwo");
setcookie("product[cookieone]", "cookieone");

// after the page reloads, print them out
if (isset($_COOKIE['product'])) {
    foreach ($_COOKIE['product'] as $name => $value) {
        $name = htmlspecialchars($name);
        $value = htmlspecialchars($value);
        echo "$name : $value <br />\n";
    }
}
0
Võ Minh

最近、クライアント用にこのコードを作成しました。このコードでCookieに配列を使用しています。実際、このコードは、Cookieを使用してユーザーが最近閲覧したページを取得します。

function curPageURL() { // get url
return 'http' . ((
!empty($_SERVER['HTTPS']) &&
$_SERVER['HTTPS'] !== 'off' ||
$_SERVER['SERVER_PORT'] == 443
) ? 's' : '') . '://' . $_SERVER['SERVER_NAME'] . (
$_SERVER['SERVER_PORT'] == 80 ? '' :  $_SERVER['SERVER_PORT']
) . $_SERVER['REQUEST_URI'];
}

$currentPage = curPageURL(); // call function
$counter = $_COOKIE['_counter']; // set counter variable

if(!$_COOKIE['_PAGES']){ // if _Pages cookie
$default = 1; // set default value to 1
setcookie("_counter",$default,time()+7200); // set counter cookie
setcookie("_PAGES[$default]",$currentPage, time()+3600); // set cookie  
}
else{ // if ! _Pages cookie 
$default = $counter+1; // set default value to +1
setcookie("_counter",$default,time()+7200); // set counter cookie
}


if(@in_array($currentPage, @$_COOKIE['_PAGES'])){ // if same url found
}
else{ // if new url found
setcookie("_PAGES[$default]",$currentPage, time()+3600); // set cookie  
}


if($_COOKIE['_PAGES']){
foreach ($_COOKIE['_PAGES'] as $value){
    echo "<a href='{$value}'>{$value}</a>";
} 
}
0
Shakeel Memon