中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Discuz! X2驗證碼的產生和驗證及隨機數產生探討
來源:易賢網 閱讀:1541 次 日期:2014-09-16 09:27:50
溫馨提示:易賢網小編為您整理了“Discuz! X2驗證碼的產生和驗證及隨機數產生探討”,方便廣大網友查閱!

一、驗證碼的產生

1、如何在模板中添加一個驗證碼

在X2中驗證碼的模板部分獨立為一個模板文件(template/default/common/seccheck.htm),供各個地方調用。

在模板中可以添加如下代碼來調用驗證碼模板部分:

代碼如下:

<!--{eval $seccodecheck = 1;}-->

<!--{eval $sectpl = '<tr><th><sec></th><td><sec><p class="d"><sec></p></td>';}-->

<!--{subtemplate common/seccheck}-->

解釋下這三句話:

第一句的意思為,我要開啟驗證碼,即 $seccodecheck

變量

必須為真,就表示當前頁面要開啟驗證碼。

第二句的意思為,給要顯示出來的驗證碼設置一個顯示的模板格式,$sectpl 這個變量對應的就是模板,設置 $sectpl 可以讓驗證碼的顯示與當前頁面的格式更好的結合。從示例的模板代碼中可以看出,只有 <sec> 不屬于 HMTL 標準代碼,而且出現了 3 次,這 3 次分別代表:“驗證碼”文字、驗證碼輸入框、驗證碼圖片,如下圖所示:

名單

這樣就可以把驗證碼不同的部分合理的安放在您的頁面中了。

第三句的意思為,將獨立的驗證碼模板合并到當前頁面中,與當前頁面的模板一同輸出。

在模板中添加上如上的代碼后,刷新頁面就可以看到驗證碼部分了。

2、驗證碼的生成流程

(以X2默認設置的“英文圖片驗證碼”為例)

1)剛出現的驗證碼會默認執行一段 JS 代碼

代碼如下:

<script type="text/javascript" reload="1">updateseccode('SQq29j20');</script>

執 行的 JS 主要就是執行了 updateseccode 這個函數,直接點擊驗證碼圖片執行的也是這個函數。函數中的 'SQq29j20' 是當前頁面驗證碼的唯一字符串 idhash,他是由是否為Ajax請求、session id、自增數字組成,此處不必深究其含義。

2)updateseccode 函數在 static/js/common.js 中

代碼如下:

function updateseccode(idhash, play) {

$F('_updateseccode', arguments);

}

通過上面代碼可以看到,updateseccode 又調用了 _updateseccode 私有函數,_updateseccode 函數在 static/js/common_extra.js 文件中

代碼如下:

function _updateseccode(idhash, play) {

if(isUndefined(play)) {

if($('seccode_' + idhash)) {

$('seccodeverify_' + idhash).value = '';

if(secST['code_' + idhash]) {

clearTimeout(secST['code_' + idhash]);

}

$('checkseccodeverify_' + idhash).innerHTML = '<img src="'+ IMGDIR + '/none.gif" width="16" height="16" class="vm" />';

ajaxget('misc.php?mod=seccode&action=update&idhash=' + idhash, 'seccode_' + idhash, null, '', '', function() {

secST['code_' + idhash] = setTimeout(function() {$('seccode_' + idhash).innerHTML = '<span class="xi2 cur1" onclick="updateseccode(''+idhash+'')">刷新驗證碼</span>';}, 180000);

});

}

} else {

eval('window.document.seccodeplayer_' + idhash + '.SetVariable("isPlay", "1")');

}

}

這段 JS 代碼有兩個含義:

一是通過 ajaxget 請求了 misc.php?mod=seccode&action=update&idhash=xxxx 這樣一個地址

二是設定了一個

定時器

,從顯示了驗證碼開始,3分鐘后自動將驗證碼圖片換為“刷新驗證碼”的文字,點擊該文字就執行 updateseccode 這個函數,重新更新驗證碼。由此可以看出,此種方式可以很好的解決驗證碼過期的問題。

3)找到通過 ajaxget 請求的程序 source/module/misc/misc_seccode.php

通過 url 中的 action=update 可以看出,應該查看 if($_G['gp_action'] == 'update') { …… } 中的一段

代碼如下:

