你的联系表单是一扇门:怎么给它上锁
联系表单和订单表单会接收任何人输入的文字,机器人也不例外。垃圾信息、代码注入、文件上传、验证码和蜜罐,以及谁能看到用户提交的内容。
表单是网站上唯一一个任何人都可以随意输入内容、网站又必须接收的地方。通常,输入的是想问价格或日期的客户。有时是一个机器人,整天在一个又一个网站上填表。还有时是某个人,在试探这个表单会不声不响地吞下什么。
所以联系表单、订单表单和预约表单,是攻击者最先看的地方之一。下面讲有哪些风险,怎么识别,以及该向负责你网站的人问什么。
垃圾信息泛滥,不只是收件箱乱
最常见的问题,乍看也最不危险。机器人通过你的表单发来几百条满是广告和链接的消息。收件箱被塞满,客户的真实咨询淹没在中间。
如果表单会向填写的任意地址发送确认邮件,或者发一份消息副本,情况就更糟。机器人会填上陌生人的邮箱,你的服务器就以你的域名给他们发邮件。这会很快损害域名的信誉:邮件服务商开始把它当作垃圾邮件的来源,你真正的邮件,包括发票,会进入客户的垃圾箱。主机商也可能封禁整个账户的发信功能。
如果你的表单有“给我发一份副本”这个选项,想想你是否真的需要它。
三种攻击,每种一句话
这些名字听起来吓人,原理却很简单。它们都是因为表单信任了别人输入的内容才得逞。
**邮件头注入:**有人在邮箱或主题字段里输入换行和额外的地址,写得不好的表单就会从你的服务器向他们指定的任意地址发邮件。
**SQL 注入:**有人在字段里输入一段数据库命令,把文字原样传给数据库的表单就会执行它,这可能泄露或改动库里存的数据。
**跨站脚本(XSS):**有人输入的不是姓名而是一段脚本,当你在后台打开这条提交记录时,脚本会在你的浏览器里,以你的管理员权限运行。
这三种攻击,都靠你的开发者来防:输入的内容在进入邮件或数据库之前要先检查和过滤,在后台显示时也要保证它无法运行。流行且保持更新的插件默认就这样做。更大的风险是几年前手写的表单,之后没有人再看过。所以直接问清楚:你的表单是来自某个插件,还是从零写的?如果是从零写的,谁在什么时候审查过?
客户上传的文件
许多表单允许附加文件:简历、受损部位的照片、扫描件、报价用的图纸。这很方便,也是表单里风险最大的部分。
最大的危险是伪装成图片、实际是程序的文件,比如叫 invoice.jpg.php 的文件。如果服务器接收它并允许它运行,攻击者就控制了网站。所以请开发者确认:
- 表单只接收特定的文件类型,例如 PDF、JPG 和 PNG,并且检查文件内容,而不只是看文件名结尾,
- 有文件大小限制,
- 上传的文件放在服务器不执行任何程序的文件夹里,最好在网站的公开部分之外,
- 保存下来的文件会被改成新的随机名称。
你这边要做的是打开文件时小心。一打开就要求启用宏的 Word 文档,是感染电脑的经典手段。还要记住,发给诊所的简历和照片属于个人数据,有时是敏感数据,所以不要保存得比需要的时间更久。
验证码、蜜罐和频率限制
对付机器人有三种办法,配合使用效果最好。
蜜罐是表单里多出来的一个人看不见的字段。机器人会把每个字段都填上,所以只要这个字段里有内容,表单就悄悄丢弃这条消息。客户毫无察觉,最简单的机器人就被挡住了。
验证码用来区分人和机器人。较新的,比如 Google reCAPTCHA v3、Cloudflare Turnstile 或 hCaptcha,大多在后台工作,不需要重新输入字母,也不用点红绿灯的图片。要注意,它们会把访问者的信息传给另一家公司,所以你的隐私政策里应当写明。
频率限制是限制同一个地址在短时间内能发多少条消息。真正的客户几乎不会注意到它,但它能挡住垃圾信息的洪水和对表单的自动化测试。它在服务器上设置,或者在 Cloudflare 这样的防火墙服务里设置。
起步阶段,蜜罐加频率限制通常就够了。如果垃圾信息仍然漏进来,再加验证码。
提交的内容去了哪里,谁能看到
表单的消息可能最终落在两个地方:邮箱和网站的数据库。有些插件只发邮件。另一些还会把每次提交保存在后台,通常在名为“Entries”或“Submissions”之类的菜单下。登录看看你的是哪一种。
然后自己回答几个问题:
- 谁能访问接收这些消息的邮箱?有人离职前是否把它转发到了个人 Gmail?
- 谁在后台有管理员账户?他们每个人都能读到所有保存的提交。
- 提交的内容保存多久?有些插件可以自动删除较旧的记录。
- 带表单的页面是否运行在 HTTPS 上,有没有那把小锁?
每一条带有姓名、邮箱和电话的提交,都是你要负责的个人数据。关于这在通用数据保护条例(GDPR)下意味着什么,见关于 GDPR 与网站安全的文章。
保持插件更新,三个换成一个
表单插件是安装量最大的插件之一,所以攻击者对它们盯得很紧。它们的安全漏洞会被定期发现和修补,因此表单插件的更新不应该在队列里放上几周。
顺便数一数你装了几个表单插件。有时会发现是三个:一个来自网站的第一版,一个来自改版,还有一个是真正在用的。把不用的删掉,而不是只停用,因为它们的文件仍然在服务器上。
还有一个不花钱的习惯:每月通过自己的表单发一条测试消息。表单可能毫无征兆地失效,这时客户以为你在无视他,而你连他写过信都不知道。