PHP認証コードのクラックについて。
ウェブサイトでの爆発を防ぐために、確認コードを追加することが最善です。
市場には通常、
英語 + 数字、中国語、JS の数種類の認証コードがあり、
珍しい中国モバイルの画像読み取り認証コードもあります。
これは非常に強力に見えますが、実際にはあまり良くありません。答えは 8 つあります。
数字が存在するかどうかを判断した後、4つの答えを固定できます。騙しに頼れば、うまくいく可能性はかなり高くなります。
最後に、干渉点と干渉線を追加します。次に、フォントなどを変形させます。
PHP は通常、GD ライブラリを使用してイメージと SESSION を生成し、認証を実現します。
検証コード レベルを突破した後、セッション ID を取得するリクエストをシミュレートできます。認証コードを解析し、ログイン認証を登録します。
確認コードが解読された後のプロセスは基本的にスムーズです。次に、アカウントのパスワードやスパムメッセージなどを確認しようとしました...
プロセスを理解すれば、警戒できるため、いくつかの問題が関係しています。
1. 位置が固定され、形状が変化しない一部の文字を識別しやすくする必要があります。
2. セッションを適切に設定する必要があります。 SESSIONは検証後すぐにクリアし、URL値の転送設定を禁止するなど...
3. 適切な時間と頻度の制限を設定します。
以下は Baidu の検証コード BZ6E ですが、送信元を特定できるはずですが、数回送信すると失敗します。
各文字が干渉線と少しひねりを加えて接続されているのは少し難しいですが、タオバオには干渉線がありません。
誰かがそれを壊す方法を話し合って考えてみましょう。 Tiebaには今でも頻繁にコメントを投稿する人がいます。
さて、今回はここまでです。
PHP コード
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> $image_name = 'baidu.jpg'; $image = "http://tieba.baidu.com/cgi-bin/genimg?0013286908280168B65F46CEDCD48CF9D46DF47A64587DA42FC48BF1CF8D47BD0D0BC2EE39911C9918D5CF46E79CF94FFA71BC0DC14DAE59197F42F24B4455C205062670A2977101F1A661F7F4716A8BC2C21D586F886CA300E0D42874D6365A1216622D9740163479D1DD416DAE5D70C09EA834F6B9EC307A29CDAF8D0C78FE159402800B113F6039195E5D683695532E4E2FFD8563D732AD19EDFB147B7569B617BDFBE487CE77AE49E75D83BA56B7038971E2081F647A&t=0.7108543934300542"; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $image); curl_setopt($curl, CURLOPT_REFERER, 'http://tieba.baidu.com/f?kw=baidu'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curl); curl_close($curl); file_put_contents($image_name, $result); $size = getimagesize($image_name); $im = imagecreatefromjpeg($image_name); imagejpeg($im, 'baidu.jpg',100); $width = $size[0]; $height = $size[1]; for($x = 1; $x < $width; $x ++) { for($y = 1; $y < $height; $y ++) { $color = imagecolorat($im, $x, $y); $_col[$x][] = $color; if($color < '16777215') $all_color[$color] = $color; } } $n = array_sum($all_color) / count($all_color); foreach ($_col as $key=>$val) { foreach ($val as $k=>$v) $col[$key] .= $v < $n ? '1':' '; } // 去多余行列 foreach ($_col as $key=>$val) if(array_sum($val) < 1) unset($col[$key]); foreach ($col as $key=>$val) { $val = trim($val); if(empty($val)) unset($col[$key]); } echo '<pre class="brush:php;toolbar:false">'; print_r($col);