if($_G['gp_action'] == 'update') {

$message = '';

if($_G['setting']['seccodestatus']) {

$rand = random(5, 1);

$flashcode = '';

$idhash = isset($_G['gp_idhash']) ? $_G['gp_idhash'] : '';

$ani = $_G['setting']['seccodedata']['animator'] ? '_ani' : '';

if($_G['setting']['seccodedata']['type'] == 2) {

……

} elseif($_G['setting']['seccodedata']['type'] == 3) {

…...

} else {

$message = lang('core', 'seccode_image'.$ani.'_tips').'<img onclick="updateseccode(''.$idhash.'')" width="'.$_G['setting']['seccodedata']['width'].'" height="'.$_G['setting']['seccodedata']['height'].'" src="misc.php?mod=seccode&update='.$rand.'&idhash='.$idhash.'" class="vm" alt="" />';

}

}

include template('common/header_ajax');

echo lang('message', $message, array('flashcode' => $flashcode, 'idhash' => $idhash));

include template('common/footer_ajax');

}

默 認設置的“英文圖片驗證碼”的 $_G['setting']['seccodedata']['type'] 為 0,所以看 else 的部分。仔細看這里就是按照 ajax 的格式返回了一個驗證碼的圖片,但是圖片的 src 為 misc.php?mod=seccode&update=$rand&idhash=$idhash 這樣一個動態鏈接,所以是通過這個鏈接動態生成的圖片,此時又產生了一個新的請求。

4)找到通過圖片鏈接請求的程序 source/module/misc/misc_seccode.php(和上面是同一個文件)

通過 url 可以看出,應該查看 if($_G['gp_action'] == 'update') { …… } else { …… } 中的一段

代碼如下:

} else {

$refererhost = parse_url($_SERVER['HTTP_REFERER']);

$refererhost['host'] .= !empty($refererhost['port']) ? (':'.$refererhost['port']) : '';

if($_G['setting']['seccodedata']['type'] < 2 && ($refererhost['host'] != $_SERVER['HTTP_HOST'] || !$_G['setting']['seccodestatus']) || $_G['setting']['seccodedata']['type'] == 2 && !extension_loaded('ming') && $_POST['fromFlash'] != 1 || $_G['setting']['seccodedata']['type'] == 3 && $_GET['fromFlash'] != 1) {

exit('Access Denied');

}

$seccode = make_seccode($_G['gp_idhash']);

if(!$_G['setting']['nocacheheaders']) {

@header("Expires: -1");

@header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);

@header("Pragma: no-cache");

}

require_once libfile('class/seccode');

$code = new seccode();

$code->code = $seccode;

$code->type = $_G['setting']['seccodedata']['type'];

$code->width = $_G['setting']['seccodedata']['width'];

$code->height = $_G['setting']['seccodedata']['height'];

$code->background = $_G['setting']['seccodedata']['background'];

$code->adulterate = $_G['setting']['seccodedata']['adulterate'];

$code->ttf = $_G['setting']['seccodedata']['ttf'];

$code->angle = $_G['setting']['seccodedata']['angle'];

$code->warping = $_G['setting']['seccodedata']['warping'];

$code->scatter = $_G['setting']['seccodedata']['scatter'];

$code->color = $_G['setting']['seccodedata']['color'];

$code->size = $_G['setting']['seccodedata']['size'];

$code->shadow = $_G['setting']['seccodedata']['shadow'];

$code->animator = $_G['setting']['seccodedata']['animator'];

$code->fontpath = DISCUZ_ROOT.'./static/image/seccode/font/';

$code->datapath = DISCUZ_ROOT.'./static/image/seccode/';

$code->includepath = DISCUZ_ROOT.'./source/class/';

$code->display();

}

這部分開始是先做了一些安全性的驗證,最后是根據給定的參數和由 make_seccode 生成的驗證碼字符串,生成驗證碼的圖片,所以中間是重點。

make_seccode($_G['gp_idhash']) 這個函數傳入了當前頁面驗證碼的唯一字符串 idhash,生成了用于驗證碼的字符串。

5)make_seccode 函數在 source/function/function_seccode.php 文件

代碼如下:

function make_seccode($idhash){

global $_G;

$seccode = random(6, 1);

$seccodeunits = '';

if($_G['setting']['seccodedata']['type'] == 1) {

$lang = lang('seccode');

$len = strtoupper(CHARSET) == 'GBK' ? 2 : 3;

$code = array(substr($seccode, 0, 3), substr($seccode, 3, 3));

$seccode = '';

for($i = 0; $i < 2; $i++) {

$seccode .= substr($lang['chn'], $code[$i] * $len, $len);

}

} elseif($_G['setting']['seccodedata']['type'] == 3) {

$s = sprintf('%04s', base_convert($seccode, 10, 20));

$seccodeunits = 'CEFHKLMNOPQRSTUVWXYZ';

} else {

$s = sprintf('%04s', base_convert($seccode, 10, 24));

$seccodeunits = 'BCEFGHJKMPQRTVWXY2346789';

}

if($seccodeunits) {

$seccode = '';

for($i = 0; $i < 4; $i++) {

$unit = ord($s{$i});

$seccode .= ($unit >= 0x30 && $unit <= 0x39) ? $seccodeunits[$unit - 0x30] : $seccodeunits[$unit - 0x57];

}

}

dsetcookie('seccode'.$idhash, authcode(strtoupper($seccode)."t".(TIMESTAMP - 180)."t".$idhash."t".FORMHASH, 'ENCODE', $_G['config']['security']['authkey']), 0, 1, true);

return $seccode;

}

從函數中可以看到,驗證碼 $seccode 首先來自一個6位的隨機數字 random(6, 1) (此函數如何工作,最后講解)。

默認設置的“英文圖片驗證碼”的 $_G['setting']['seccodedata']['type'] 為 0,所以看 else 的部分。將 $seccode 的數字通過 base_convert 函數由 10

進制

轉為 24 進制,然后設定可以在驗證碼出現的字符串

代碼如下:

'BCEFGHJKMPQRTVWXY2346789'。

最后將 24 進制的驗證碼在 $seccodeunits 中取得真正的 4 位驗證碼字符串 $seccode ,最后將 $seccode 通過 authcode 加密函數進行加密,寫入 cookie 中,并返回,cookie 的名字是 seccode 連上 $idhash 的值(例如:seccodeSQq29j20)。加密時使用的是在 config/config_global.php 中設置的 $_G['config']['security']['authkey'] 的值。

至此驗證碼及圖片生成完畢,生成的驗證碼到目前為止只以加密的方式存在于 cookie 中。

二、驗證碼的驗證

1、JS 方式的驗證

1)這種驗證就是在文本框中輸入驗證碼后,及時的驗證。

名單2

這個驗證是由文本框的 onblur 失去焦點事件觸發 checksec('code', 'SQq29j20') JS 函數進行驗證的。

2)checksec 函數在 static/js/common.js 中

代碼如下:

function checksec(type, idhash, showmsg, recall) {

$F('_checksec', arguments);

}

通過上面代碼可以看到,checksec 又調用了 _checksec 私有函數,_checksec 函數在 static/js/common_extra.js 文件中

代碼如下:

function _checksec(type, idhash, showmsg, recall) {

var showmsg = !showmsg ? 0 : showmsg;

var secverify = $('sec' + type + 'verify_' + idhash).value;

if(!secverify) {

return;

}

var x = new Ajax('XML', 'checksec' + type + 'verify_' + idhash);

x.loading = '';

$('checksec' + type + 'verify_' + idhash).innerHTML = '<img src="'+ IMGDIR + '/loading.gif" width="16" height="16" class="vm" />';

x.get('misc.php?mod=sec' + type + '&action=check&inajax=1&&idhash=' + idhash + '&secverify=' + (BROWSER.ie && document.charset == 'utf-8' ? encodeURIComponent(secverify) : secverify), function(s){

var obj = $('checksec' + type + 'verify_' + idhash);

obj.style.display = '';

if(s.substr(0, 7) == 'succeed') {

obj.innerHTML = '<img src="'+ IMGDIR + '/check_right.gif" width="16" height="16" class="vm" />';

if(showmsg) {

recall(1);

}

} else {

obj.innerHTML = '<img src="'+ IMGDIR + '/check_error.gif" width="16" height="16" class="vm" />';

if(showmsg) {

if(type == 'code') {

showError('驗證碼錯誤,請重新填寫');

} else if(type == 'qaa') {

showError('驗證問答錯誤,請重新填寫');

}

recall(0);

}

}

});

}

這 個函數首先驗證下,輸入框內填寫的驗證碼的值 $('sec' + type + 'verify_' + idhash).value 是否存在(type 就是傳入的 code)。然后通過 ajax 請求訪問 misc.php?mod=seccode&action=check&inajax=1&&idhash=xxxx&secverify=xxxx 這樣一個地址,這個地址會返回驗證的結果字符串。如果返回結果的前 7 個字符是 succeed 則驗證通過,顯示對勾;否則提示“驗證碼錯誤,請重新填寫”,并顯示紅叉。

