我有任何有趣的问题,让我完全难过.
我有一段我构建的生产代码,它读取由另一个部门管理的机器设置的IBM LTPA令牌cookie,对其进行验证,并使用它来登录我的团队管理的系统(通过设置一些特殊的cookie).这个单点登录过程对最终用户完全透明,并且在所有浏览器中已经在生产中运行了好几年.
最近,我注意到它在我的IE8开发机器上无法正常工作.我最近从Vista升级到Windows 7.但是我不确定在升级之前或之后这是不是在我的机器上工作,因为它已经工作了很长时间,我没有理由对它进行测试.同一台机器上的FireFox 3.5和Chrome 4 dev都按预期工作.在这台机器上的XP SP3虚拟IE6工作正常.家中多台机器上的IE8工作正常(Windows Server 2008和Windows 7).
出于诊断目的,我清除了我的开发IE8(WinInet缓存)中的所有缓存数据,以一个干净的平板开始.我向Fiddler开火,追查过程并确定哪些不起作用.我发现的相当有趣,我无法解释.
在初始站点登录后 - 让我们将其命名为ltpa.domain.com,会话cookie将按预期使用Set-Cookie标头从服务器下推.我验证域已正确设置为.domain.com并且路径为/.登录后来自浏览器的所有后续请求将所有cookie按预期推送回服务器并返回每个请求.事实上,这是一个门户网站,还有一些额外的内容,也就是说,portal.domain.com也可以检索; 所有cookie也正确传递给该服务器.
现在有趣的是 - 当我向myserver.domain.com发出请求时 - 由ltpa.domain.com设置的域级别cookie不会被推送到myserver.domain.com,即使它们应该是. 如果缺少cookie,则单点登录进程会自动重定向回ltpa.domain.com(并将cookie推送到ltpa登录进程用于重定向的客户端) - myserver设置的域级别cookie未被推送回到ltpa.domain.com.
同样,这只发生在我所知道的我的开发机器上的这个IE8实例上.这个过程每天使用数千次,用户群相当大,我们没有收到最终用户的其他投诉 - 因此没有迹象表明这是IE8或类似的系统性问题.
在我看来,它将myserver.domain.com和ltpa.domain.com视为单独的域,即使它们不是.
有两点可能值得一提 - 但可能是红色鲱鱼,因为它一直都是这样,并且从未引起过任何问题.
DNS在这里有点时髦.LTPA.domain.com解析为外部IP.但是,myserver.domain.com解析为内部IP.对该IP进行反向查找会给出内部dns名称 - 比方说myserver.internal.domain.com.我推测可能IE8正在进行某种反向查找以防止基于DNS的攻击 - 因此我修改了我的HOSTS文件并将myserver.domain.com指向外部IP以进行测试.我在Fiddler中证实了请求转到了外部IP - 但它与cookie没有任何区别.他们仍然没有通过.
以前,myserver.domain.com位于IE WinInet安全配置页面中的"可信站点"下.我删除了它和那里的另一个网站.我们叫这台机器,my2.domain.com; 巧合地(或许不是?)这台机器也没有通过ltpa.domain.com设置的域cookie.在这种情况下,我不需要传递cookie,但我还是测试了它,看看这个问题是否影响了其他机器.在IE状态栏中,ltpa.domain.com,portal.domain.com和myserver.domain.com都显示在"Internet"区域下.有点奇怪的是,my2.domain.com仍然在状态栏中显示"可信站点",即使它没有在对话框中列出?是的,我在进行更改后重新启动.
其他注意事项.
我知道IE和非.com域的其他问题,引用的cookie值和其他cookie异常 - 在stackoverflow和Interwebs上的其他地方提到过.这些都不适用.我已经阅读了Eric Law的关于cookie内部的IEInternals文章 - http://blogs.msdn.com/ieinternals/archive/2009/08/20/WinINET-IE-Cookie-Internals-FAQ.aspx
在IE中没有启用时髦的插件.Just Flash,Silverlight,Live ID登录助手和Fiddler2.
没有用于过滤特定于我的域的内容的InPrivate规则.
由于我在笔记本电脑上,我从家庭网络(重启后)尝试过IE8以排除DNS问题.我在家里遇到了同样的行为,所以就我所知,时髦的DNS并不是问题.
我已多次浏览所有IE设置,认为我可能错过了一个模糊的cookie设置.隐私设置为"中等",没有特殊处理的网站.
使用开发工具,我确保未选中"始终从服务器刷新".
我不认为这是我可以向微软报告的任何内容,因为我无法在其他任何地方重现这个问题.
所以在这一点上,我很茫然.没有在IE8中打开我不知道的某种诊断模式,或者没有用于调试的代码......我已经没有好主意了.
我想我已经遇到过一个bug,一些注册表设置或类似的东西已被调整,或某些东西,某处已经腐败.
有任何想法吗?
我有一个我在我的应用程序上使用的cookie.它看起来像这样:
+-------+-------+-----------------------+-------+----------+
| Name | Value | Domain | Path | Expires |
+-------+-------+-----------------------+-------+----------+
| foo | bar | my.domain.tld | / | Session |
+-------+-------+-----------------------+-------+----------+
Run Code Online (Sandbox Code Playgroud)
在我的脚本的一部分中,基于某些条件,我正在尝试更改cookie的值.我正在使用此代码:
// overwrite cookie
if($condition){
setcookie("foo", "cat", 0, "/", "my.domain.tld");
}
Run Code Online (Sandbox Code Playgroud)
之后,我的cookie数据如下所示:
+-------+-------+-----------------------+-------+----------+
| Name | Value | Domain | Path | Expires |
+-------+-------+-----------------------+-------+----------+
| foo | bar | my.domain.tld | / | Session |
| foo | cat | .my.domain.tld | / | Session |
+-------+-------+-----------------------+-------+----------+
Run Code Online (Sandbox Code Playgroud)
为什么.要将a 添加到域名之前?我想覆盖现有的cookie.
我在Chrome扩展程序中有一个后台页面,该页面向服务器发出请求。通过使用Chrome的调试工具,我可以看到Set-Cookie返回了各种标头。但是,后续请求中不包含这些Cookie-Chrome似乎将其丢弃。这导致对服务器的每个请求都被计为新会话。
服务器端我设置了以下标头:
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
Run Code Online (Sandbox Code Playgroud)
我已经withCredentials = true在客户端上设置了XMLHttpRequest对象。
我还在扩展清单的权限部分中具有服务器的地址。
我觉得我在这里已经很接近解决方案了-服务器以正确的标头进行响应,但是我无法弄清楚为什么Chrome决定不存储Cookie。
我还需要在标题,XMLHttpRequest对象或清单中设置其他内容吗?还是这不可能?
javascript cookies xmlhttprequest setcookie google-chrome-extension
这是我希望的一个快速问题......
我正在尝试设置一个可在全站范围内使用的cookie.我正在创建一个潜在客户型网站.我希望用户填写表单以访问独家信息.一旦他们填写表格,他们就可以访问信息.
我在用户提交表单时丢弃一个cookie,这样他们就可以在下次访问网站时直接访问内容.他们填写的表格位于网站每个页面的侧边栏中.当用户在一个页面上填写表单时,他们不应该在网站的任何页面上看到它.
一切都在运作,除了全站点位.我认为问题在于这段代码:
function set_cookie(name, value, expires, path, domain, secure){
if (!expires){expires = new Date()}
document.cookie = name + "=" + escape(value) +
((expires == null) ? "" : "; expires=" + expires.toGMTString()) +
((path == null) ? "" : "; path=" + path) +
((domain == null) ? "" : "; domain=" + domain) +
((secure == null) ? "" : "; secure");
}
Run Code Online (Sandbox Code Playgroud)
但这是下面的完整代码.非常感谢!
<script type="text/javascript">
<!--
cookie_name="landasp"
expdays=365
// An adaptation of Dorcht's cookie functions.
function …Run Code Online (Sandbox Code Playgroud) 如何file:///使用Javascript或jQuery 读取/写入本地HTML文档的cookie ?
我试过这个>>
function setCookie(c_name, value, exdays)
{
var exdate = new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value = escape(value) +
((exdays == null) ? "" : "; expires=" + exdate.toUTCString());
document.cookie = c_name + "=" + c_value;
}
function getCookie(c_name)
{
var i, x, y, ARRcookies = document.cookie.split(";");
for (i = 0; i < ARRcookies.length; i++)
{
x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
x = x.replace(/^\s+|\s+$/g, "");
if (x == c_name)
{
return …Run Code Online (Sandbox Code Playgroud) 当我用这个php行创建一个新的cookie时,我正在创建我的网站:
setcookie('subscribed', 'true', time() + 365*24*3600*100, '/', null, false, true);
Run Code Online (Sandbox Code Playgroud)
我意识到我的浏览器(谷歌浏览器)拒绝获得该cookie.当我在谷歌浏览器中查看我的cookie时,它不存在.我开始摆弄不同的设置,直到我看到它有效:
setcookie('subscribed', 'true', time() + 365*24*360, '/', null, false, true);
Run Code Online (Sandbox Code Playgroud)
这意味着将到期时间更改为较低的值确实可以作为一种方法来完成这项工作.
我的问题是,您可以为Google Chrome中的Cookie设置的最低到期时间是多少?有谁知道这个政策?
我使用PhpStorm,xdebug和nginx + php-fpm进行远程调试.当我传入XDEBUG_SESSION_START=my_ide_key请求GET参数时,Nginx使用502错误代码(Bad Gateway)进行调用.同时我在IDE中的代码断点工作正常.当我没有传递XDEBUG_SESSION_START参数nginx响应格式良好的HTML和代码200.但没有这个参数显然没有调试.
在nginx错误日志中,我看到有关从上游收到的大标头的通知.我尝试在php-fpm和nginx之间转储通信,只有一个不同的东西是一个Set-Cookie头:
Set-Cookie: XDEBUG_SESSION=666; expires=Mon, 16-Sep-2013 16:07:28 GMT; path=/
Run Code Online (Sandbox Code Playgroud)
我试着找到这个标题出现在响应中的时间.我发现在我的smarty插件Smarty_Internal_Template析构函数中(在我的启动脚本的最后一行代码行之后),如果我调用,headers_list()我会看到大量的Set-Cookie标头(相等的析构函数调用和Set-Cookie标头数量).我确信header('Set-Cookie: XDEBUG_SESSION=...')我的代码中没有一个显式调用.我尝试升级和降级xdebug版本但仍然具有相同的行为.放置代码remove_header('Set-Cookie')在Smarty_Internal_Template解决了我的问题,不过这是丑陋的黑客!
有关这种奇怪情况的任何想法?
我在同一台服务器上托管了两个域,域A和域B.
域A将为域B的内容生成唯一的访问令牌.
域名A.
<?php
//http://php.net/manual/en/function.phpversion.php
//echo 'Version of PHP: ' . phpversion();
session_start();
//$expiry_timestamp = time() + $expiry;
//https://davidwalsh.name/random_bytes //https://secure.php.net/random_bytes
//$token = bin2hex(random_bytes(64));
$token = bin2hex(openssl_random_pseudo_bytes(64));
//$time_token = 12000;
//$time_token = srand(floor(time() / $time_token));
//echo $token;
$_SESSION['token']=$token;
?>
<html>
<head>
</head>
<body>
<a href= "domainB.com/content1.php?token=<?php echo $_SESSION['token']; ?>">Content 1</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
生成令牌的过程似乎是正确的,生成它很容易.
现在出现了我的问题,如何验证从域A到域B生成的令牌?生成的令牌必须仅对生成令牌的内容有效,令牌必须对其他内容无效,令牌必须是唯一的,这样如果用户不是来自他或她的计算机,则用户无法共享对其他用户的访问权限,令牌必须仅在4小时后有效,4小时后令牌将不再有效显示内容必须生成新令牌才能再次访问.
可以在不使用数据库的情况下使用cookie完成此过程吗?
也许使用密钥识别域A和B,类似的东西
$APP_SECRET_KEY = "key code secret";
Run Code Online (Sandbox Code Playgroud) 我有一些IE8尊重我通过jQuery cookie插件设置的cookie的问题.在Firefox,Chrome,Safari,IE6和IE7(通过IETester)中,一切正常,但IE8似乎并没有存储cookie.
如果我F12到开发工具栏并检查"缓存"菜单项中的cookie,我可以在设置后看到我的cookie.我还看到其他cookie被设置但我只有我的测试页面作为我的主页.我有一堆用于microsoft和coolwebdeveloper.com的cookie(我把那个网站拉了起来,不记得曾经去过那里)???
下面是我通过开发工具栏设置/验证的cookie.
NAME filters
VALUE show
DOMAIN mydomain.com
PATH /my/neat/path/
EXPIRES 3/12/2011 6:30:02 PM
Run Code Online (Sandbox Code Playgroud)
当我退出/重新启动IE8时,该cookie不会持续存在(它将在31天后过期).
有人有主意吗?我可以查看一些偏好设置吗?这可能是一些IT设置/防火墙的事情,我无能为力吗?
我确实尝试了选项 - >隐私 - >将互联网区域降低到"接受所有cookie",但这并没有什么不同.不过,我在屏幕底部有一个突出显示的注释,"某些设置由系统管理员管理".
另外,在View - >网页隐私政策中,我正在测试的域名称"没有限制或阻止cookie".
我正在尝试在我的 aws lambda 函数响应中设置 cookie。我没有任何标头映射,因为我正在使用 lambda 代理与 API Gateway 集成。lambda 函数中的响应代码如下所示:
exports.handler = async (event) => {
const response = {
statusCode: 200,
"multiValueHeaders": {
"Set-Cookie": ["gtgm=6c7729687d5ff1a05f1a5dfb15ce3b8fa3f2b590; path=/; expires=Fri, 13-Feb-2032 13:27:44 GMT; secure; HttpOnly; SameSite=None"]
},
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "*",
"Access-Control-Allow-Credentials": true,
},
};
return response;
};
Run Code Online (Sandbox Code Playgroud)
我使用 fiddler 检查响应,我可以在响应中看到“Set-Cookie...”,这让我相信上面的代码是正确的?问题是浏览器只是忽略它并且除了 AWS DNT cookie 之外根本不设置任何 cookie。我不确定还需要检查什么,或者我是否遗漏了 cookie 配置中的任何内容。
这就是我的请求:
<Button
onClick={() => {
fetch(
"https:mysupercoolapi.com/cookie-test/",
{
// credentials: "include",
headers: {
"Content-Type": "application/json",
// "Access-Control-Allow-Credentials": "true",
},
}
) …Run Code Online (Sandbox Code Playgroud) setcookie ×10
cookies ×8
php ×4
javascript ×3
android ×1
aws-lambda ×1
httpcookie ×1
jquery ×1
nginx ×1
xdebug ×1