setrawcookie

(PHP 5, PHP 7, PHP 8)

setrawcookie发送不进行 URL 编码的 cookie 值的 cookie

描述

setrawcookie(
    字符串 $name,
    字符串 $value = ?,
    整数 $expires_or_options = 0,
    字符串 $path = ?,
    字符串 $domain = ?,
    布尔值 $secure = false,
    布尔值 $httponly = false
): 布尔值

从 PHP 7.3.0 开始提供备用签名(不支持命名参数)

setrawcookie(字符串 $name, 字符串 $value = ?, 数组 $options = []): 布尔值

setrawcookie()setcookie() 完全相同,只是 cookie 值在发送到浏览器时不会自动进行 URL 编码。

参数

有关参数信息,请参阅 setcookie() 文档。

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
7.3.0 添加了支持 options 数组的备用签名。此签名也支持设置 SameSite cookie 属性。

另请参阅

添加注释

用户贡献注释 6 个注释

25
Brian
18 年前
Firefox 遵循真正的规范,不会将 '+' 解码为空格...事实上,它会进一步将它们编码为 '%2B' 来存储 cookie。如果您使用 javascript 读取 cookie 并对其进行unescape,则所有空格都将变为 '+'。
要解决此问题,请使用 setrawcookie 和 rawurlencode

<?php
setrawcookie
('cookie_name', rawurlencode($value), time()+60*60*24*365);
?>

唯一变化是空格将编码为 '%20' 而不是 '+',现在可以正确解码。
11
subs at voracity dot org
17 年前
setrawcookie() 并不完全是 'raw'。它将检查值是否有无效字符,如果有,则不允许 cookie。以下是要记住的无效字符:',;<space>\t\r\n\013\014'。

请注意,逗号、空格和制表符是三个无效字符。IE、Firefox 和 Opera 可以正常使用这些字符,PHP 也可以正常读取包含它们的 cookie。但是,如果您想在从 php 设置的 cookie 中使用这些字符,则需要使用 header()。
0
Sebastian
13 年前
您真的不应该在 cookie 中使用 (un)serialize。恶意用户可以在您的脚本中注入任何代码。
-3
sageptr at gmail dot com
12 年前
如果您想传递一些内容并稍后进行反序列化,则应以某种方式对值进行签名,以确保恶意用户不会修改它。
例如,计算散列 sha1($value.$securekey) 并将其放置到不同的 cookie 中。如果 cookie 值与散列不匹配 - 简单地丢弃两者。
此技术可以在您想保护 cookie 免遭修改的情况下使用,但它无法防止删除或设置为其他有效 cookie(旧的或从其他用户那里窃取的)。
-13
lgb
14 年前
在遇到几个关于 cookie 的问题后,我开始对放入 cookie 中的数据使用 base64_encode,因此我可以避免之前遇到的问题。我尝试使用从 PHP 数组中创建的 serialize() 数据设置 cookie,但它无法正常工作。在我将其修改为使用 value of base64_encode(serialize(...)) 设置 cookie 以及 unserialize(base64_decode(..)) 检索值后,一切都开始工作。
-51
kexianbin at diyism dot com
12 年前
我的 php cookie 值编码函数

<?php
function encode_cookie_value($value)
{return
strtr($value,
array_combine(str_split($tmp=",; \t\r\n\013\014"),
array_map('rawurlencode', str_split($tmp))
)
);
}
setrawcookie('kk', encode_cookie_value('jk=jk?jk-/":jk;jk jk,jk'));
?>
To Top