javascript中的android chrome Cookie集在PHP$_Cookie中不可用

android chrome Cookie set in javascript not available in PHP $_COOKIE

本文关键字:Cookie PHP 中的 android chrome 集在 javascript      更新时间:2023-10-28

我为公司的一个活动设置了一个在线注册表格。我使用我们银行收集信用卡信息的服务,因为我不想在试图保护所有这些信息时遇到麻烦。因此,我的表单收集了所有必要的数据,设置了一个cookie,然后转发到银行给我的php页面,银行会检查浏览器中设置的cookie,如果它在那里,就会返回实际的html,然后直接转发到信用卡数据输入页面。如果没有设置cookie,页面会显示一条消息,说明页面需要JavaScript,然后返回并打开它。(请注意,这不是我的代码,它来自银行)。下面是一些代码片段。我把饼干设置成这样:

document.cookie = "fam=barn; path=/pmtproc";

在一个名为setCookie()的javascript函数中,这是该函数中除了try/catch块之外的唯一一行代码。然后,在提交表单时转发到的页面(提交表单的"操作"中的url)中,cookie被检查如下:

if (isset($_COOKIE['name'])){
    setcookie('name', '', time()-3600);
    echo $x;
} else {
   echo ("JavaScript is needed for this page. Please go "):
   $url = htmlspecialchars($_SERVER['HTTP_REFERER']);
   echo "<a href='$url'>back</a>"
   echo ", turn on JavaScript and try again - thanks!":
}

($x包含页面的html,当"设置了Javascript"时,它会转发到银行的信用卡数据输入网站。最有趣的是,注册表格到处都使用Javascript,所以如果没有启用Javascript,他们甚至无法进入检查cookie的页面)。

setCookie()函数是提交按钮(processForPmt())调用的函数在返回true之前所做的最后一件事。在此之前,processForPmt()会在页面上添加来自其他表单的元素,这些元素中包含单独的注册数据——页面一次接受多个注册。(所以基本上我会把各个表单上的元素复制到将要提交的表单中)。

现在,这个问题的奇怪之处在于,它在台式机浏览器(Mac上的FF 45和Chrome 49)上运行良好,但在我的Android手机(Chrome 49和Android 4.4.4)上则不然。我还没有在其他任何浏览器上测试过它。

我已经在手机上使用Chrome的远程调试工具进行了调试,setCookie没有发现任何异常或其他抱怨。它似乎将cookie设置得很好,但当它到达第二个php页面时,没有cookie。根本没有cookie。:-(

更奇怪的是,我在一个不同的注册表格中有完全相同的设置,现在正在运行,而且效果很好。我以完全相同的方式设置cookie,在javascript中使用相同的setCookie()函数(尽管是该文件的本地函数-我知道,我知道它应该在我包含的一个文件中,但我只是还没有时间这么做),然后转发到一个php文件,该文件使用完全相同的代码检查cookie(尽管在不同的文件中,所以我可以在不破坏当前注册的情况下测试新注册)。

我相信还有其他信息可以帮助解决这个问题,所以请让我知道你还需要知道什么来帮助我。

这可能是一件非常荒谬的事情(我已经检查了以确保cookie代码的设置是相同的-从工作文件复制/粘贴到不工作的文件中),我就是看不到…

第4-6-16版:我注册了browserstack.com,这样我就可以在其他设备/网站上测试它,这在带有KitKat(4.4.4)的Galaxy S4上运行得很好,这就是我的手机(虽然它是摩托罗拉Droid Mini,但我没有这个选项),还有一台运行棒棒糖(5)的Moto X第二代。可能只是我的手机。但任何想法都将不胜感激。

我注意到在一个带有https和SameSite="无";,饼干没有做好。当我添加";"安全";属性,它工作:

var is_ssl = window.location.protocol === "https:";
var ss = is_ssl ? ";SameSite=None" : ";SameSite=Lax";
var sec = is_ssl ? ";secure" : "";
document.cookie = name + " = " + value + ss + sec;

唯一的问题是,当您有一些带有HTTPS的页面,而有些没有HTTPS的页面时,并且您希望两者都能访问cookie。。那么也许你应该总是设置SameSite=lax而不带";"安全";属性(我尚未对此进行测试)。

警告:为了保护您的数据,请确保您了解SameSite的不同值。