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

eval真的不安全吗?黑客能否利用它攻击服务器?有何修复与替代方案?

Is eval Really Unsafe? Risks and Fixes for Your sleep Function

咱们直接说结论:eval确实极度不安全,尤其是在你的sleep函数这种直接执行用户传入字符串的场景下,很容易被黑客利用发起攻击。

Why eval Is Dangerous Here

你的sleep函数把action参数(不管是单个字符串还是数组里的每个元素)直接丢给eval执行——这等于把系统的执行权限完全交给了输入内容。如果action的来源是用户输入、URL参数、或者未经过严格校验的后端响应,黑客只需要传入恶意代码字符串就能搞破坏:

  • 在浏览器环境里,他们可以窃取用户的Cookie、篡改页面内容,甚至发起钓鱼攻击;
  • 如果是Node.js环境,更可怕——比如传入"require('child_process').exec('rm -rf /')",直接就能删除服务器上的文件,或者执行任何系统命令。

说白了,eval的问题在于它模糊了「数据」和「代码」的边界:正常情况下字符串是数据,但eval会把它当成可执行代码来运行,一旦输入不可信,就等于给攻击者开了后门。

Fixes and Alternatives

1. Replace eval with Function References (Best Practice)

最安全的做法是彻底抛弃传递代码字符串的思路,改成传递函数或者函数数组。这样你执行的是预先定义好的逻辑,而不是任意字符串。重构你的sleep函数:

function sleep(s, action) { 
    setTimeout(() => {
        if (action) {
            if (Array.isArray(action)) {
                // 遍历数组,只执行函数类型的元素
                action.forEach(item => {
                    if (typeof item === 'function') {
                        item();
                    }
                });
            } else if (typeof action === 'function') {
                action();
            }
        }
        // 原代码里的return true在setTimeout里无效,因为异步操作
        // 如果需要返回结果,可以改用Promise
    }, s); 
}

// 使用示例
sleep(1000, [
    () => alert('ok in alert'), 
    () => console.log('ok in console')
]);
sleep(1000, () => console.log('one single line of code'));
sleep(1000); // 只是等待1秒,无额外操作

2. Use Promises + Async/Await (Modern Approach)

现代JavaScript里,用Promise实现睡眠逻辑更优雅,而且完全不需要eval:

function sleep(s) {
    return new Promise(resolve => setTimeout(resolve, s));
}

// 使用示例(需要在async函数里调用)
async function runTasks() {
    await sleep(1000);
    alert('ok in alert');
    console.log('ok in console');

    await sleep(1000);
    console.log('one single line of code');

    await sleep(1000);
    console.log('All tasks done!');
}

runTasks();

这种方式逻辑更清晰,也从根源上避免了eval带来的安全风险。

3. Strict Input Validation (Last Resort)

如果因为某些原因必须处理字符串形式的逻辑(强烈不推荐),你需要做极端严格的白名单校验:

  • 只允许指定的函数调用(比如仅允许alert、console.log);
  • 解析字符串,检查是否包含危险关键字(比如eval、require、document.cookie、exec等);
  • 用沙箱环境隔离执行(比如浏览器里的iframe沙箱,Node.js里的vm模块)。

但这种方法很容易有遗漏,黑客总能找到绕过校验的方式,所以只作为万不得已的备选。

Key Takeaway

eval的不安全本质是它信任所有输入内容,把字符串当成代码执行。修复这类问题的核心思路就是永远不要让不可信的输入直接变成可执行代码,用函数引用、Promise等安全的方式替代字符串执行逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:47:45