内网穿透中的安全盲区
很多人用内网穿透是为了让家里的设备能被外网访问,比如远程看监控、操作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, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/\"/g, '"');
}
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或管理员权限运行。万一被突破,攻击者拿到的也只是个低权限账户,翻不了天。
安全不是一劳永逸的事。每次新增一个穿透规则,都该问一句:这个服务能不能被滥用?别人拿到它能干啥?提前想清楚,比事后救火强得多。