用户可以通过多种方式编辑Cookie的内容。在我的网站上,我有一个名为“user”的cookie,用于存储用户当前登录的用户名。但是,我只是注意到可以编辑此cookie以登录任何帐户。是否有任何代码或参数可以添加到setcookie()函数中,阻止用户编辑某个cookie?
答案 0 :(得分:3)
不,最终cookie存储在客户端的计算机上,客户端可以访问它。我建议存储哈希而不是用户的帐户名。从cookie中获取哈希并从数据存储中检索用户名,如果哈希被操作,那么您将无法获得正确的用户名,并且您知道需要它们再次登录并在cookie中创建有效的哈希值。 / p>
答案 1 :(得分:2)
我可以添加到setcookie()函数的代码或参数, 阻止用户编辑某个cookie?
不,没有。 Cookie始终可以由客户编辑。如果要存储敏感信息,则应加密它们。实际上,最好的方法是永远不要将敏感信息存储在cookie中,例如用户名。建议将其存储在服务器端会话中。可以使用cookie跟踪服务器端会话本身,但包含用户名的敏感信息保留在服务器上。
答案 2 :(得分:0)
没有。 Cookie存储在用户计算机上,通常以文本文件或类似方式存储。最好不要将用户信息存储在cookie中,而是将这些信息保存在会话中。会话存储在服务器上,因此用户无法编辑它们。
答案 3 :(得分:0)
不,没有。 Cookie基本上是客户端计算机上的文本文件,总有一些方法可以对其进行编辑。
但是您的问题有一个简单的解决方案:在Cookie中保存更多信息。例如,您可以在第二个cookie中存储密码的哈希码(如md5()
或sha1()
),然后检查该哈希值是否与客户端“假装”为
答案 4 :(得分:0)
你不能阻止客户修改cookie(毕竟它保存在他的机器上)。
您可以做的是验证您身边的Cookie,以确保其合法且完整无缺。
我喜欢做的是发送2个Cookie。
通过这种方式,您可以验证您的用户,而不必担心人们会更改它(因为他们需要知道密码+随机盐+散列函数)。
答案 5 :(得分:0)
您可以做的是发出一个基本上是令牌的cookie。这是我过去做过的事情
function get_token(){
$token = md5(date("l").$_SERVER['USER_AGENT'].date("d"));
return $token;
}
$token = get_token();
setcookie($token);
然后当你想检查它时:
$token = get_token();
if($token == $_COOKIE['token']){
echo 'show the good page here';
} else {
echo 'user is not authenticated.. display login page';
}
只要客户端正在传递用户代理,就会接受令牌,直到当天发生变化。
答案 6 :(得分:0)
对于粘性会话(会话亲和性)负载平衡系统或单体非分布式系统,或在使用共享缓存机制(如 redis)的完全可扩展系统中,您可以在登录页面中创建一个非持久性的会话 cookie,并且存储在浏览器的内存中,您可以使用它来存储您想要存储的任何“受保护”数据。使用以下代码设置保护此 cookie 所需的一些标头。 httponly 头将阻止 javascript 访问 cookie,安全头禁止 cookie 数据通过非加密通道传输,仅使用 cookie 来防止涉及在 URL 中传递会话 ID 的攻击。</p>
ini_set('session.cookie_secure','1');
ini_set('session.cookie_httponly','1');
ini_set('session.use_only_cookies','1');
session_start();
根据 php 的版本和浏览器,您还可以根据您是否想要跨域请求来使用 Lax 的相同站点标头。所有标头设置器都应在会话创建之前 (session_start();
)。
ini_set('session.cookie_samesite','Lax');
然后,当您的用户通过身份验证时,您可以将用户名的值存储在会话 cookie 中。
$_SESSION['username']=$_POST['username']
这样没有人能够改变它的价值。但请记住,cookie 容易受到 CSRF 攻击,您将需要在每个 POST 请求中使用同步令牌来验证请求是否来自经过身份验证的用户。
对于没有任何共享缓存的分布式系统,您可以使用 JWT(JSON 网络令牌),其内容使用散列消息身份验证代码 (HMAC) 加密算法和分发到所有系统的秘密(私钥)进行签名需要阅读或签署内容。因此,如果您更改存储的用户名,令牌将无法通过验证,因为内容的摘要已更改。