跨站請(qǐng)求偽造(英語(yǔ):Cross-site request forgery),也被稱為?one-click attack?或者?session riding,通??s寫為?CSRF?或者?XSRF, 是一種挾制用戶在當(dāng)前已登錄的Web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法。
跨站請(qǐng)求攻擊,簡(jiǎn)單地說(shuō),是攻擊者通過(guò)一些技術(shù)手段欺騙用戶的瀏覽器去訪問(wèn)一個(gè)自己曾經(jīng)認(rèn)證過(guò)的網(wǎng)站并運(yùn)行一些操作(如發(fā)郵件,發(fā)消息,甚至財(cái)產(chǎn)操作如轉(zhuǎn)賬和購(gòu)買商品)。 ? ? ? ? ? ? (推薦學(xué)習(xí):yii框架)
由于瀏覽器曾經(jīng)認(rèn)證過(guò),所以被訪問(wèn)的網(wǎng)站會(huì)認(rèn)為是真正的用戶操作而去運(yùn)行。
這利用了web中用戶身份驗(yàn)證的一個(gè)漏洞:簡(jiǎn)單的身份驗(yàn)證只能保證請(qǐng)求發(fā)自某個(gè)用戶的瀏覽器,卻不能保證請(qǐng)求本身是用戶自愿發(fā)出的。
yii2的csrf,這里簡(jiǎn)單介紹一下它的驗(yàn)證機(jī)制。
取用于csrf驗(yàn)證的token值;判斷用于csrf的token是否存在,如果不存在則使用generateCsrfToken()生成。
驗(yàn)證web\Controller中的beforeAction()方法中有Yii::$app->getRequest()->validateCsrfToken()判斷,用于驗(yàn)證csrf。?
一般我的認(rèn)識(shí)yii2的csrf都是從Yii::$app->request->getCsrfToken()開(kāi)始;好的,我們就從getCsrfToken()說(shuō)起。 此方法在yii\web\Request.php中:
/** * Returns the token used to perform CSRF validation. * 返回用于執(zhí)行CSRF驗(yàn)證的token * This token is a masked version of [[rawCsrfToken]] to prevent [BREACH attacks](http://breachattack.com/). * This token may be passed along via a hidden field of an HTML form or an HTTP header value * to support CSRF validation. * @param boolean $regenerate whether to regenerate CSRF token. When this parameter is true, each time * this method is called, a new CSRF token will be generated and persisted (in session or cookie). * @return string the token used to perform CSRF validation. */ public function getCsrfToken($regenerate = false) { if ($this->_csrfToken === null || $regenerate) { if ($regenerate || ($token = $this->loadCsrfToken()) === null) { //loadCsrfToken()就是在cookie或者session中獲取token值 $token = $this->generateCsrfToken(); //如果token為空則調(diào)用generateCsrfToken()去生成 } // the mask doesn't need to be very random $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-.'; $mask = substr(str_shuffle(str_repeat($chars, 5)), 0, static::CSRF_MASK_LENGTH); // The + sign may be decoded as blank space later, which will fail the validation $this->_csrfToken = str_replace('+', '.', base64_encode($mask . $this->xorTokens($token, $mask))); } return $this->_csrfToken; } /** * Loads the CSRF token from cookie or session. * @return string the CSRF token loaded from cookie or session. Null is returned if the cookie or session * does not have CSRF token. */ protected function loadCsrfToken() { if ($this->enableCsrfCookie) { return $this->getCookies()->getValue($this->csrfParam); //cookie中獲取csrf的token } else { return Yii::$app->getSession()->get($this->csrfParam); //session中獲取csrf的token } } /** * Creates a cookie with a randomly generated CSRF token. * Initial values specified in [[csrfCookie]] will be applied to the generated cookie. * @param string $token the CSRF token * @return Cookie the generated cookie * @see enableCsrfValidation */ protected function createCsrfCookie($token) { $options = $this->csrfCookie; $options['name'] = $this->csrfParam; $options['value'] = $token; return new Cookie($options); } /** * Generates an unmasked random token used to perform CSRF validation. * @return string the random token for CSRF validation. */ protected function generateCsrfToken() { $token = Yii::$app->getSecurity()->generateRandomString(); //生成隨機(jī)的安全字符串 if ($this->enableCsrfCookie) { $cookie = $this->createCsrfCookie($token); //createCsrfCookie()用于生成csrf的key=>value形式的token Yii::$app->getResponse()->getCookies()->add($cookie); //將生成key=>value保存到cookies } else { Yii::$app->getSession()->set($this->csrfParam, $token); //將csrf的token存在session中 } return $token; } /** * 每次調(diào)用控制器中的方法的時(shí)候都會(huì)調(diào)用下面的Yii::$app->getRequest()->validateCsrfToken()驗(yàn)證 * @inheritdoc */ public function beforeAction($action) { if (parent::beforeAction($action)) { if ($this->enableCsrfValidation && Yii::$app->getErrorHandler()->exception === null && !Yii::$app->getRequest()->validateCsrfToken()) { throw new BadRequestHttpException(Yii::t('yii', 'Unable to verify your data submission.')); } return true; } else { return false; } } /** * 校驗(yàn)方法 * Performs the CSRF validation. * * This method will validate the user-provided CSRF token by comparing it with the one stored in cookie or session. * This method is mainly called in [[Controller::beforeAction()]]. * * Note that the method will NOT perform CSRF validation if [[enableCsrfValidation]] is false or the HTTP method * is among GET, HEAD or OPTIONS. * * @param string $token the user-provided CSRF token to be validated. If null, the token will be retrieved from * the [[csrfParam]] POST field or HTTP header. * This parameter is available since version 2.0.4. * @return boolean whether CSRF token is valid. If [[enableCsrfValidation]] is false, this method will return true. */ public function validateCsrfToken($token = null) { $method = $this->getMethod(); // only validate CSRF token on non-"safe" methods http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1 if (!$this->enableCsrfValidation || in_array($method, ['GET', 'HEAD', 'OPTIONS'], true)) { return true; } $trueToken = $this->loadCsrfToken(); if ($token !== null) { return $this->validateCsrfTokenInternal($token, $trueToken); } else { return $this->validateCsrfTokenInternal($this->getBodyParam($this->csrfParam), $trueToken) || $this->validateCsrfTokenInternal($this->getCsrfTokenFromHeader(), $trueToken); //getCsrfTokenFromHeader()這個(gè)我也不太理解,還請(qǐng)指點(diǎn)一下 } } /** * @return string the CSRF token sent via [[CSRF_HEADER]] by browser. Null is returned if no such header is sent. */ public function getCsrfTokenFromHeader() { $key = 'HTTP_' . str_replace('-', '_', strtoupper(static::CSRF_HEADER)); return isset($_SERVER[$key]) ? $_SERVER[$key] : null; } /** * Validates CSRF token * * @param string $token * @param string $trueToken * @return boolean */ private function validateCsrfTokenInternal($token, $trueToken) { $token = base64_decode(str_replace('.', '+', $token)); //解碼從客戶端獲取的csrf的token $n = StringHelper::byteLength($token); if ($n <= static::CSRF_MASK_LENGTH) { return false; } $mask = StringHelper::byteSubstr($token, 0, static::CSRF_MASK_LENGTH); $token = StringHelper::byteSubstr($token, static::CSRF_MASK_LENGTH, $n - static::CSRF_MASK_LENGTH); $token = $this->xorTokens($mask, $token); return $token === $trueToken; //驗(yàn)證從客戶端獲取的csrf的token和真實(shí)的token是否相等 }
以上是yii csrf是什么的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)代碼編輯軟件(SublimeText3)

在當(dāng)前信息時(shí)代,大數(shù)據(jù)、人工智能、云計(jì)算等技術(shù)已經(jīng)成為了各大企業(yè)關(guān)注的熱點(diǎn)。在這些技術(shù)中,顯卡渲染技術(shù)作為一種高性能圖形處理技術(shù),受到了越來(lái)越多的關(guān)注。顯卡渲染技術(shù)被廣泛應(yīng)用于游戲開(kāi)發(fā)、影視特效、工程建模等領(lǐng)域。而對(duì)于開(kāi)發(fā)者來(lái)說(shuō),選擇一個(gè)適合自己項(xiàng)目的框架,是一個(gè)非常重要的決策。在當(dāng)前的語(yǔ)言中,PHP是一種頗具活力的語(yǔ)言,一些優(yōu)秀的PHP框架如Yii2、Ph

Yii框架是一個(gè)開(kāi)源的PHPWeb應(yīng)用程序框架,提供了眾多的工具和組件,簡(jiǎn)化了Web應(yīng)用程序開(kāi)發(fā)的流程,其中數(shù)據(jù)查詢是其中一個(gè)重要的組件之一。在Yii框架中,我們可以使用類似SQL的語(yǔ)法來(lái)訪問(wèn)數(shù)據(jù)庫(kù),從而高效地查詢和操作數(shù)據(jù)。Yii框架的查詢構(gòu)建器主要包括以下幾種類型:ActiveRecord查詢、QueryBuilder查詢、命令查詢和原始SQL查詢

隨著互聯(lián)網(wǎng)的不斷發(fā)展,Web應(yīng)用程序開(kāi)發(fā)的需求也越來(lái)越高。對(duì)于開(kāi)發(fā)人員而言,開(kāi)發(fā)應(yīng)用程序需要一個(gè)穩(wěn)定、高效、強(qiáng)大的框架,這樣可以提高開(kāi)發(fā)效率。Yii是一款領(lǐng)先的高性能PHP框架,它提供了豐富的特性和良好的性能。Yii3是Yii框架的下一代版本,它在Yii2的基礎(chǔ)上進(jìn)一步優(yōu)化了性能和代碼質(zhì)量。在這篇文章中,我們將介紹如何使用Yii3框架來(lái)開(kāi)發(fā)PHP應(yīng)用程序。

隨著Web應(yīng)用需求的不斷增長(zhǎng),開(kāi)發(fā)者們?cè)谶x擇開(kāi)發(fā)框架方面也越來(lái)越有選擇的余地。Symfony和Yii2是兩個(gè)備受歡迎的PHP框架,它們都具有強(qiáng)大的功能和性能,但在面對(duì)需要開(kāi)發(fā)大型Web應(yīng)用時(shí),哪個(gè)框架更適合呢?接下來(lái)我們將對(duì)Symphony和Yii2進(jìn)行比較分析,以幫助你更好地進(jìn)行選擇?;靖攀鯯ymphony是一個(gè)由PHP編寫的開(kāi)源Web應(yīng)用框架,它是建立

隨著云計(jì)算技術(shù)的不斷發(fā)展,數(shù)據(jù)的備份已經(jīng)成為了每個(gè)企業(yè)必須要做的事情。在這樣的背景下,開(kāi)發(fā)一款高可用的云備份系統(tǒng)尤為重要。而PHP框架Yii是一款功能強(qiáng)大的框架,可以幫助開(kāi)發(fā)者快速構(gòu)建高性能的Web應(yīng)用程序。下面將介紹如何使用Yii框架開(kāi)發(fā)一款高可用的云備份系統(tǒng)。設(shè)計(jì)數(shù)據(jù)庫(kù)模型在Yii框架中,數(shù)據(jù)庫(kù)模型是非常重要的一部分。因?yàn)閿?shù)據(jù)備份系統(tǒng)需要用到很多的表和關(guān)

