惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
云风的 BLOG
云风的 BLOG
Recent Announcements
Recent Announcements
月光博客
月光博客
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
The GitHub Blog
The GitHub Blog
Last Week in AI
Last Week in AI
罗磊的独立博客
NISL@THU
NISL@THU
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Proofpoint News Feed
H
Help Net Security
L
LINUX DO - 最新话题
MongoDB | Blog
MongoDB | Blog
雷峰网
雷峰网
The Hacker News
The Hacker News
Apple Machine Learning Research
Apple Machine Learning Research
I
Intezer
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Know Your Adversary
Know Your Adversary
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
Secure Thoughts
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
C
CERT Recently Published Vulnerability Notes
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
N
News and Events Feed by Topic
F
Full Disclosure
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
Recorded Future
Recorded Future
T
Threat Research - Cisco Blogs
博客园 - 三生石上(FineUI控件)
S
Securelist
T
The Exploit Database - CXSecurity.com
Forbes - Security
Forbes - Security
H
Hacker News: Front Page
Security Archives - TechRepublic
Security Archives - TechRepublic
C
Check Point Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
V
Visual Studio Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tor Project blog
博客园 - 司徒正美
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org

博客园 - 暮江独钓

无数据库日志文件恢复数据库方法两则[转自www.sql2005.com.cn] Use ToString() to format values C# Tostring() 格式大全 [转] - 暮江独钓 C#数值结果表(格式化字符串) - 暮江独钓 - 博客园 T-SQL循环打印一年中所有的日期(WHILE循环) SQL Server各种日期计算方法(收藏) ado.net 如何读取 excel (转贴) C#编码标准--编码习惯 发布一个很COOL的图片验证码程序[含源码](转) 怎么在框架窗口中退出 c#取机器码 [转] VS2005如果使用Forms驗證,Login頁面不能引用工程中CSS和IMG文件解決方案 [转] ASP.NET几种安全验证方法[转] 最近一直在做C#操作office方面的工作!总结一下!Word(二) [转] 使用C#自动生成Word2003文档(通过操作COM组件实现) [转] C#中对Web.config配置文件的操作(增删改读) [转] ASP.NET在线用户列表精确版——解决用户意外退出在线列表无法及时更新问题 [ASP.NET] 如何在GridView中使用DataFromatString DataFormatString格式字符串
Cookie与自动保存
暮江独钓 · 2007-07-26 · via 博客园 - 暮江独钓

0.相关概念及知识
1.编写和保存Cookie
2.列举Cookie
3.读取Cookie
4.修改和删除Cookie
5.Cookie和安全性
6.设定IE浏览器是否接受Cookie

0.相关概念及知识

Cookie 提供了一种在 Web 应用程序中存储用户特定信息的方法。
例如,当用户访问您的站点时,
您可以使用 Cookie 存储用户首选项或其他信息。
当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息。

什么是 Cookie?

Cookie 是一小段文本信息,
伴随着用户请求和页面在 Web 服务器和浏览器之间传递。
Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。 

例如,
如果在用户请求站点中的页面时应用程序发送给该用户的不仅仅是一个页面,
还有一个包含日期和时间的 Cookie,
用户的浏览器在获得页面的同时还获得了该 Cookie,
并将它存储在用户硬盘上的某个文件夹中。

以后,如果该用户再次请求您站点中的页面,
当该用户输入 URL 时,浏览器便会在本地硬盘上查找与该 URL 关联的 Cookie。
如果该 Cookie 存在,浏览器便将该 Cookie 与页请求一起发送到您的站点。
然后,应用程序便可以确定该用户上次访问站点的日期和时间。
您可以使用这些信息向用户显示一条消息,也可以检查到期日期。

Cookie 与网站关联,而不是与特定的页面关联。
因此,无论用户请求站点中的哪一个页面,浏览器和服务器都将交换 Cookie 信息。
用户访问不同站点时,各个站点都可能会向用户的浏览器发送一个 Cookie;
浏览器会分别存储所有 Cookie。

使用 Cookie 能够达到多种目的,所有这些目的都是为了帮助网站记住用户。
例如,一个实施民意测验的站点可以简单地将 Cookie 作为一个 Boolean 值,
用它来指示用户的浏览器是否已参与了投票,这样用户便无法进行第二次投票。
要求用户登录的站点则可以通过 Cookie 来记录用户已经登录,
这样用户就不必每次都输入凭据。

Cookie 的限制

大多数浏览器支持最大为 4096 字节的 Cookie。
由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,
或者存储用户 ID 之类的标识符。
用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。

浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。
大多数浏览器只允许每个站点存储 20 个 Cookie;
如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。
有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,
通常为 300 个。

虽然 Cookie 在应用程序中非常有用,但应用程序不应依赖于能够存储 Cookie。
不要使用 Cookie 支持关键功能。如果应用程序必须依赖于 Cookie,
则可以通过测试确定浏览器是否将接受 Cookie。

1.编写和保存Cookie

protected void Button1_Click(object sender, EventArgs e)
{
    Response.Cookies["userInfo"]["userName"] = this.txt_UserName.Text.Trim();
if (this.chk_SavePWD.Checked)
Response.Cookies["userInfo"]["userPassword"] = this.txt_UserPassword.Text.Trim();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
                        }

