我目前正在使用C#表单应用程序,需要访问我的电脑上的特定Cookie,我可以做得很好.以下是问题:
Google将cookies存储在sqlite中,我已经下载了sqlite数据库浏览器,以帮助我查看这些值.令我惊讶的是,大约一半的cookie值显示为空(包括我需要的),尽管它们显然不是.
C:\Users\%username%\AppData\Local\Google\Chrome\User Data\Default\Cookies
在Chrome上我有一个名为“编辑此Cookie”的插件,可以直接修改我所在网站上的Cookie.这个插件可以读取这些cookie,并且Web浏览器可以在需要不同请求时通过HTTP解析值,所以它们绝对存在 – 仍然是sqlite浏览器,我的自定义代码都得出结论,特定的值字段是空的.
这是为什么?
什么是以某种方式防止某些应用程序读取该字段?
我遇到同样的问题,下面的代码为任何有兴趣的人提供了一个工作示例.随着DPAPI的出现,所有这些都归功于Scherling.
原文链接:https://www.f2er.com/sqlite/197787.htmlpublic class ChromeCookieReader { public IEnumerable<Tuple<string,string>> ReadCookies(string hostName) { if (hostName == null) throw new ArgumentNullException("hostName"); var dbPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Google\Chrome\User Data\Default\Cookies"; if (!System.IO.File.Exists(dbPath)) throw new System.IO.FileNotFoundException("Cant find cookie store",dbPath); // race condition,but i'll risk it var connectionString = "Data Source=" + dbPath + ";pooling=false"; using (var conn = new System.Data.sqlite.sqliteConnection(connectionString)) using (var cmd = conn.CreateCommand()) { var prm = cmd.CreateParameter(); prm.ParameterName = "hostName"; prm.Value = hostName; cmd.Parameters.Add(prm); cmd.CommandText = "SELECT name,encrypted_value FROM cookies WHERE host_key = @hostName"; conn.Open(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var encryptedData = (byte[]) reader[1]; var decodedData = System.Security.Cryptography.ProtectedData.Unprotect(encryptedData,null,System.Security.Cryptography.DataProtectionScope.CurrentUser); var plainText = Encoding.ASCII.GetString(decodedData); // Looks like ASCII yield return Tuple.Create(reader.GetString(0),plainText); } } conn.Close(); } } }