Laravel和Yii的主要區(qū)別在于設(shè)計(jì)理念、功能特性和使用場(chǎng)景。1.Laravel注重開(kāi)發(fā)的簡(jiǎn)潔和愉悅,提供豐富的功能如EloquentORM和Artisan工具,適合快速開(kāi)發(fā)和初學(xué)者。2.Yii強(qiáng)調(diào)性能和效率,適用于高負(fù)載應(yīng)用,提供高效的ActiveRecord和緩存系統(tǒng),但學(xué)習(xí)曲線較陡。

使用Docker容器化和部署Yii應(yīng)用的步驟包括:1.創(chuàng)建Dockerfile,定義鏡像構(gòu)建過(guò)程;2.使用DockerCompose啟動(dòng)Yii應(yīng)用和MySQL數(shù)據(jù)庫(kù);3.優(yōu)化鏡像大小和性能。這不僅涉及到具體的技術(shù)操作,還包括理解Dockerfile的工作原理和最佳實(shí)踐,以確保高效、可靠的部署。

隨著互聯(lián)網(wǎng)的快速發(fā)展,API成為了各種應(yīng)用間數(shù)據(jù)交換的重要方式。因此,開(kāi)發(fā)一款易于維護(hù)、高效、穩(wěn)定的API框架變得越來(lái)越重要。而在選擇API框架時(shí),Yii2和Symfony是兩個(gè)備受開(kāi)發(fā)者歡迎的選擇。那么,哪一個(gè)更適合API開(kāi)發(fā)呢?本文將對(duì)這兩個(gè)框架進(jìn)行比較,并給出一些結(jié)論。一、基本介紹Yii2和Symfony都是成熟的PHP框架,都有相應(yīng)的擴(kuò)展,可以用于開(kāi)
