Chrome 33 Beta 的 Cookie 问题

4

有没有其他人在使用Chrome 33 Beta时遇到读取cookie值的问题?我们使用SQLite数据库浏览器,发现丢弃的cookie的值为空。我们在IE、Firefox和之前的所有Chrome版本中都没有这个问题。

2个回答

3

据eneuron所述,Chrome v33+现在加密了cookies。

虽然不支持使用SQLite访问cookie值,但仍有可能使用SQLite获取它们。您可以解密数据,这可以通过在Windows计算机上调用CryptUnprotectData来完成,具体操作可参考该讨论。我认为您必须以创建cookie的相同用户登录。

以下是一个示例脚本,它基于之前在Python 3中提出的问题的代码(链接)

# Used information from:
# https://dev59.com/vHRB5IYBdhLWcg3w7riV
# http://www.linkedin.com/groups/Google-Chrome-encrypt-Stored-Cookies-36874.S.5826955428000456708

from ctypes import *
from ctypes.wintypes import DWORD
import sqlite3;

cookieFile="C:/Users/your_user_name/AppData/Local/Google/Chrome/User Data/Default/Cookies";
hostKey="my_host_key";

LocalFree = windll.kernel32.LocalFree;
memcpy = cdll.msvcrt.memcpy;
CryptProtectData = windll.crypt32.CryptProtectData;
CryptUnprotectData = windll.crypt32.CryptUnprotectData;
CRYPTPROTECT_UI_FORBIDDEN = 0x01;

class DATA_BLOB(Structure):
    _fields_ = [("cbData", DWORD), ("pbData", POINTER(c_char))];

def getData(blobOut):
    cbData = int(blobOut.cbData);
    pbData = blobOut.pbData;
    buffer = c_buffer(cbData);
    memcpy(buffer, pbData, cbData);
    LocalFree(pbData);
    return buffer.raw;

def encrypt(plainText):
    bufferIn = c_buffer(plainText, len(plainText));
    blobIn = DATA_BLOB(len(plainText), bufferIn);   
    blobOut = DATA_BLOB();

    if CryptProtectData(byref(blobIn), u"python_data", None,
                       None, None, CRYPTPROTECT_UI_FORBIDDEN, byref(blobOut)):
        return getData(blobOut);
    else:
        raise Exception("Failed to encrypt data");

def decrypt(cipherText):
    bufferIn = c_buffer(cipherText, len(cipherText));
    blobIn = DATA_BLOB(len(cipherText), bufferIn);
    blobOut = DATA_BLOB();

    if CryptUnprotectData(byref(blobIn), None, None, None, None,
                              CRYPTPROTECT_UI_FORBIDDEN, byref(blobOut)):
        return getData(blobOut);
    else:
        raise Exception("Failed to decrypt data");

conn = sqlite3.connect(cookieFile);
c = conn.cursor();
c.execute("""\
SELECT 
    host_key,
    name,
    path,
    value,
    encrypted_value
FROM cookies
WHERE host_key = '{0}'
;
""".format(hostKey));

cookies = c.fetchmany(10);
c.close();

for row in cookies:
    dc = decrypt(row[4]);
    print( \
"""
host_key: {0}
name: {1}
path: {2}
value: {3}
encrpyted_value: {4}
""".format(row[0], row[1], row[2], row[3], dc));

1

从33版本开始,Chrome加密了cookies,这就是你无法检索它们的原因。在SQlite数据库中有一个新字段叫做“encrypted_value”,当使用它时,旧字段“value”保持为空 - 这就是你得到空字符串的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接