今天 nw 应用里面的前端请求突然不发送了,也没有异常的信息,后来换上开发版 nw 立刻就发现了报错:
net::ERR_UNSAFE_PORT
这个错误的意思很明显,就是请求的 http 端口是不安全的(实际上之前我在开发其它项目的时候也遇到过几次,只是从来没有深入研究过它),因此浏览器将请求拒绝了。
那么问题来了,什么是不安全的端口?浏览器为什么要这么做?Google 了一通后发现,不安全的端口还有不少,如下:
1, // tcpmux 7, // echo 9, // discard 11, // systat 13, // daytime 15, // netstat 17, // qotd 19, // chargen 20, // ftp data 21, // ftp access 22, // ssh 23, // telnet 25, // smtp 37, // time 42, // name 43, // nicname 53, // domain 77, // priv-rjs 79, // finger 87, // ttylink 95, // supdup 101, // hostriame 102, // iso-tsap 103, // gppitnp 104, // acr-nema 109, // pop2 110, // pop3 111, // sunrpc 113, // auth 115, // sftp 117, // uucp-path 119, // nntp 123, // NTP 135, // loc-srv /epmap 139, // netbios 143, // imap2 179, // BGP 389, // ldap 427, // SLP (Also used by Apple Filing Protocol) 465, // smtp+ssl 512, // print / exec 513, // login 514, // shell 515, // printer 526, // tempo 530, // courier 531, // chat 532, // netnews 540, // uucp 548, // AFP (Apple Filing Protocol) 556, // remotefs 563, // nntp+ssl 587, // stmp? 601, // ?? 636, // ldap+ssl 993, // ldap+ssl 995, // pop3+ssl 2049, // nfs 3659, // apple-sasl / PasswordServer 4045, // lockd 6000, // X11 6665, // Alternate IRC [Apple addition] 6666, // Alternate IRC [Apple addition] 6667, // Standard IRC [Apple addition] 6668, // Alternate IRC [Apple addition] 6669, // Alternate IRC [Apple addition] 6697, // IRC + TLS
不安全的理由不是为了保护浏览器,而是为了保护这些不安全端口上运行的服务,James Roper 的 blog 指出,因为 http 协议的格式与上述服务协议数据不同,所以正常的 http 请求当然不会做出损害上述服务的行为,但是假如我们是上传文件,恰好文件内容是一条条这些服务能识别的数据,那么这些服务就收到了不可预料的命令,而这不是我们希望的,而黑客就能利用上传来攻击这些服务。
由于我的应用后端端口是随机的,所以难免会触发特殊端口,而浏览器的特殊端口保护机制的确是有道理的,那么该如何处理呢?幸运的是浏览器提供了一个可以明确指定允许的端口列表的选项,如下,使用英文逗号分隔端口号:
--explicitly-allowed-ports=101,102
对于 nw 来说,只需要在 package.json 里面添加这个选项:
{ "name": "myapp", "main": "index.html", "chromium-args": "--args --explicitly-allowed-ports=101,102,103" }
应用里面的前端请求就又可以正常发送了。