如何创建简单的javascript / jquery客户端验证码?

时间:2010-07-07 15:34:54

标签: javascript jquery

如何创建简单的javascript / jquery客户端验证码?

11 个答案:

答案 0 :(得分:9)

为什么不使用reCAPTCHA?它是免费的,非常有效的,并提供可访问性功能。

答案 1 :(得分:6)

可以使用HTML和简单的JavaScript代码完成。看看这个:



 function Captcha(){
     var alpha = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
	 	'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 
 	    	'0','1','2','3','4','5','6','7','8','9');
     var i;
     for (i=0;i<6;i++){
         var a = alpha[Math.floor(Math.random() * alpha.length)];
         var b = alpha[Math.floor(Math.random() * alpha.length)];
         var c = alpha[Math.floor(Math.random() * alpha.length)];
         var d = alpha[Math.floor(Math.random() * alpha.length)];
         var e = alpha[Math.floor(Math.random() * alpha.length)];
         var f = alpha[Math.floor(Math.random() * alpha.length)];
         var g = alpha[Math.floor(Math.random() * alpha.length)];
                      }
         var code = a + ' ' + b + ' ' + ' ' + c + ' ' + d + ' ' + e + ' '+ f + ' ' + g;
         document.getElementById("mainCaptcha").innerHTML = code
		 document.getElementById("mainCaptcha").value = code
       }
function ValidCaptcha(){
     var string1 = removeSpaces(document.getElementById('mainCaptcha').value);
     var string2 =         removeSpaces(document.getElementById('txtInput').value);
     if (string1 == string2){
            return true;
     }else{        
          return false;
          }
}
function removeSpaces(string){
     return string.split(' ').join('');
}
&#13;
.capt{
	background-color:grey;
	width: 300px;
	height:100px;
	
}

#mainCaptcha{
	position: relative;
	left : 60px;
	top: 5px;
	
}

#refresh{
	position:relative;
	left:230px;
	width:30px;
	height:30px;
	bottom:45px;
	background-image: url(rpt.jpg);
}

#txtInput, #Button1{
	position: relative;
	left:40px;
	bottom: 40px;
}
&#13;
<link rel="stylesheet" type="text/css" href="estilo.css" />
<script type="text/javascript" src="script.js"></script>    
<body onload="Captcha();"> 
   <div class="capt"> 
   <h2 type="text" id="mainCaptcha"></h2>
   <p><input type="button" id="refresh" onclick="Captcha();"/></p>            <input type="text" id="txtInput"/>    
   <input id="Button1" type="button" value="Check" onclick="alert(ValidCaptcha());"/>
   </div>
</body>
&#13;
&#13;
&#13;

答案 2 :(得分:3)

你在这里;)

<html>
  <head>
    <title>TestPage</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
    var captchaText;
    $(function() {
      var pre = $('#captcha');
      captchaText = pre.text();
      pre.text('');

      var lines = ['', '', '', '', '']
      for (var ixLetter = 0; ixLetter < captchaText.length; ixLetter++)
      { 
        var letter = captchaText.substr(ixLetter, 1);

        var letterLines = letters[letter];
        for (var ix = 0; ix < 5; ix++)
        {
          lines[ix] = lines[ix] + '  ' + letterLines[ix];
        }
      }
      for (var ix = 0; ix < 5; ix++)
      {
        pre.append(lines[ix] + '\n');
      }
    });
    function check() 
    {
      if ($('#captchaCheck').val() == captchaText) 
      {
        alert('you are probably human');
      }
      else 
      {
        alert('you probably made a mistake. Don\'t worry. To err is also human.');
      }
    }
    var letters = {
      h: [
        'HH  HH',
        'HH  HH',
        'HHHHHH',
        'HH  HH',
        'HH  HH'
      ],
      i: [
        'II',
        'II',
        'II',
        'II',
        'II'  
      ]
      // etc
    }        

    </script>
  </head>
  <body>
    <pre id="captcha">hi</pre>
    Please type what you see: <input id="captchaCheck"/> <input type="button" value="Check" onclick="check()"/>
  </body>
</html>

答案 3 :(得分:2)

