宝哥软件园

如何用PHP破解网站验证码

编辑:宝哥软件园 来源:互联网 时间:2021-09-08

验证码的功能一般设置为防止恶意注册、暴力破解或批量发帖。所谓验证码,就是用一串随机生成的数字或符号生成一张图片,在图片上添加一些干扰像素(防止OCR),用用户的肉眼识别验证码信息,进入表单提交给网站进行验证,验证成功后再使用一定的功能。学习验证码的破解/识别技术,不仅可以知道验证码的原理,还可以让你知道如何防止验证码被破解。

最常见的验证码如下:

1.四位数,一个随机数串,原始验证码,验证功能几乎为零。2.随机数字图像验证码。图中人物比较满意,有的可能加了随机干扰素,有的是随机人物颜色,比上一张验证效果更好。没有图形和图像学基础知识的人是断不了的!3.各种图片格式的随机数随机大写英文字母,随机干扰像素的随机位置。4.汉字是目前注册的最新验证码,随机生成,打字比较困难,影响用户体验,一般很少使用。为了简单起见,破解指令主要针对第二种类型。首先,我们来看看这个常见验证码在网上的图片:

第一,最简单,图片的背景和数字都用同一个颜色,字符有规律,字符的位置统一。第二,似乎不容易。事实上,仔细研究就会发现它的规律。无论背景颜色和干扰素如何变化,都验证了字符是有规律的,颜色是一样的,所以消除干扰素是非常容易的,只要消除所有非字符色素。第三,看起来比较复杂。除了上面提到的背景色和干扰素总是在变,验证字符的颜色也在变,每个字符的颜色都不一样。第四,除了第三张图中提到的特征之外,文本中还增加了两条直线的干扰率,看似困难,但很容易去除。验证码识别一般分为以下步骤:

1.毕竟拿出字体识别的验证码不是专业的OCR识别。而且由于不同网站的验证码不同,最常见的方法就是建立这个验证码的特征码库。去掉字体的时候,我们需要多下载几张图片,这样这些图片就包含了所有的字符,这里的字母只是图片,所以我们只需要收集包括0-9的图片。2.二值化二值化是指图片上验证号中的每个像素用一个数字表示,其他部分用0表示。这样就可以计算出每一种数字字体,这些字体可以记录为按键。3.计算特征,对待识别图像进行二值化,得到图像特征。4.将步骤3中的图片特征码和验证码的图案与参考样本进行对比,得到验证图片上的数字。使用当前方法,验证码可以被100%识别。

通过以上步骤,你可能已经说了,你没有找到如何取出干扰素!其实取出干扰素的方法很简单。干扰素的一个重要特点是不会影响验证码的显示效果。因此,在制作干扰素时,其RGB可能会低于或高于某个值。比如我给的图片,干扰素的RGB值不会超过125,所以我们可以很容易的去除干扰素。

一个简单的验证码只由数字和字母组成,格式统一,每次出现都有固定的位置。接下来,我们将继续深入研究验证码的识别。这一次需要明确以下目标:验证码由字符和数字组成,验证码是旋转的(可能是左右旋转),位置不固定,字符之间有粘连,验证码有更强的干扰素。

我们以下图为例来说明一下。

第一步:二值化。验证码的部分用1表示,背景部分用0表示。识别方法很简单。我们打印出验证码的全图RGB,然后分析其规律。通过RGB编码,我们可以很容易的分辨出上面图片的R值大于120,G和B的值小于80,所以我们可以很容易的按照这个规律对上面的图片进行二值化。

我们来看看上面的第三张验证码图片

乍一看,感觉很复杂。验证码图片的背景色每次都不一样,而且不是单色的,每次每个验证码号的颜色都不一样。似乎很难二值化。事实上,当我们打印出它的RGB值时,很容易找到。无论被验证的数字的颜色如何变化,数字的RGB值始终有一个小于125的值,所以我们可以通过判断$ rgbarray ['红色'] 125 | | $ rgbarray ['绿色'] 125,很容易区分数字在哪里,背景在哪里,如下所示。

之所以能找到这些规律,是因为在用验证码制作干扰素时,为了让干扰素不影响数字显示效果,干扰素的RGB和数字RGB必须独立使用,互不干扰。只要理解了这个规律,就很容易实现二值化。

我们发现120、80和125的阈值可能与实际的RGB不同。因此,有时二值化后,有些地方会出现1,这对验证码上固定位置显示数字意义不大。但是对于验证码位置不确定的图片,在我们剪切字符时很可能会造成干扰。因此,二值化后,需要去噪。

第二步:去噪。去噪的原理很简单,就是去掉孤立的有效值。如果噪音大,所需的效率高,也有很多工作要做。幸运的是,我们在这里不需要这么高级,所以我们可以使用最简单的方法。如果一个点是1,判断这个点的八个方向上的数是否是1,如果不是1,就认为是干点,直接设为1。

如上图所示,使用这种方法很容易发现红框中的1是干点,可以直接设置为1。在判断时,我们使用一种技巧,有时噪声可能是两个连续的噪声,所以我们计算该点八个方向的值之和,最后判断它们之和是否小于特定阈值。

第三步:剪切字符。剪字的方法有很多,这里采用最简单的一种。首先垂直剪切字符,然后水平删除0000多个字符,如下图所示

第一步是剪红线,第二步是剪蓝线,这样可以得到独立的字符。但是在这种情况下,

根据上面的方法,dw字符将被切割成一个字符,这是错误的切割,所以这里我们涉及到粘连字符的切割。

第四步:剪切卡住的字符。在制作验证码时,规则字符的粘连容易分离,如果对字符进行缩放,变形很难处理。经过分析,我们可以发现上述字符的粘连是一种非常简单的方式,这只是常规字符的粘连,所以我们也用一种非常简单的方式来处理这种情况。当分割操作完成后,我们不能立即确定分割的部分是字符。要验证,关键因素是剪切字符的宽度是否大于阈值。阈值选择标准是无论角色如何旋转变形,都不会大于这个阈值。所以,如果我们切的块大于这个阈值,就可以认为是粘连字符;如果大于两个阈值之和,则认为卡了三个字符,以此类推。知道了这个规律,就很容易把卡住的字符切掉。如果我们发现它是一个被卡住的字符块,我们可以直接将这个块分成两个或更多的新块。当然,为了更好地还原人物,我通常会用1,-1适当补充人物块的部分。

第五步:匹配字符。旋转文字的特征码建立方法有很多,这里就不做深入研究了。我在这里使用的最简单的方法是为所有的字符建立一个匹配库,所以学习操作被添加到我提供的代码中。目的是人工识别图片的验证码,然后通过学习的方法写入特征码库。以这种方式写入的图片数据越多,用于验证和识别的准确线条就越高。

经过以上步骤,我们基本可以识别互联网上的大部分验证码。在这里,我们都使用最简单的方法,而不使用任何OCR知识。

此外,一些制作验证码的建议:

对于识别验证码的程序来说,最困难的部分是验证码字符的切割和特征码的建立。但是国内很多程序员只做验证码的时候,总喜欢在验证码上加很多干扰素,干扰线路,影响效果。说,它还是不能达到好的效果;因此,如果您想让您的验证码难以识别,只需做以下两点

1.字符被卡住,最好所有字符都有卡住的部分;2.不要使用规格字符,而是缩放或旋转验证码的不同部分。只要达到这两点,或者这两点变形,识别程序就很难识别。

以上就是本文的全部内容:用PHP破解网站验证码,希望对大家的学习有所帮助。

更多资讯
游戏推荐
更多+