`
jj7jj7jj
  • 浏览: 50383 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

利用JavaScript破解验证码(转)

 
阅读更多
网上惊现可以破解验证码的JavaScript脚本——GreaseMonkey!由“Shaun Friedle”开发的这段脚本可以轻松搞定Megaupload站点的CAPTCHA。如果您不相信的话,可以到http://herecomethelizards.co.uk/mu_captcha/亲自尝试一下!

  现在,Megaupload站点提供的CAPTCHA在上述代码面前已经败下阵来,说实话,这里的验证码设计的不不太好。但更有趣的是:

  1.HTML 5中的Canvas应用程序接口getImageData可以用来从验证码图像中取得像素数据。利用Canvas,我们不仅可以将一个图像嵌入一个画布中,而且之后还可以再从中重新提取出来。

  2.上述的脚本中包含一个完全使用JavaScript实现的神经网络。

  3.使用Canvas从图像中提取出像素数据后,将其送入神经网络,通过一种简单的光学字符识别技术来推测验证码中到底使用了哪些字符。

  通过阅读源代码,我们不仅可以更好地理解其工作原理,也可以领会这个验证码究竟是如何实现的。就像前面看到的那样,这里使用的验证码不是很复杂——每个验证码有三个字符组成,每个字符使用一种不同的颜色,并且只使用26个字母中的字符,而所有字符都使用同一种字体。

  第一步的用意很明显,那就是把验证码拷贝到画布上,并且把它转化为灰度图。

      function convert_grey(image_data){
  for (var x = 0; x < image_data.width; x++){
  for (var y = 0; y < image_data.height; y++){
  var i = x*4+y*4*image_data.width;
  var luma = Math.floor(image_data.data[i] * 299/1000 +
  image_data.data[i+1] * 587/1000 +
  image_data.data[i+2] * 114/1000);
  image_data.data[i] = luma;
  image_data.data[i+1] = luma;
  image_data.data[i+2] = luma;
  image_data.data[i+3] = 255;
  }
  }
  }


  然后,将画布分成三个单独的像素矩阵,每个矩阵包含一个字符。这一步实现起来非常容易,因为每个字符都使用一种单独的颜色,所以通过颜色就可以将其区分开来。

      filter(image_data[0], 105);
  filter(image_data[1], 120);
  filter(image_data[2], 135);
  function filter(image_data, colour){
  for (var x = 0; x < image_data.width; x++){
  for (var y = 0; y < image_data.height; y++){
  var i = x*4+y*4*image_data.width;
  // Turn all the pixels of the certain colour to white
  if (image_data.data[i] == colour) {
  image_data.data[i] = 255;
  image_data.data[i+1] = 255;
  image_data.data[i+2] = 255;
  // Everything else to black
  } else {
  image_data.data[i] = 0;
  image_data.data[i+1] = 0;
  image_data.data[i+2] = 0;
  }
  }
  }
  }


  最终,所有无关的干扰像素都被剔除出去。为此,可以先查找那些前面或者后面被黑色(未匹配的)像素围绕的白色(匹配过的)像素,然后将匹配过的像素删除即可。

      var i = x*4+y*4*image_data.width;
  var above = x*4+(y-1)*4*image_data.width;
  var below = x*4+(y+1)*4*image_data.width;
  if (image_data.data[i] == 255 &&
  image_data.data[above] == 0 &&
  image_data.data[below] == 0) {
  image_data.data[i] = 0;
  image_data.data[i+1] = 0;
  image_data.data[i+2] = 0;
  }


  现在我们已经得到了字符的大约图形,但在将其载入神经网络之前,脚本还会进一步对它进行必要的边缘检测。脚本会寻找图形最左、右、上、下方的像素,并将其转化为一个矩形,接着把矩形重新转换为一个20*25像素的矩阵。

      cropped_canvas.getContext("2d").fillRect(0, 0, 20, 25);
  var edges = find_edges(image_data[i]);
  cropped_canvas.getContext("2d").drawImage(canvas, edges[0], edges[1],
  edges[2]-edges[0], edges[3]-edges[1], 0, 0,
  edges[2]-edges[0], edges[3]-edges[1]);
  image_data[i] = cropped_canvas.getContext("2d").getImageData(0, 0,
  cropped_canvas.width, cropped_canvas.height);


  经过上面的处理,我们得到了什么呢? 一个20*25的矩阵,其中包含单个矩形,其中填由黑白色。真是太好了!

  然后,会对这个矩形做进一步的简化。我们策略性地从矩阵中提取一些点,作为“光感受器”,这些光感受器将输送到神经网络。举例而言,某个光感受器具体对应的可能是位于9*6位置像素,有像素或者没有像素。脚本会提取一系列这样的状态(远少于对 20*25矩阵整个计算的次数——只提取64种状态),并将这些状态送入神经网络。

  您可能要问,为什么不直接对像素进行比较?有必要使用神经网络吗?问题的关键在于,我们要去掉那些模棱两可的情况。如果您试过前面的演示就会发现,直接进行像素比较比通过神经网络比较,更容易出错,尽管出错的时候不多。但我们必须承认,对于大部分用户来说,直接的像素比较应该已经够用了。

  下一步就是尝试猜字母了。神经网络中导入了64个布尔值(由其中的一个字符图像获取而来),同时包含一系列预先计算好的数据。神经网络的理念之一,就是我们希望得的结果事先就是知道的,所以我们可以针对结果对神经网络进行相关的训练。脚本作者可以多次运行脚本,并收集了一系列最佳评分,这些评分能帮助倒推出产生它们的那些值,从而帮神经网络猜出答案,除此之外,这些评分没有任何特殊意义。

  当神经网络对验证码中一个字母对应的64个布尔值进行计算以后,和一个预先计算好的字母表相比较,然后为和每个字母的匹配都给出一个分数。(最后的结果可能类似:98%的可能是字母A,36%的可能是字母B等。)

  当对验证码中的三个字母都经过处理以后,最终的结果也就出来了。需要注意的是,该脚本无法达到100%正确性(不知道如果在开始的时候不将字母转换成矩形,是不是可以提高评分的精度),但这已经相当好了,至少对于当前的用途来说是这样。而且所有的操作都是在基于标准的客户端技术实现的浏览器中完成的!

  补充说明一下,这个脚本应该算是一个特例吧,这项技术可能会很好的工作在在其它简陋的验证码上,但对于复杂的验证码来说,就有点鞭长莫及了(尤其是这种基于客户端的分析)。但愿有更多人能从这个项目中受到启发而开发出更奇妙的东西来,因为它的潜力实在是太大了
分享到:
评论

相关推荐

    javascript生成验证码

    利用javascript生成验证码,在jsp中可直接使用

    javascript验证码破解

    ### JavaScript验证码破解详解 #### 一、背景介绍 随着网络安全意识的提高,许多网站开始采用验证码(CAPTCHA)作为防止自动化攻击的一种手段。验证码的主要作用是区分人类用户与自动化程序,确保系统的安全性。...

    JAVASCRIPT身份证验证码

    本文将基于提供的JavaScript脚本,深入分析如何利用JavaScript进行身份证号码的有效性验证。 #### 身份证号码结构与校验规则 中国的身份证号码由18位数字组成,前6位表示地区编码,接下来4位代表出生年份,之后2位...

    javascript html5 验证码

    - **图像绘制**:JavaScript可以利用HTML5的Canvas API来绘制图像。创建一个`&lt;canvas&gt;`元素,然后通过`canvas.getContext('2d')`获取绘图环境。使用`fillText()`方法在画布上绘制随机字符串,同时可以通过设置字体...

    javascript 利用ajax获取验证码内容和session值

    AJAX(Asynchronous JavaScript and XML)是一种技术,利用JavaScript实现了页面的异步更新,使得网页无需刷新就能与服务器进行数据交换。本话题主要探讨如何使用JavaScript和AJAX来获取验证码内容以及服务器端的...

    验证码通用模块 javascript版

    2. **图像渲染**:验证码需要以图像的形式展示,JavaScript可以利用canvas元素或者动态创建img标签来绘制和显示验证码图片。 3. **用户交互**:当用户点击“刷新验证码”按钮时,JavaScript会生成新的验证码并更新...

    javascript解决验证码“看不清,换一张”的问题.docx

    通过以上分析可以看出,利用简单的JavaScript代码即可实现验证码的刷新功能,不仅提高了用户的体验,也增强了网站的安全性。在实际应用中,可以根据具体需求对代码进行适当的扩展和优化,以适应更多复杂的场景。

    javascript制作的图形验证码特效.zip

    通过解压并查看这些文件,你可以更深入地了解如何利用JavaScript实现图形验证码特效,包括具体的代码结构、变量定义、函数调用等细节。 学习这个案例可以帮助开发者理解JavaScript在网页交互中的作用,以及如何利用...

    JavaScript生成验证码并实现验证功能

    在JavaScript中,我们可以利用其动态生成页面的能力来创建验证码。 在提供的代码中,验证码的生成过程发生在`createCode`函数中。这个函数首先初始化一个空字符串`code`作为验证码,然后定义了一个包含数字和大写...

    常规验证码、滑动验证码、拼图验证码、选字验证码,纯前端验证码

    通过查看和分析源代码,我们可以学习到如何利用JavaScript、HTML和CSS实现各种验证码功能,了解它们的工作原理,以及如何在实际项目中集成和优化验证码系统。 总的来说,验证码是保障网站安全的重要工具,不同的...

    gif动态登录验证码

    总的来说,“gif动态登录验证码”是一种有效的安全措施,通过利用GIF动画的特性来提高网站的安全性,同时对开发者提出了更高的编程和设计要求。理解和掌握这种技术对于提升网络安全和用户体验至关重要。

    js验证码生成

    一个基本的JavaScript验证码生成示例可能包括以下步骤: - 创建一个HTML元素(如`&lt;div&gt;`或`&lt;canvas&gt;`)用于显示验证码。 - 使用JavaScript生成随机字符串。 - 如果使用Canvas,使用`canvas.getContext('2d')`...

    java servlet验证码和一个javascript菜单联动例子

    在这个特定的例子中,我们关注的是如何利用Java Servlet生成验证码以及如何将验证码与JavaScript实现的菜单进行联动。 首先,Java Servlet是Java平台上的一个标准组件,它允许开发者创建动态web应用程序。在验证码...

    jsp四位验证码图片生成

    我们将探讨JSP验证码的原理、实现方式以及与JavaScript验证码的对比。 验证码的核心在于它的随机性和一次性。随机性确保每次请求时生成的验证码都是不同的,而一次性则意味着一旦验证码被使用或验证,它将失效。在...

    Web验证码的代码

    在这个名为"Web验证码的代码"的项目中,开发者使用JavaScript和Java Web技术实现了一个完整的验证码功能。下面我们将详细探讨这个项目可能涉及的关键知识点。 首先,验证码的生成通常包括以下几个步骤: 1. **随机...

    验证码生成类大全

    - JavaScript中,可以结合Canvas元素生成动态验证码,或者利用WebGL实现更复杂的3D验证码。 4. **验证码服务端与客户端交互**: - 生成验证码时,服务器端创建一个唯一的验证码值,并将其存储在会话(Session)中...

    jkrUhumanjs利用拖动条替代图形验证码

    总结来说,"jkrUhumanjs" 是一个创新的JavaScript验证码解决方案,它以拖动条的形式提供了一个用户友好的验证体验,同时保持了一定的安全性。通过使用"jk.rUhuman.js",开发者可以在保障网站安全的同时,提升用户的...

    表单验证码生成_js

    对于JavaScript验证码,通常会配合Ajax技术,当用户提交表单时,服务器会验证输入的验证码是否与服务器端保存的一致,如果不一致,则返回错误提示。 在"CheckCode"这个文件中,很可能是包含了一个完整的JavaScript...

    AJAX 验证码

    你可以使用内置的Web工具(例如JSTL、EL和Servlet)来构建服务器端验证逻辑,同时利用JavaScript和HTML/CSS来创建前端界面和交互逻辑。 ### AJAX 验证码的实现步骤 1. 创建HTML页面,设计验证码显示区和输入框以及...

Global site tag (gtag.js) - Google Analytics