客户端验证码不提供服务器生成的验证码的保护,因为服务器无法检查解析的验证码是否正确解决。

答案 4 :(得分:1)

这是不可能的。

您可以创建看起来像CAPTCHA的东西,但它只会在不需要时运行,即在浏览器中显示页面时。当它需要时它将无法运行,因为试图闯入的程序将不会运行客户端脚本。

答案 5 :(得分:0)

如果您的目的是简单地转移大多数机器人,您可以使用一个随机选择2个数字的简单脚本,并要求用户添加它们。

答案 6 :(得分:0)

我同意所有有关客户端验证码从根本上存在缺陷的评论,并且我不知道要缓解任何数量的垃圾邮件所面临的困难...

不过,要给您留下深刻印象,请查看运行中的xRumer和GSA:YouTube: xEvil vs GSA Captcha Breaker

  

该软件还能够收集和解密人工智能,例如论坛在注册时经常使用的安全性问题(即2 + 2是什么?)。自从最新版本的XRumer以来,该软件能够从多个来源收集此类安全问题,并且在解决这些问题方面更为有效。

     

wikipedia.org/wiki/XRumer

参考文献:


因此,请注意,这是使用HTML5验证的一种简单选择,它可能与此处的其他帖子一样无效!可能是垃圾邮件发布者只会在提交之前添加formnovalidate,并标识蜜罐字段。

<form class="input">
  <label for="number" class="title">
    What is three plus four?
  </label>
  <br>
  <input 
    name="number" 
    required="required"
    pattern="(7|seven)" 
    oninvalid="this.setCustomValidity('Sorry, please enter the correct answer')"
    oninput="this.setCustomValidity('')"
  >
  
  <!-- Bonus honeypot field, hidden from the user.  The server should discard this response if it contains any input -->
  <input name="decoy" style="display: none;" />

  <input type="submit">
</form>

答案 7 :(得分:0)

 function Captcha(){
     var alpha = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
        'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 
            '0','1','2','3','4','5','6','7','8','9');
     var i;
     for (i=0;i<6;i++){
         var a = alpha[Math.floor(Math.random() * alpha.length)];
         var b = alpha[Math.floor(Math.random() * alpha.length)];
         var c = alpha[Math.floor(Math.random() * alpha.length)];
         var d = alpha[Math.floor(Math.random() * alpha.length)];
         var e = alpha[Math.floor(Math.random() * alpha.length)];
         var f = alpha[Math.floor(Math.random() * alpha.length)];
         var g = alpha[Math.floor(Math.random() * alpha.length)];
                      }
         var code = a + ' ' + b + ' ' + ' ' + c + ' ' + d + ' ' + e + ' '+ f + ' ' + g;
         document.getElementById("mainCaptcha").innerHTML = code
         document.getElementById("mainCaptcha").value = code
       }
function ValidCaptcha(){
     var string1 = removeSpaces(document.getElementById('mainCaptcha').value);
     var string2 =         removeSpaces(document.getElementById('txtInput').value);
     if (string1 == string2){
            return true;
     }else{        
          return false;
          }
}
function removeSpaces(string){
     return string.split(' ').join('');
}
<h1 This works pretty well. </h1>

答案 8 :(得分:0)

试试这个:

<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
<script>
/* created dynamically by server when preparing the page */
// f function is on server and not known by bot and is random per result 
// maybe bcrypt with a unique salt per request
var encodedResult = "f('X')"; 
var serverRenderedPositionSequence = [
    [0,0],
    [10,10],
    [20,20],
    [30,30],
    [40,40],
    [50,50],
    [60,60],
    [70,70],
    [80,80],
    [90,90],
    [100,100],
    [100,100],
    [100,100],
    [100,100],
    [100,100],
    [100,0],
    [90,10],
    [80,20],
    [70,30],
    [60,40],
    [50,50],
    [40,60],
    [30,70],
    [20,80],
    [10,90],
    [0,100]
];

window.index = 0;

