HoRain云--ASP Cookies使用全攻略
HoRain云小助手个人主页 个人专栏: 《Linux 系列教程》《c语言教程》⛺️生活的理想就是为了理想的生活!⛳️ 推荐前些天发现了一个超棒的服务器购买网站性价比超高大内存超划算忍不住分享一下给大家。点击跳转到网站。专栏介绍专栏名称专栏介绍《C语言》本专栏主要撰写C干货内容和编程技巧让大家从底层了解C把更多的知识由抽象到简单通俗易懂。《网络协议》本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘一起解密网络协议在运行中协议的基本运行机制《docker容器精解篇》全面深入解析 docker 容器从基础到进阶涵盖原理、操作、实践案例助您精通 docker。《linux系列》本专栏主要撰写Linux干货内容从基础到进阶知识由抽象到简单通俗易懂帮你从新手小白到扫地僧。《python 系列》本专栏着重撰写Python相关的干货内容与编程技巧助力大家从底层去认识Python将更多复杂的知识由抽象转化为简单易懂的内容。《试题库》本专栏主要是发布一些考试和练习题库涵盖软考、HCIE、HRCE、CCNA等目录⛳️ 推荐专栏介绍ASP Cookies 详解基本概念Cookie 的工作原理Cookie 的限制创建和设置 Cookie基本 Cookie带有多个值的 CookieCookie 字典设置过期时间读取 Cookie读取单个 Cookie读取多值 Cookie遍历所有 Cookie删除 Cookie删除单个 Cookie删除多值 Cookie 的特定值实际应用示例示例 1记住登录状态示例 2记录用户偏好示例 3购物车Cookie 与 Session 的区别Cookie 安全最佳实践1. 敏感信息不要存储在 Cookie 中2. 使用 HttpOnly 和 Secure 标记3. 验证 Cookie 数据4. 签名 Cookie常见问题解决1. Cookie 不保存2. 中文 Cookie 乱码3. 跨子域共享 Cookie性能优化建议1. 减少 Cookie 大小2. 按需设置 Cookie替代方案考虑何时不使用 CookieURL 重写无 Cookie 方案ASP Cookies 详解Cookies 是存储在用户计算机上的小型文本文件用于在客户端保存会话信息。ASP 通过Response和Request对象的Cookies集合来操作 Cookies。基本概念Cookie 的工作原理服务器通过 HTTP 响应头Set-Cookie发送 Cookie 到客户端客户端浏览器保存 Cookie后续请求中浏览器通过 HTTP 请求头Cookie将 Cookie 发送回服务器Cookie 的限制每个 Cookie 最大 4KB每个域名最多 20 个 Cookie可能因浏览器而异总 Cookie 数有限制通常 300 个存储在客户端可能被用户禁用或清除创建和设置 Cookie基本 Cookie% 设置一个简单的 Cookie Response.Cookies(username) 张三 Response.Cookies(username).Expires Date() 30 30天后过期 % 或者使用更详细的设置 % Response.Cookies(user) 李四 Response.Cookies(user).Expires DateAdd(d, 30, Date()) 30天后 Response.Cookies(user).Path / 对整个站点有效 Response.Cookies(user).Domain example.com 对整个域有效 Response.Cookies(user).Secure False 是否仅通过 HTTPS 传输 Response.Cookies(user).HttpOnly True 防止 JavaScript 访问XSS 防护 %带有多个值的 CookieCookie 字典% 创建多值 Cookie Response.Cookies(userinfo)(name) 王五 Response.Cookies(userinfo)(age) 25 Response.Cookies(userinfo)(email) wangwuexample.com Response.Cookies(userinfo).Expires DateAdd(m, 1, Date()) 一个月后过期 %设置过期时间% 立即过期删除 Cookie Response.Cookies(temp).Expires Date() - 1 会话 Cookie浏览器关闭时删除 Response.Cookies(sessionCookie) 会话数据 不设置 Expires 属性即为会话 Cookie 设置具体过期时间 Response.Cookies(permanent).Expires DateAdd(yyyy, 1, Date()) 1年后 Response.Cookies(weekly).Expires DateAdd(d, 7, Date()) 7天后 Response.Cookies(daily).Expires DateAdd(h, 24, Now()) 24小时后 %读取 Cookie读取单个 Cookie% 读取 Cookie Dim userName userName Request.Cookies(username) If userName Then Response.Write(欢迎回来 userName) Else Response.Write(新用户请先登录) End If %读取多值 Cookie% 检查 Cookie 是否存在 If Request.Cookies(userinfo) Then Dim name, age, email name Request.Cookies(userinfo)(name) age Request.Cookies(userinfo)(age) email Request.Cookies(userinfo)(email) Response.Write(用户名 name br) Response.Write(年龄 age br) Response.Write(邮箱 email) Else Response.Write(用户信息不存在) End If %遍历所有 Cookie% Response.Write(h3所有 Cookie/h3) Response.Write(table border1) Response.Write(trthCookie 名称/thth值/th/tr) For Each cookie In Request.Cookies If Request.Cookies(cookie).HasKeys Then 多值 Cookie Response.Write(tr) Response.Write(td cookie /td) Response.Write(td) For Each key In Request.Cookies(cookie) Response.Write(key Request.Cookies(cookie)(key) ; ) Next Response.Write(/td) Response.Write(/tr) Else 单值 Cookie Response.Write(tr) Response.Write(td cookie /td) Response.Write(td Request.Cookies(cookie) /td) Response.Write(/tr) End If Next Response.Write(/table) %删除 Cookie删除单个 Cookie% 删除 Cookie 的方法是设置过期时间为过去的时间 Response.Cookies(username).Expires Date() - 1 Response.Write(Cookie 已删除) %删除多值 Cookie 的特定值% 要删除多值 Cookie 中的特定值需要重新设置整个 Cookie Response.Cookies(userinfo)(email) Response.Cookies(userinfo).Expires Date() - 1 %实际应用示例示例 1记住登录状态% login.asp - 登录页面 Dim username, password, remember username Request.Form(username) password Request.Form(password) remember Request.Form(remember) 验证用户名和密码这里简化为示例 If username admin And password 123456 Then Session(username) username 如果用户选择了记住我 If remember on Then Response.Cookies(username) username Response.Cookies(username).Expires DateAdd(d, 30, Date()) 记住30天 Else 创建会话 Cookie Response.Cookies(username) username 不设置 Expires浏览器关闭时删除 End If Response.Redirect welcome.asp Else Response.Write(用户名或密码错误) End If % welcome.asp - 欢迎页面 % 检查会话 If Session(username) Then Response.Write(欢迎 Session(username) ) Else 检查 Cookie Dim savedUser savedUser Request.Cookies(username) If savedUser Then 自动登录 Session(username) savedUser Response.Write(欢迎回来 savedUser ) Else Response.Redirect login.asp End If End If %示例 2记录用户偏好% preferences.asp - 用户偏好设置 Dim theme, language, fontSize theme Request.Form(theme) language Request.Form(language) fontSize Request.Form(fontSize) If theme Then 保存用户偏好到 Cookie Response.Cookies(prefs)(theme) theme Response.Cookies(prefs)(language) language Response.Cookies(prefs)(fontSize) fontSize Response.Cookies(prefs).Expires DateAdd(m, 6, Date()) 6个月后过期 Response.Write(偏好设置已保存) End If % % 应用用户偏好 Dim userTheme, userLanguage, userFontSize 尝试从 Cookie 读取偏好 userTheme Request.Cookies(prefs)(theme) userLanguage Request.Cookies(prefs)(language) userFontSize Request.Cookies(prefs)(fontSize) 设置默认值 If userTheme Then userTheme light If userLanguage Then userLanguage zh-CN If userFontSize Then userFontSize medium % html head style .% userTheme % { background-color: % If userTheme dark Then #333 Else #fff %; color: % If userTheme dark Then #fff Else #000 %; } body { font-size: % userFontSize %; } /style /head body class% userTheme % h1用户偏好示例/h1 p当前主题% userTheme %/p p语言% userLanguage %/p p字体大小% userFontSize %/p form methodpost actionpreferences.asp 主题 select nametheme option valuelight % If userTheme light Then selected Else %浅色/option option valuedark % If userTheme dark Then selected Else %深色/option /selectbr 语言 select namelanguage option valuezh-CN % If userLanguage zh-CN Then selected Else %简体中文/option option valueen-US % If userLanguage en-US Then selected Else %English/option /selectbr 字体大小 select namefontSize option valuesmall % If userFontSize small Then selected Else %小/option option valuemedium % If userFontSize medium Then selected Else %中/option option valuelarge % If userFontSize large Then selected Else %大/option /selectbr input typesubmit value保存设置 /form /body /html示例 3购物车% 购物车 Cookie 操作 Dim productId, quantity, cartItems, items, i, itemArray productId Request.QueryString(productId) quantity Request.QueryString(quantity) action Request.QueryString(action) 初始化购物车 If Request.Cookies(cart) Then cartItems Else cartItems Request.Cookies(cart) End If Select Case action Case add 添加商品到购物车 cartItems cartItems productId : quantity ; Response.Cookies(cart) cartItems Response.Cookies(cart).Expires DateAdd(d, 7, Date()) Case update 更新购物车 实现更新逻辑... Case remove 从购物车移除商品 items Split(cartItems, ;) cartItems For i 0 To UBound(items) - 1 itemArray Split(items(i), :) If itemArray(0) productId Then cartItems cartItems items(i) ; End If Next Response.Cookies(cart) cartItems Case clear 清空购物车 Response.Cookies(cart) Response.Cookies(cart).Expires Date() - 1 End Select 显示购物车 If cartItems Then items Split(cartItems, ;) Response.Write(h3购物车内容/h3) Response.Write(ul) For i 0 To UBound(items) - 1 If items(i) Then itemArray Split(items(i), :) Response.Write(li商品ID itemArray(0) 数量 itemArray(1) /li) End If Next Response.Write(/ul) Else Response.Write(p购物车为空/p) End If %Cookie 与 Session 的区别特性CookieSession存储位置客户端服务器端存储类型文本对象可存储复杂数据安全性较低可被用户查看修改较高存储在服务器容量限制4KB/个20个/域名无硬性限制受服务器内存限制生命周期可设置过期时间默认20分钟可配置跨域访问受同源策略限制不适用性能影响每次请求都携带占用服务器资源Cookie 安全最佳实践1. 敏感信息不要存储在 Cookie 中% 错误做法 - 存储密码 Response.Cookies(password) userPassword ❌ 非常危险 正确做法 - 存储会话标识 Response.Cookies(sessionID) Session.SessionID Response.Cookies(sessionID).HttpOnly True Response.Cookies(sessionID).Secure True 如果使用 HTTPS %2. 使用 HttpOnly 和 Secure 标记% Response.Cookies(auth) authToken Response.Cookies(auth).HttpOnly True 防止 XSS 攻击 Response.Cookies(auth).Secure True 仅通过 HTTPS 传输 Response.Cookies(auth).Expires DateAdd(h, 1, Now()) 设置合理过期时间 %3. 验证 Cookie 数据% 从 Cookie 读取数据时要验证 Dim userData userData Request.Cookies(userData) If Not IsEmpty(userData) Then 验证数据格式 If IsNumeric(userData) Then 数值型数据 If userData 0 And userData 100 Then 在有效范围内 Else 数据异常使用默认值 userData 0 End If Else 非数值型数据清理特殊字符 userData Replace(userData, , ) userData Replace(userData, , lt;) userData Replace(userData, , gt;) End If End If %4. 签名 Cookie% 生成带签名的 Cookie Function CreateSignedCookie(name, value, secretKey) Dim timestamp, signature, data timestamp CStr(Now()) data value | timestamp signature GenerateHMAC(data, secretKey) 假设有这个函数 Response.Cookies(name) data | signature Response.Cookies(name).Expires DateAdd(d, 7, Date()) End Function Function VerifySignedCookie(name, secretKey) Dim cookieValue, parts, data, timestamp, signature cookieValue Request.Cookies(name) If cookieValue Then VerifySignedCookie Exit Function End If parts Split(cookieValue, |) If UBound(parts) 2 Then data parts(0) | parts(1) signature parts(2) If signature GenerateHMAC(data, secretKey) Then VerifySignedCookie parts(0) Else 签名验证失败 VerifySignedCookie End If Else VerifySignedCookie End If End Function %常见问题解决1. Cookie 不保存% 确保在输出任何内容之前设置 Cookie Response.Buffer True 启用缓冲 设置 Cookie Response.Cookies(test) value Response.Cookies(test).Expires DateAdd(d, 1, Date()) 然后输出其他内容 Response.Write(Cookie 已设置) %2. 中文 Cookie 乱码% 使用 Server.URLEncode 编码中文字符 Dim chineseName chineseName Server.URLEncode(张三) Response.Cookies(username) chineseName 读取时使用 Server.URLDecode Dim decodedName decodedName Server.URLDecode(Request.Cookies(username)) %3. 跨子域共享 Cookie% 设置为顶级域名 Response.Cookies(shared) value Response.Cookies(shared).Domain .example.com 注意前面的点 Response.Cookies(shared).Path / 这样可以在 www.example.com、app.example.com 等子域间共享 %性能优化建议1. 减少 Cookie 大小% 使用缩写 Response.Cookies(u) userID 而不是 userID Response.Cookies(t) theme 而不是 theme Response.Cookies(l) languageCode 而不是 language 使用编码减少大小 Function EncodeData(data) 自定义编码逻辑 EncodeData Replace(data, ,, |) End Function %2. 按需设置 Cookie% 只设置必要的 Cookie If userSelectedRememberMe Then Response.Cookies(remember) 1 Response.Cookies(remember).Expires DateAdd(d, 30, Date()) End If 使用不同的过期策略 Response.Cookies(session) sessionID 会话 Cookie Response.Cookies(prefs).Expires DateAdd(d, 365, Date()) 长期 Cookie Response.Cookies(temp).Expires DateAdd(h, 1, Now()) 短期 Cookie %替代方案考虑何时不使用 Cookie大量数据 - 使用 Session 或数据库敏感信息 - 使用 Session需要服务器端控制 - 使用 Session客户端禁用 Cookie 时 - 使用 URL 重写或其他技术URL 重写无 Cookie 方案% 将会话 ID 附加到 URL Function AddSessionToURL(url) Dim sessionID sessionID Session.SessionID If InStr(url, ?) 0 Then AddSessionToURL url sessionid sessionID Else AddSessionToURL url ?sessionid sessionID End If End Function % a href% AddSessionToURL(page.asp) %下一页/aASP Cookies 是维持状态的重要工具但要合理使用。对于敏感信息优先考虑使用 Session对于长期存储考虑使用数据库。正确使用 Cookie 可以提升用户体验但不当使用可能导致安全风险。❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