简单实现图片验证码

近年来有很多网站抛弃了字符验证码,采用了图片验证的方式。新浪博客的评论区域,一些直播平台都是这样。

查询他们的验证码区域代码,很容易发现这个的关键字:geetest 。后来了解到,这些都是采用一家名为极验验证的公司解决方案。这是极验验证的官网:http://www.geetest.com/

极验验证提供了好多套餐,以收费的方式解决验证的问题。想着自己实现个差不多的功能的。

最简单的情况:一个动态页面完成整个过程,后台语言产生随机数,存在session中;Js中获取,利用canvas的对图片进行截取,拖动的时候判断。

效果:

贴出代码:注意,这是个php文件,要在服务器环境运行。注意图片的路径。

 1 <!doctype html>
 2 <?php
 3 ini_set("session.cookie_domain",'localhost');
 4 session_start();
 5 // store session data
 6 $i=rand(8,30)/10;
 7 $_SESSION['x']=$i;
 8 ?>
 9 <html>
10 <head>
11 <meta charset="utf-8">
12 <title>无标题文档</title>
13 <style>
14 body{text-align:center;}
15 #canvas{diaplay:block;margin:0 auto;border:1px #00FF00 solid;}
16 input{display:block;margin:20px auto;width:300px;}
17 </style>
18 </head>
19 <body>
20 <?php
21 //retrieve session data
22 echo "x=". $_SESSION['x']
23 ?>
24 <div>
25     <canvas id="canvas">你的浏览器不支持canvas </canvas>
26     <input type="range" id="scale-range" min="0.0" max="3.0" step="0.1" value="0.0">
27     <div id="div1"></div>
28 </div>
29 
30 <script>
31     var session=<?php echo $_SESSION['x']?>;//这么写对的
32     var canvas=document.getElementById('canvas');
33     var context=canvas.getContext("2d");
34     var image=new Image();
35     var slider=document.getElementById("scale-range");
36     var div1 = document.getElementById('div1');
37     window.οnlοad=function(){
38         canvas.width=400;
39         canvas.height=200;
40         var scale=slider.value;
41         image.src="images/lyf.jpg";
42         image.οnlοad=function(){
43             //context.drawImage(image,0,0,canvas.width,canvas.height);
44             
45             getRect(image,session,scale);
46             clearRect(image,session);
47             
48             slider.οnmοusemοve=function(){
49                 
50                 
51                 getRect(image,session,scale);
52                 clearRect(image,session);
53                 
54                 scale=slider.value;
55                 div1.innerHTML=scale;
56                 if(scale==session)
57                 {    
58                     clearRect(image,session);
59                     getRect(image,session,scale);
60                     div1.innerHTML="<strong>恭喜你验证通过!!!!!!!!</strong>";
61                     slider.onmousemove = null;
62                     slider.disabled = true;
63                     }
64             }
65         }
66     }
67     function getRect(image,session,scale){
68          context.drawImage(image,0,0,canvas.width,canvas.height);
69          context.drawImage(image,session*100,canvas.height/2,80,80,scale*100,canvas.height/2,80,80)
70     }
71 
72     
73     function clearRect(image,session){
74         //context.drawImage(image,0,0,canvas.width,canvas.height);
75         context.clearRect(session*100,canvas.height/2,80,80);
76         
77     }
78 </script>
79 </body>
80 </html>

   这么做其实是有问题的,因为别人可以通过工具获取session里的值,然后不管如何随机生成,都能知道这个值。所以,图片的生成应该放在后台实现,而不是用canvas。而图片又可以有很多张,供我们从中挑选。这样才是一个完整的图片验证,才能防止机器提交

转载于:https://www.cnblogs.com/xiaochongchong/p/5408085.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Vue 中实现图片验证码的过程与普通的实现方式类似,需要后端生成验证码图片并返回给前端,前端将图片显示在页面上并在提交时将用户输入的验证码与后端生成的验证码进行比对。 以下是一个简单实现过程: 1. 后端生成验证码图片并返回给前端,可以使用第三方库如`captcha`或自行编写生成函数。 2. 前端使用`<img>`标签显示验证码图片。可以使用`src`属性将后端返回的验证码图片地址设置为`<img>`标签的`src`属性值,也可以将图片的二进制数据作为 URL 数据(data URI)嵌入`<img>`标签的`src`属性中。 3. 用户输入验证码,将用户输入的验证码与后端生成的验证码进行比对。 下面是一个示例代码: ```html <template> <div> <img :src="captchaUrl" alt="验证码"> <input v-model="captchaInput" type="text" placeholder="请输入验证码"> <button @click="submit">提交</button> </div> </template> <script> export default { data() { return { captchaUrl: '', // 验证码图片地址 captchaInput: '', // 用户输入的验证码 } }, mounted() { this.refreshCaptcha() }, methods: { // 刷新验证码 refreshCaptcha() { this.captchaUrl = `/api/captcha?_=${Date.now()}` }, // 提交表单 submit() { // 将用户输入的验证码与后端生成的验证码进行比对 // 如果验证码正确,则提交表单 }, }, } </script> ``` 在上面的示例代码中,`captchaUrl`是图片的地址,`captchaInput`是用户输入的验证码。`refreshCaptcha`方法用于刷新验证码,`submit`方法用于提交表单时验证验证码是否正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值