java - Implementierungsprinzip des Bildverifizierungscodes
怪我咯
怪我咯 2017-05-27 17:41:18
0
4
1006

**Testwebsite:
http://con.monyun.cn:9960/acc...

Auf dieser Seite befindet sich ein Bestätigungscode. Die URL dieses Bestätigungscodes lautet

<img src="../aut_checkCode.hts?=0.8963835985936632" class="icd">

Wie ändere ich das angezeigte Bild, wenn ich auf den Bestätigungscode klicke? ?

Anleitung:
(1) Wenn Sie auf das Bestätigungscode-Bild klicken, ändert sich die Nummer hinter dem src-Attribut des img-Tags. Sobald sich die Nummer ändert, greift der Browser auf eine neue URL zu, um Daten abzurufen

(2) Die Abfragezeichenfolge in der neuen URL enthält nur einen Wert, aber keinen Namen. Bedeutet das, dass die Serverseite diesen numerischen Wert nicht erhalten kann?
0,8963835985936632

Gibt es eine Möglichkeit, diesen numerischen Wert serverseitig abzurufen? ?

(3) Wenn es keine Möglichkeit gibt, den digitalen Wert zu erhalten. Die Serverseite verarbeitet die Anfrage und gibt binäre Bilddaten zurück.
Wird zu diesem Zeitpunkt ein Token für das Bild generiert? Wenn es generiert wird, wie wird es dann an den Client übergeben?

(4) Der Benutzer übermittelt den Bestätigungscode. Serverseitige Verarbeitung. Wie kann also überprüft werden, ob der vom Benutzer übermittelte Bestätigungscode korrekt ist?
Wie kann der Server den richtigen Bestätigungscode von Redis erhalten?

Alle sagen es mir bitte
Bitte gebt mir einen Daumen nach oben, wenn ihr antwortet! **

怪我咯
怪我咯

走同样的路,发现不同的人生

Antworte allen(4)
Ty80

谢邀, 一般来说, 验证码的工作步骤是这样的:

  1. 实际上是服务器生成了一个4位字符串, 用这4位字符串生成图片写到response中, 返回给浏览器, 并把这个4位字符串存在了当前session中.

  2. 浏览器提交后, 用提交的字符串和session中的字符串进行对比, 完成验证码的校验.

如果不用session比如可以设置到cookie中如下(key=test, value=test):

淡淡烟草味

1.后面数字更改是避免浏览器缓存问题、
2.不用使用任何参数,服务端会自动去按照时间锉什么的生成一个验证码(想看服务端是否能获取)

3.验证码原理就是生成一串随机数先存入session,最后生成images传给客户端给你识别,用户提交验证码答案,服务端对你得答案和session当中的随机数进行对比,一样就说明验证成功

4.如3

5.redis配合使用一般都会用到token或者session之内的,这样可以标识这个验证码到底是哪一个用户的,比如如下key

>keys *
>uid_100_login_verify

伪代码

获取验证码

User u=User();
u.tmp_id=100;//唯一标识,传给客户端表单
Random rand=new Random(种子);
int v=rand.rand();//一般会生成其他得英文字母配合生成复杂的
redisCli.add("uid_100_login_verify",random)//key,value
res.return(new Verify());

验证

User u=User();
u.tmp_id=$POST['tmp_id'];//获取客户端
string value=redisCli.get("uid_100_login_verify");//key return value
if($POST['verify_code']===value){
  return "验证成功";
}
为情所困

第一个:验证码的大致流程就是和你描述的一样的。

第二个:
生成验证码是不用往后台传值的,
你给的例子,后面的那串数字的改变其实是为了实现重新请求 URL 而已,
一般是图片链接指向生成验证码的链接,点击后使用 js 来给连接进行改变,就是后面加一串随机数,这样浏览器检测到 src 后面的连接改变了(那串随机字符串就是这个作用),然后就会重新请求后台,获取重新生成的验证码图片。

第三个:
后台返回二进制图片后,不需要生成 token ,但是需要把生成验证码的那串数字存到 session 里。要保存在服务器端,才安全,不需要返回到客户端。

第四个:
用户输入提交的验证码后,就把用户提交的验证码数字,和服务端 session 里的数字进行对比。 如果一样的话,就验证通过。

至于最后把验证码放到redis里,你可以去搜索一下,如何把 session 存到 redis 里,相关的资料。

Ty80

后台代码大体上是

public void genAuthImage(){

//生成token uuid
//写入cookie
response.addCookie();--->实际上是设置set-cookie头信息

//生成图片使用response写出
end
}
前端:

前端:

chrome 检查

控制台

不确定的结论: response返回响应类型为image/jpg的时候 无法设置cookie。
原因各位有看到的朋友可以解释下吗

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!