ホームページ >バックエンド開発 >PHPチュートリアル >確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?

確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?

WBOY
WBOYオリジナル
2016-06-23 13:05:381133ブラウズ

確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?を追加しても、他の人がチケットをスワイプできるのはなぜですか?以下は認証コードを取得するためのコードです。認証コードが単純すぎるのですが、どうすればもっと複雑になりますか?

/**
* 認証コード画像カテゴリ
*/

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'); すべてのページにこのファイルがあります

あなた検証コード? $validator に渡されないのはなぜですか



">確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?

js:
function get_toupiao(tp_id,all_toupiao,hd_id,tp_star_time,tp_end_time)
{
if($.trim($("input[name=captcha]").val()) == '1')
{
if($.trim($("input[name=t_captcha]").val()) == '')
{
alert("验证码は空になれません!");
$("input[name=t_captcha]").focus();
false を返します。
}
}
var t_captcha=$.trim($("input[name=t_captcha]").val());
var captcha=$.trim($("input[name=captcha]").val());
var originator=$.trim($("input[name=originator]").val());
$.get("/show.php?act=get_toupiao",{
tp_id:tp_id,
all_toupiao:all_toupiao,
hd_id:hd_id,
tp_star_time:tp_star_time,
tp_end_time:tp_end_time, t_captチャ:t_キャプチャ、
キャプチャ: captcha,
発信者:発信者,
async:false,
rand: Math.random()
},function(data){
if(data.record.all_tp=="9")
{
alert("验证码输入错误^_^!");
return false;
}
/*if(data.record.all_tp=="8")
{
alert("请进行有效投票哦^_^!");
return false
}
if(data.record.all_tp=="7")
{
alert("同時投票的人太多,请稍候重试^_^!")
return false; */
if(data.record.all_tp=="5")
{
alert("今天您已经投票,请明天再投吧!");
return false }
if(data.record.all_tp =="6")
{
alert("今天您已经投票,请明天再投吧!");
戻り値
}
if(data.record.all_tp=="3")
{
アラート; ("投票時間间已过,投票できません");
return false;
if(data.record.all_tp=="4")
{
alert("投票時間间还了,投票できません"); return false;
}
if(data.record.all_tp=="1")
{
alert("该活动您已投票,重复投票");
false を返します。
}
if(data.record.all_tp=="2")
{
alert("该项目您已投票,重复投票");
false を返します。
}
if(data.status.code=="1")
{
//成功
$("#tp_"+tp_id+"").empty();
$("#tp_"+tp_id+"").append(""+data.record.tp_count+"");
$("#captcha_"+tp_id+"").empty();
$("#captcha_"+tp_id+"").append(""+data.status.captcha+"");
alert("投票成功!");
false を返します。
}
},"json");
}

PHP:
elseif($action == 'get_toupiao')
{
global $fdyu,$db;
$tp_id = intval($_GET['tp_id']);
$hd_id = intval($_GET['hd_id']);
$all_toupiao = $_GET['all_toupiao'];
$tp_star_time = $_GET['tp_star_time'];
$tp_end_time = $_GET['tp_end_time'];
$t_captcha = $_GET['t_captcha'];
$captcha = intval($_GET['captcha']);
$ajax = array(); // 検証コードかどうかは必須です
if($captcha==1)
{
include_once('includes/cls_captcha.php');
$validator = new captcha();
if (!$validator->check_word($t_captcha))
{
$ajax['record']['all_tp'] = 9;
echo json_encode($ajax);

チェックのアイデアを提供します:
1. 2. 入力した確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?とセッション確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?を印刷して確認します
3. 確認が完了したら、古い確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?を削除する必要があります。削除しないと、ユーザーは更新せずにこの確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?を使用し続けることができます。このページ

以下を参照してください: http://blog.csdn.net/fdipzone/article/details/7295496

Brother Yii の投稿を閲覧しているときに、csdn に上記の 3 番目のバグがあることに気付きましたが、更新した次の日には修正されました
認証コードの防止 投票詐欺は非常に信頼性の低いものです 投票数に利害関係がある場合、ユーザーは有料の認証コードを購入できます
最終的には IP 重複排除がまだ必要だと思います。

IP は制限されていますが、役に立ちません。 投票詐欺ソフトウェア さまざまな IP をスワイプできます

10 階で、確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?をデータベースに記録したところ、それが確かにあなたが指摘した 3 番目のポイントであることがわかりました。重複した確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?がありました!では、古い確認コードを追加しても他の人がチケットをスワイプできるのはなぜですか?を削除するにはどうすればよいでしょうか?


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 回のみ使用可能です

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。