3)找到通過 ajax 請求的程序 source/module/misc/misc_seccode.php

通過 url 中的 action=check 可以看出,應該查看 elseif($_G['gp_action'] == 'check') { …… } 中的一段

代碼如下:

} elseif($_G['gp_action'] == 'check') {

include template('common/header_ajax');

echo check_seccode($_G['gp_secverify'], $_G['gp_idhash']) ? 'succeed' : 'invalid';

include template('common/footer_ajax');

} else {

這 里將通過 url 傳入的 secverify 和 idhash 兩個值傳遞給 check_seccode 函數,通過代碼看到 check_seccode 返回布爾值,故結果為真,則通過驗證,返回 succeed 字符串,結果為假,則驗證失敗,返回 invalid 字符串。

4)check_seccode 函數在 source/function/function_core.php 文件

代碼如下:

function check_seccode($value, $idhash) {

global $_G;

if(!$_G['setting']['seccodestatus']) {

return true;

}

if(!isset($_G['cookie']['seccode'.$idhash])) {

return false;

}

list($checkvalue, $checktime, $checkidhash, $checkformhash) = explode("t", authcode($_G['cookie']['seccode'.$idhash], 'DECODE', $_G['config']['security']['authkey']));

return $checkvalue == strtoupper($value) && TIMESTAMP - 180 > $checktime && $checkidhash == $idhash && FORMHASH == $checkformhash;

}

此函數首先根據緩存中的設定驗證驗證碼的開啟狀態,如果未開啟,此處驗證直接返回真,既然沒有開啟驗證碼自然如何驗證均為真。

然后驗證 cookie 中是否存在生成驗證碼時寫入 cookie 的值(例如:seccodeSQq29j20),如果 cookie 沒有此值,則此次驗證失效,需要重新生成驗證碼,重新驗證。

最后從 cookie 取出值,使用 $_G['config']['security']['authkey'] 加密串,通過 authcode 函數對值進行解密,解密后獲取到驗證碼、生成時間、idhash、formhash 四個值。然后需要同時滿足以下四個條件才可以通過驗證:

- 輸入的驗證碼等于解密出來的驗證碼

- 驗證碼的生成時間距當前時間小于 180 秒

- 傳入的 idhash 等于解密出來的 idhash

- 當前系統生成的 formhash 等于解密出來的 formhash

至此通過 JS 方式的驗證碼驗證完成。

2、PHP 方式的驗證

1)這種方式就是在驗證碼所在的表單提交后,對輸入的驗證碼進行的驗證。

例如在修改用戶密碼時開啟了驗證碼,則會在其處理的 PHP 程序中發現(source/include/spacecp/spacecp_profile.php)這樣一句代碼

submitcheck('passwordsubmit', 0, $seccodecheck, $secqaacheck)

submitcheck 函數就是對提交的表單進行驗證的。

2)submitcheck 函數在 source/function/function_core.php 文件

代碼如下:

function submitcheck($var, $allowget = 0, $seccodecheck = 0, $secqaacheck = 0) {

if(!getgpc($var)) {

return FALSE;

} else {

global $_G;

if($allowget || ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_G['gp_formhash']) && $_G['gp_formhash'] == formhash() && empty($_SERVER['HTTP_X_FLASH_VERSION']) && (empty($_SERVER['HTTP_REFERER']) ||

preg_replace("/https?://([^:/]+).*/i", "1", $_SERVER['HTTP_REFERER']) == preg_replace("/([^:]+).*/", "1", $_SERVER['HTTP_HOST'])))) {

if(checkperm('seccode')) {

if($secqaacheck && !check_secqaa($_G['gp_secanswer'], $_G['gp_sechash'])) {

showmessage('submit_secqaa_invalid');

}

if($seccodecheck && !check_seccode($_G['gp_seccodeverify'], $_G['gp_sechash'])) {

showmessage('submit_seccode_invalid');

}

}

return TRUE;

} else {

showmessage('submit_invalid');

}

}

}

submitcheck 函數一般只填寫前兩個參數即可,第一個參數表示要驗證的表單元素的名字,此表單元素不存在則驗證失敗;第二個參數表示是否允許通過 GET 方式提交的數據通過驗證,0 為不允許,1 為允許,一般為 0 即可。

后兩個參數用于表示提交的表單中是否需要對驗證碼和驗證問答做驗證,第三個參數 $seccodecheck 代表驗證碼,第四個參數 $secqaacheck 代表驗證問答,參數值都是 0 為不驗證,1 為驗證。

