几乎所有网站都使用验证码图像来保护其表单免受垃圾邮件的侵害。但这是最安全的方式吗?据我了解,CAPTCHA 的想法是用包含一些“难以识别”文本的图像来挑战用户,这样如果访问者是人类(而不是机器人),他/她将能够发布数据而不是机器。该网站发送验证码(图像)和一个会话变量,其中可能包含验证码图像的散列版本(正确答案但散列)。用户提交表单,服务器必须确保他/她输入的字母的散列 = 会话变量中包含的散列。好吧,如果我(垃圾邮件发送者)编写了一个模拟相同请求并将其发送到服务器的软件怎么办?换句话说,如果验证码是 abc123 并且哈希(在会话变量中,可以使用任何 HTTP 嗅探器读取)是 xyz345(考虑这是一个 32 个字符的字符串)并且我在发布请求中将此数据发送到服务器?然后我开始更有创意,我把这段代码放在一个 10,000 循环中,这将用垃圾邮件数据淹没服务器!现在验证码是否安全?他们有什么选择可以让我面对这样的威胁吗?谢谢
2 回答
您的假设是错误的:客户端既不能读取会话数据,也不能使用验证码来减轻 DOS 攻击。
Captcha 是一种挑战/响应技术,其中服务器向客户端发出一个只能由人类解决的挑战。大多数验证码存在的光学字符识别 (OCR) 挑战只是一种变体,但肯定是一个很好的变体,因为 OCR 对于大多数有文化的人来说更容易,但对计算机来说却是个问题。
但是,如果对挑战的响应很容易猜测、推导或以其他方式获得,那么任何验证码都是毫无价值的。在隐藏的表单字段中以普通形式或派生形式发送预期的响应就是这样一个例子。将响应作为参数传递给 Captcha 图像是另一个示例。
这就是为什么预期的响应应该保留在服务器端,作为会话数据,客户端不可读,因为只有会话的标识符被传输。
您的第二个担忧是验证码无法阻止 DOS 攻击,这是正确的。同样,这不是验证码应该解决的原因。验证码的发明是为了“区分计算机和人类”,仅此而已。它们只能帮助防止自动垃圾邮件成功。但坦率地说,强烈的挑战/响应生成很可能导致 DOS。
验证码不是防止窃取会话 cookie 的方法。如果您想要安全会话,请使用例如 HTTPS。
Captcha 不能防止 (D)DOS 攻击,如果您希望您的服务器能够抵御每秒 10.000 个垃圾邮件请求,请采取相应的对策。
验证码的唯一目的是确定请求是来自人还是机器。这将阻止创建帐户等的自动脚本,但您仍然必须通过其他方式保护您的网站,包括验证码的安全性。公开验证码答案或让用户决定要解决哪个验证码的服务器做错了。
理想的验证码对于每个人来说都是微不足道的,但对于每台机器来说都是不可能的。所以这对用户来说应该不是一个挑战。不幸的是,机器非常好,所以你必须提出挑战,这对我们来说也很困难。