window.move=function(but){
      but.style.left = (serverRenderedPositionSequence[window.index][0]+"px");
      but.style.top = (serverRenderedPositionSequence[window.index][1]+"px");
      window.index++;
      if(window.index<serverRenderedPositionSequence.length)
      {
          setTimeout(function(){
              window.move(but);
          },125);
      }
}
window.onload=function(){
  var but = document.getElementById("decoy-button");
  window.index=0;
  window.move(but);
};
function post()
{
  // do something with
  var xhrData= {
    encodedResult:encodedResult, 
    result:document.getElementById('result').value
  };
  var postXhr=function(){ /* HTTP POST */}
  
  // server checks if decoded "encoded result" is equal to the result (X here)
  postXhr(xhrData);
}
</script>
</head>
<body>
    <input id="result" type="text" value="Enter the message you see" />
    <input id="test" onclick="post()" type="button" value="Post" />
   
    <input id="decoy-button" type="button" value="   click me bot" style="width:0px;padding:0;position:absolute; left:0px; top:0px;" />
    <input id="secret" type="button" onclick="window.index=0;move( document.getElementById('decoy-button'))" value="repeat sequence" />
</body>
</html>

那么服务器将只使用 bcrypt 来检查结果是否为真。

由于模式匹配需要动态观察屏幕,这会导致一些机器人失败。这些会失败:

  • 点击立即发布按钮的机器人
  • 不运行 javascript 的机器人
  • 误点击诱饵按钮的机器人
  • 无法理解序列中坐标之间跳跃的机器人
    • 例如,在绘制 X 时,它从机器人右上方跳到右上角,有效地在假想平面上绘制一条垂直线,这可能很容易欺骗一些机器人
  • 使用 OCR 和“固定”屏幕截图计时的机器人

为了进一步混淆任何“画布”黑客,服务器可以在序列中添加快速随机突发(减少跳跃之间的延迟),这样生成的图像看起来无法识别,但人类会看到它写的内容在这些随机突发之间。

要增加一个深度,你可以问一个数学问题,如

1+1

而不仅仅是字符串。

但是,当机器人记住编码结果并重新发送时,安全性就被破坏了。因此,为客户端创建一个“会话”并且不发送任何编码结果。只是随机序列并仅由服务器端检查结果。当然会话也会消耗数据库时间/空间,但至少网站管理员/编辑不会在网站的控制面板上看到垃圾邮件。

答案 9 :(得分:-1)

请试试这个

<script type="text/javascript">
    $('#submitcapt').click(function(){
        var captval = "This will not do nothing";
        $.ajax({
            type : "POST",
            url : "externals/reCaptcha/ajaxaction.php",
            data : {loadval:captval},
            success : function( msg ) {
                if(msg=="1"){

                }else{

                }
            }
        })
    });
</script>

在ajaxaction.php中请输入以下代码

<?php
    session_start();
    $val=$_POST['loadval'];
    $message= $_SESSION['random_number'];
    if($val==$message) {
        echo "1";
    }else{
        echo "2";
    }
?> 

答案 10 :(得分:-1)

$(document).ready(function() {
    DrawCaptcha();
});

function refreshCap() {
    DrawCaptcha();
}

function DrawCaptcha() {
    var a = Math.ceil(Math.random() * 10) + '';
    var b = Math.ceil(Math.random() * 10) + '';
    var c = Math.ceil(Math.random() * 10) + '';
    var d = Math.ceil(Math.random() * 10) + '';
    var e = Math.ceil(Math.random() * 10) + '';
    var f = Math.ceil(Math.random() * 10) + '';
    var g = Math.ceil(Math.random() * 10) + '';
    var code = a + ' ' + b + ' ' + ' ' + c + ' ' + d + ' ' + e + ' ' + f + ' ' + g;
    var test = document.getElementById("ContentPlaceHolder1_txtCapcha").value = code;
    alert(test);
}

function ValidCaptcha() {
    var str1 = removeSpaces(document.getElementById('ContentPlaceHolder1_txtCapcha').value);
    var str2 = removeSpaces(document.getElementById('ContentPlaceHolder1_txtinputCapcha').value);
    if (str1 != str2) {
        alert("Properly enter the Security code.");
        document.getElementById('ContentPlaceHolder1_txtinputCapcha').focus() return false;
    }
}

function removeSpaces(string) {
    return string.split(' ').join('');
}