所以如果需要在提交后驗證驗證碼,則至少要填寫 3 個參數,即 submitcheck('passwordsubmit', 0, 1) 。

進入函數中會現對提交表單的提交方式、formhash、訪問來源 referer 等數據進行安全性驗證,通過后則會調用 check_seccode 函數對提交過來的驗證碼進行驗證了,根據 check_seccode 的返回值,來給予不同的提示。 check_seccode 函數如何工作的參看 JS 驗證中的 4) 即可。

至此通過 PHP 方式的驗證碼驗證完成。

三、隨機數如何產生的

Discuz! X的隨機數是通過 random 函數產生的,函數在 source/function/function_core.php 文件

代碼如下:

function random($length, $numeric = 0) {

$seed = base_convert(md5(microtime().$_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);

$seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed));

$hash = '';

$max = strlen($seed) - 1;

for($i = 0; $i < $length; $i++) {

$hash .= $seed{mt_rand(0, $max)};

}

return $hash;

}

此函數有兩個參數,$length 表示要獲取的隨機數的位數,$numeric 表示是否要獲取純數字的隨機數,取值 0 或 1。

函數首先使用 microtime 函數獲取當前的微秒級時間戳字符串,然后在后面拼接上單前網站的根目錄路徑,然后進行 MD5 加密,獲得 32 位長的字符串。之后對其進行轉進制,如果要獲取純數字的隨機數,則從 16 進制轉為 10 進制,如果要獲得數字和英文混雜的隨機數,則從 16 進制轉為 35 進制。之后再將轉進制后獲得的字符串,根據是否要獲取純數字隨機數的區別,進行拼接。最后從拼接后的字符串中隨機抽取隨機數的第一位、第二位以此類推,直 至獲取滿足要求的隨機數的位置為止。至此生成了隨機數。

更多信息請查看IT技術專欄