2.列举Cookie

protected void Button2_Click(object sender, EventArgs e)
{
System.Text.StringBuilder output = new System.Text.StringBuilder();
HttpCookie aCookie;
string subkeyName;
string subkeyValue;
for (int i = 0; i < Request.Cookies.Count; i++)
{
aCookie = Request.Cookies[i];
output.Append("Name = " + aCookie.Name + "<br />");
if (aCookie.HasKeys)
{
for (int j = 0; j < aCookie.Values.Count; j++)
{
subkeyName = Server.HtmlEncode(aCookie.Values.AllKeys[j]);
subkeyValue = Server.HtmlEncode(aCookie.Values[j]);
output.Append("Subkey name = " + subkeyName + "<br />");
output.Append("Subkey value = " + subkeyValue +
"<br /><br />");
}
}
else
{
output.Append("Value = " + Server.HtmlEncode(aCookie.Value) +
"<br /><br />");
}
}
this.Label1.Text = output.ToString();
}

3.读取Cookie

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
        if (Request.Cookies["userInfo"] != null)
{
this.txt_UserName.Text = Request.Cookies["userInfo"]["userName"];
this.txt_UserPassword.Text = Request.Cookies["userInfo"]["userPassword"];
                                                                                }
}
}

4.修改和删除 Cookie

修改Cookie

不能直接修改 Cookie。
更改 Cookie 的过程涉及创建一个具有新值的新 Cookie,
然后将其发送到浏览器来覆盖客户端上的旧版本 Cookie。

删除Cookie

删除 Cookie(即从用户的硬盘中物理移除 Cookie)是修改 Cookie 的一种形式。
由于 Cookie 在用户的计算机中,因此无法将其直接移除。
但是,可以让浏览器来为您删除 Cookie。
该技术是创建一个与要删除的 Cookie 同名的新 Cookie,
并将该 Cookie 的到期日期设置为早于当前日期的某个日期。
当浏览器检查 Cookie 的到期日期时,浏览器便会丢弃这个现已过期的 Cookie。
下面的代码示例演示删除应用程序中所有可用 Cookie 的一种方法:

HttpCookie aCookie;
string cookieName;
int limit = Request.Cookies.Count;
for (int i = 0; i < limit; i++)
{
cookieName = Request.Cookies[i].Name;
aCookie = new HttpCookie(cookieName);
aCookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(aCookie);
}

修改或删除子键

Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);

修改单个子键的方法与创建它的方法相同,如下面的示例所示:
若要删除单个子键,可以操作 Cookie 的 Values 集合,该集合用于保存子键。
首先通过从 Cookies 对象中获取 Cookie 来重新创建 Cookie。
然后您就可以调用 Values 集合的 Remove 方法,
将要删除的子键的名称传递给 Remove 方法。
接着,将 Cookie 添加到 Cookies 集合,
这样 Cookie 便会以修改后的格式发送回浏览器。
下面的代码示例演示如何删除子键。
在此示例中,要移除的子键的名称在变量中指定。

string subkeyName;
subkeyName = "userName";
HttpCookie aCookie = Request.Cookies["userInfo"];
aCookie.Values.Remove(subkeyName);
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);

5.Cookie和安全性

Cookie 的安全性问题与从客户端获取数据的安全性问题类似。
在应用程序中,Cookie 是另一种形式的用户输入,
因此很容易被他们非法获取和利用。
由于 Cookie 保存在用户自己的计算机上,
因此,用户至少能看到您存储在 Cookie 中的数据。
用户还可以在浏览器向您发送 Cookie 之前更改该 Cookie。

千万不要在 Cookie 中存储敏感信息,如用户名、密码、信用卡号等等。
不要在 Cookie 中放置任何不应由用户掌握的内容,
也不要放可能被其他窃取 Cookie 的人控制的内容。

同样,不要轻信从 Cookie 中得到的信息。
不要假定数据与您写出时相同;
处理 Cookie 值时采用的安全措施
应该与处理网页中用户键入的数据时采用的安全措施相同。
本主题前面的示例演示在页面中显示值前,
先对 Cookie 内容进行 HTML 编码的方法,
这与在显示从用户处得到的任何信息之前的做法相同。

Cookie 以明文形式在浏览器和服务器间发送,
任何可以截获 Web 通信的人都可以读取 Cookie。
可以设置 Cookie 属性,
使 Cookie 只能在使用安全套接字层 (SSL) 的连接上传输。
SSL 并不能防止保存在用户计算机上的 Cookie 被读取或操作,
但可防止 Cookie 在传输过程中被读取,
因为 Cookie 已被加密。

6.设定IE浏览器是否接受Cookie

1).启动IE; 
2).在“工具”菜单上,单击“Internet选项”,打开“Internet选项”对话框; 
3).单击“隐私”选项卡,将滑块上移到更高的隐私级别。
   如果移动到最顶端则是选择“阻止所有的Cookie”,
   此时系统将阻止所有网站的Cookie,而且网站不能读取计算机上已有的Cookie; 
4).单击“确定”按钮。