You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript不使用eval()将Cookie中的文章ID字符串转为数组

如何安全地将Cookie中的字符串转为数组,以及为什么要避开eval()

嘿,你的问题提得很到位!先明确说:完全正确,绝对不能用eval()来处理这种来自Cookie的字符串,后面我会解释原因,再给你几个安全可靠的解决方案。

为什么要避开eval()?

Cookie是客户端可以随意篡改的内容,如果攻击者把Cookie里的字符串改成包含恶意JavaScript代码的内容,eval()会直接执行这段代码,这就相当于给了攻击者在你的页面上执行任意代码的权限,妥妥的XSS攻击风险,绝对要避开。

安全的转换方法

根据你给出的字符串格式("['test','b','c']"),这里有几种靠谱的方法:

方法1:手动拆分解析(适合固定格式)

既然你的字符串格式是固定的单引号数组,我们可以手动处理:

// 假设从Cookie拿到的字符串是这个
const cookieStr = "['test','b','c']";

// 步骤:去掉首尾的[] → 按逗号分割 → 清理每个元素的单引号和空格
const visitedIds = cookieStr
  .slice(1, -1) // 切掉开头的[和结尾的]
  .split(',') // 把字符串拆成小片段
  .map(item => item.trim().replace(/^'|'$/g, '')); // 去掉每个片段的单引号和前后空格

console.log(visitedIds); // 结果:['test', 'b', 'c']

这种方法完全不会执行任何未知代码,安全性拉满,适合格式固定的场景。

方法2:转成JSON格式解析

JSON的标准格式是用双引号包裹字符串,所以我们把原字符串里的单引号换成双引号,再用JSON.parse()解析就行:

const cookieStr = "['test','b','c']";
// 把单引号替换成双引号,变成合法的JSON数组字符串
const validJsonStr = cookieStr.replace(/'/g, '"');
const visitedIds = JSON.parse(validJsonStr);

console.log(visitedIds); // 结果:['test', 'b', 'c']

JSON.parse()只会解析合法的JSON数据,不会执行代码,比eval()安全太多,而且适用性更广。

方法3:从源头规范存储(最推荐)

其实最好的办法是在把数组写入Cookie的时候,就转成标准的JSON字符串,这样读取的时候直接解析就行,省得后续麻烦:

// 假设你要存储的已访问文章ID数组
const visitedIds = ['test', 'b', 'c'];
// 转成JSON字符串
const jsonStr = JSON.stringify(visitedIds);
// 写入Cookie,这里可以设置路径、过期时间等参数
document.cookie = `visitedArticles=${jsonStr}; path=/; max-age=2592000`; // 存30天

// 读取的时候直接解析
const cookieEntry = document.cookie
  .split('; ')
  .find(row => row.startsWith('visitedArticles='));
if (cookieEntry) {
  const storedIds = JSON.parse(cookieEntry.split('=')[1]);
  console.log(storedIds); // 得到原数组
}

这种方式从一开始就避免了格式混乱的问题,后续操作也更顺畅。

额外小提示

  • Cookie有大小限制(大概4KB),如果要存的文章ID太多,可能会超出限制,这时候可以考虑用localStorage,它的容量更大(约5MB)。
  • 每次添加新的文章ID时,记得先检查数组里有没有这个ID,避免重复存储,保证计数器的唯一性。

内容的提问来源于stack exchange,提问作者xai2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:32:06