内网穿透场景下如何防止恶意脚本执行

内网穿透中的安全盲区

很多人用内网穿透是为了让家里的设备能被外网访问,比如远程看监控、操作NAS或者调试本地开发的网站。但一旦暴露了端口,就等于在墙上开了扇门,谁都能试着推一推。尤其是那些带Web界面的服务,最容易成为恶意脚本攻击的目标。

曾经有个朋友把自建的相册系统通过内网穿透共享给家人,结果没几天服务器就被植入挖矿程序。查了一圈才发现,是有人通过URL注入了JavaScript脚本,在页面加载时偷偷运行命令。

过滤输入,别让脚本有可乘之机

最常见的攻击方式就是往请求里塞脚本代码。比如访问 http://xxx.example.com/search?q=<script>alert(1)</script>,如果系统直接把q参数原样输出到页面上,那这段脚本就会被执行

解决办法是在服务端对所有用户输入做转义处理。比如在Node.js中可以这样处理:

<script>
function escapeHtml(text) {
  return text
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/\"/g, '&quot;');
}

const userInput = req.query.q;
res.send(`<div>搜索结果:${escapeHtml(userInput)}</div>`);
</script>

启用内容安全策略(CSP)

就算不小心放过了某些脚本,也可以通过CSP来阻止它们运行。CSP是一个HTTP响应头,能告诉浏览器哪些资源可以加载。

比如加上这行头,就能禁止页面执行任何内联脚本:

Content-Security-Policy: default-src 'self'; script-src 'self'; object-src none

这样一来,即使有人注入了 <script> 标签,浏览器也会直接拦截。

限制穿透端口的访问范围

很多内网穿透工具支持配置访问白名单。比如只允许特定IP段访问管理后台,普通服务则开放给所有人。这样即使接口存在漏洞,攻击者也难以直接触达敏感页面。

另外,尽量避免把SSH、数据库这类高危服务直接暴露出去。可以用反向代理加身份验证的方式多套一层保护。

定期更新和最小化权限

运行在内网穿透背后的服务,要保持及时更新。老旧版本的Web框架可能自带XSS漏洞,哪怕你代码写得再小心也没用。

同时,服务进程不要用root或管理员权限运行。万一被突破,攻击者拿到的也只是个低权限账户,翻不了天。

安全不是一劳永逸的事。每次新增一个穿透规则,都该问一句:这个服务能不能被滥用?别人拿到它能干啥?提前想清楚,比事后救火强得多。