確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?を追加しても、他の人がチケットをスワイプできるのはなぜですか?以下は認証コードを取得するためのコードです。認証コードが単純すぎるのですが、どうすればもっと複雑になりますか?
/**
* 認証コード画像カテゴリ
*/
if (!define('IN_FDYU'))
{
die('ハッキング試行')
}
クラスキャプチャ
{
/**
* 背景画像が配置されているディレクトリ
*
* @var string $folder
*/
//var $folder = ROOT_PATH . 'includes/captcha/';
/**
_*/
var $img_type = 'png';
/*---------------------------------------------- --- -------- */
//-- セッション内に存在する名前
/*----------- ----- ------------------------ */
var $session_word = 'captcha_word'
/**
*/
var $themes_jpg = array(
1 => array('captcha_bg1.jpg', 255, 255, 255),
2 => array('captcha_bg2.jpg', 0, 0, 0),
3 => 配列('captcha_bg3.jpg', 0, 0, 0),
4 => 配列('captcha_bg4.jpg', 255, 255, 255),
5 => 配列', 255, 255, 255),
);
var $themes_gif = array( 1 => array('captcha_bg1.gif', 255, 255, 255),
2 => array('captcha_bg2.gif) ', 0 , 0, 0),
3 => array('captcha_bg3.gif', 0, 0, 0),
4 => array('captcha_bg4.gif', 255, 255, 255),
5 => ; array('captcha_bg5.gif', 255, 255, 255),
);
/**
*/
var $width = 38;
/**
*/
var $height = 16;
/**
*コンストラクター
*
* @access public
*/
function __construct($folder = '', $width = 38, $height = 16)
{
$this->captcha($folder, $width, $height);
}
/**
* コンストラクター‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ integer $height 画像の高さ
* * @return bool
*/
function captcha($folder = '', $width = 38, $height = 16)
{
$folder = ROOT_PATH . 'includes/captcha/';
if (!empty($folder))
{
$this->folder = $folder;
}
$this->width = $width;
$this->height = $height;
/* 检查が GD をサポートしているかどうか */
if (PHP_VERSION >= '4.3')
{
return (function_exists('imagecreatetruecolor') || function_exists('imagecreate'));
}
else
{
return (((imagetypes() & IMG_GIF) > 0) || ((imagetypes() & IMG_JPG)) > 0 ); { this->session_word]) ? base64_decode($_SESSION[$this->session_word]) : '';
$given = $this->encrypts_word(strtoupper($word));
return (preg_match("/$given/", $recorded));
}
/**
*与えられた検証コードがセッションのものと一致しているかどうかを確認します
*
*/
function generate_image($word = false)
{
if (!$word)
$word = $ this->generate_word();
}
/* 记录验证码tosession */
$this->record_word($word);
/* 验证码长度 */
$letters = strlen($word);
/* 选择一随机的案 */
mt_srand((double) microtime() * 1000000);
if (function_exists('imagecreatefromjpeg') && ((imagetypes() & IMG_JPG) > 0))
{
$theme = $this->主題_jpg[mt_rand(1, count( $this->テーマ_jpg) )];
}
else
{
$theme = $this->主題_gif[mt_rand(1, count($this->主題_gif))];
}
if (!file_exists($this->folder . $theme[0]))
{
return false;
}
else
{
$img_bg = (function_exists('imagecreatefromjpeg') && ((imagetypes() & IMG_JPG) > 0)) ?
imagecreatefromjpeg($this->folder . $theme[0]) : imagecreatefromgif($this->folder . $theme[0]);
$bg_width = imagesx($img_bg);
$bg_height = imagesy($img_bg);
$img_org = ((function_exists('imagecreatetruecolor')) && PHP_VERSION >= '4.3') ?
imagecreatetruecolor($this->width, $this->height) : imagecreate($this->width, $this->height);
/* 将背景图象复制原始图象并调整大小 */
if (function_exists('imagecopyresampled') && PHP_VERSION >= '4.3') // GD 2.x
{
imagecopyresampled($img_org, $ img_bg, 0, 0, 0, 0, $this->width, $this->height, $bg_width, $bg_height);
}
else // GD 1.x
{
imagecopyresize($img_org, $img_bg, 0, 0, 0, 0, $this-> ;幅, $this->高さ, $bg_width, $bg_height);
}
imagedestroy($img_bg);
$clr = imagecolorallocate($img_org, $theme[1], $theme[2], $theme[3]);
/* 绘制边框 */
//imagerectangle($img_org, 0, 0, $this->width - 1, $this->height - 1, $clr);
/* 获得验证码の高さと宽度 */
$x = ($this->width - (imagefontwidth(5) * $letters)) / 2;
$y = ($this->height - imagefontheight(5)) / 2;
imagestring($img_org, 5, $x, $y, $word, $clr);
header('有効期限: 1970 年 1 月 1 日木 00:00:00 GMT');
// HTTP/1.1
header('Cache-Control: private, no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0, max-age=0', false);
// HTTP/1.0
header('Pragma: no-cache');
if ($this->img_type == 'jpeg' && function_exists('imagecreatefromjpeg'))
{
header('Content-type: image/jpeg');
imageinterlace($img_org, 1);
imagejpeg($img_org, false, 95);
}
else
{
header('Content-type: image/png');
imagepng($img_org);
}
imagedestroy($img_org);
true を返します。
}
}
/*------------------------------------------ ------------ */
//-- プライベート メソッド
/*-------------------------- ---------------------------- */
/**
*記録する必要がある文字列を暗号化する
*
*/
function encrypts_word($word)
{
return substr(md5($word), 1, 10);
}
/**
*検証コードをセッションに保存する
*
*/
function record_word($word)
{
$_SESSION[$this->session_word] = base64_encode($this->encrypts_word($word));
}
/**
* 随机的验证码
*
* @access private
* @param integer $length 検証コード長
* @return string
*/
functiongenerate_word($length = 4)
{
$chars = '12 34567890ABCDEFGHJKLMNPQRSTUVWXYZ'
for ($i = 0) , $count = strlen($chars); $count; $i++)
microtime() ;
ディスカッションへの返信 (解決策)
check_word の定義だけを見ましたcheck_word の呼び出しではありません
session_start も見ませんでした
送信ページに呼び出しがあります:
include_once('includes/cls_captcha.php') ;
$validator = new captcha(); $validator->check_word($t_captcha)){
$ajax['record']['all_tp'] = 9; echo json_encode($ajax) } session_start(); はどこですか? ? session_start(); これは別のファイルでも利用できます
require(ROOT_PATH . 'includes/init.php'); すべてのページにこのファイルがあります
Brother Yii の投稿を閲覧しているときに、csdn に上記の 3 番目のバグがあることに気付きましたが、更新した次の日には修正されました
認証コードの防止 投票詐欺は非常に信頼性の低いものです 投票数に利害関係がある場合、ユーザーは有料の認証コードを購入できます
最終的には IP 重複排除がまだ必要だと思います。
IP は制限されていますが、役に立ちません。 投票詐欺ソフトウェア さまざまな IP をスワイプできます
if($action == 'get_toupiao')
{
if ($_SESSION['code_1']!=$t_captcha)
{ $ajax['record']['all_tp'] = 9;
echo json_encode($ajax);
exit; を省略します。 。 。 。 。省略します
$ajax['status']['code'] = 1; //成功
echo json_encode($ajax)
}
は $ajax['status']['code'] = 1; // unset($_SESSION['code_1']) をこれに追加しますか?
認証に合格したら、セッション認証コードをクリアするだけです。
保証されたトークンは 1 回のみ使用可能です