更多信息請查看CMS教程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
91官网在线免费观看| 色哟哟日韩精品| 日韩制服丝袜先锋影音| 亚洲香蕉伊在人在线观| 亚洲一区在线视频| 亚洲综合区在线| 亚洲一区二区欧美| 亚洲国产成人va在线观看天堂| 一区二区三区电影在线播| 一区二区三区在线播| 亚洲成人在线免费| 丝袜亚洲另类欧美| 国内精品国产成人国产三级粉色 | 日韩你懂的在线观看| 日韩一区二区三区在线视频| 日韩欧美国产电影| 国产午夜三级一区二区三| 国产情人综合久久777777| 亚洲欧洲日韩女同| 亚洲在线观看免费视频| 日本成人在线一区| 顶级嫩模精品视频在线看| 色婷婷久久久久swag精品 | 国产调教视频一区| 国产精品成人一区二区三区夜夜夜| 国产精品激情偷乱一区二区∴| 一区二区三区在线影院| 免费在线观看视频一区| 粉嫩av一区二区三区| 欧美性高清videossexo| 久久一夜天堂av一区二区三区 | 成人激情小说网站| 欧美精品日韩精品| 国产日韩一级二级三级| 亚洲精品菠萝久久久久久久| 久久电影国产免费久久电影| 99在线精品一区二区三区| 欧美日韩另类一区| 国产精品久久久久久亚洲毛片| 亚洲一区视频在线| 国产精品一区久久久久| 欧美色精品在线视频| 亚洲国产精品99久久久久久久久| 亚洲一区免费视频| 国产成人综合网站| 日韩欧美国产一区二区在线播放| 亚洲欧美自拍偷拍色图| 另类综合日韩欧美亚洲| 欧美在线一二三| 久久久噜噜噜久久人人看| 亚洲成人你懂的| 91伊人久久大香线蕉| 久久久久亚洲综合| 美国三级日本三级久久99| 欧美性感一区二区三区| 亚洲一区二区在线播放相泽| 国产成人8x视频一区二区 | 精品欧美黑人一区二区三区| 亚洲精品国产无天堂网2021| 粉嫩aⅴ一区二区三区四区五区 | 国产精品久久久久天堂| 国产成人免费在线观看不卡| 日韩欧美国产综合在线一区二区三区| 亚洲美女屁股眼交3| 成人国产在线观看| 中文字幕精品一区二区精品绿巨人| 免费黄网站欧美| 7777精品伊人久久久大香线蕉超级流畅| 国产精品福利影院| av午夜一区麻豆| 欧美极品xxx| 成人免费精品视频| 亚洲欧洲美洲综合色网| av在线不卡观看免费观看| 国产精品久久久久影院| 波多野结衣欧美| 国产精品久久一级| 91亚洲精品乱码久久久久久蜜桃| 中文字幕av不卡| 99国产精品久| 一区二区不卡在线视频 午夜欧美不卡在| 91在线视频免费91| 国产精品福利电影一区二区三区四区| 成人av电影免费在线播放| 自拍av一区二区三区| 欧美自拍丝袜亚洲| 蜜臀久久久99精品久久久久久| 日韩美女主播在线视频一区二区三区| 九九九精品视频| 国产亚洲欧美日韩俺去了| 成人av电影在线播放| 亚洲线精品一区二区三区八戒| 欧美精品乱码久久久久久| 美女精品一区二区| 国产精品视频你懂的| 91福利视频网站| 日本中文字幕一区二区有限公司| 日韩精品中文字幕一区| 福利一区福利二区| 亚洲主播在线观看| 久久夜色精品国产噜噜av| 不卡av免费在线观看| 亚洲国产精品久久人人爱| 亚洲精品一区二区在线观看| 成人高清视频在线观看| 亚洲电影激情视频网站| 欧美成人精品3d动漫h| 成人动漫视频在线| 免费在线欧美视频| 中文字幕日韩一区| 欧美一区二区三区不卡| 成人美女视频在线观看18| 婷婷丁香激情综合| 日本一区二区在线不卡| 欧美日本一区二区三区四区| 国产成人免费网站| 日韩av一区二区三区四区| 国产精品国产自产拍高清av王其| 欧美老肥妇做.爰bbww| 岛国精品在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 高清不卡一区二区在线| 婷婷久久综合九色国产成人 | 一区二区日韩电影| 26uuu国产日韩综合| 欧美喷潮久久久xxxxx| 成人aa视频在线观看| 精品一区二区日韩| 天堂精品中文字幕在线| 亚洲蜜臀av乱码久久精品蜜桃| 精品国产精品网麻豆系列| 欧美日韩中文国产| 91偷拍与自偷拍精品| 国产成人99久久亚洲综合精品| 美腿丝袜亚洲色图| 午夜久久久久久久久| 一区二区在线观看视频| 中文字幕亚洲欧美在线不卡| 久久精品亚洲国产奇米99| 欧美tickling网站挠脚心| 色素色在线综合| 99久久伊人精品| 99久免费精品视频在线观看| 国内久久精品视频| 韩国av一区二区三区在线观看| 五月综合激情日本mⅴ| 亚洲一区免费视频| 亚洲一线二线三线视频| 亚洲一区二区三区爽爽爽爽爽 | 精品久久人人做人人爱| 欧美老人xxxx18| 欧美精品三级日韩久久| 欧美日韩激情在线| 欧美日韩三级一区二区| 欧美日韩国产一二三| 欧美日韩在线观看一区二区 | 成人黄色大片在线观看| 懂色av中文字幕一区二区三区| 高清久久久久久| av不卡免费在线观看| 一本色道久久综合亚洲91| 欧美中文字幕不卡| 欧美三级欧美一级| 制服丝袜激情欧洲亚洲| 日韩一卡二卡三卡四卡| 日韩欧美二区三区| 国产日产欧美精品一区二区三区| 欧美精品一区二区三| 国产精品天干天干在观线| 一区二区三区中文在线| 三级亚洲高清视频| 韩国成人福利片在线播放| 国产.欧美.日韩| 在线视频国产一区| 欧美一二三在线| 国产精品欧美久久久久无广告| 亚洲精品乱码久久久久久日本蜜臀| 亚洲国产综合在线| 经典三级视频一区| 一本一道波多野结衣一区二区| 欧美美女一区二区| 中文成人av在线| 亚洲国产日韩av| 麻豆精品新av中文字幕| 丰满白嫩尤物一区二区| 欧美少妇一区二区| 久久九九久久九九| 亚洲国产欧美在线| 国产91富婆露脸刺激对白| 欧美日韩一区不卡| 国产精品网站在线观看| 美国毛片一区二区三区| av电影在线观看一区| 7777精品久久久大香线蕉| 日本一区二区在线不卡| 日韩成人一区二区| 91福利社在线观看| 国产精品久久久久久久久久久免费看| 亚洲va欧美va人人爽| 床上的激情91.|