Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
´ÓYii2µÄRequest¿´ÆäCSRF·À·¶²ßÂÔ
 
×÷ÕߣºGaniks À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ£º2015-8-21
  2934  次浏览      29

ÏÈ»­Ò»·ùÁ÷³ÌͼÀíÀí˼·£º

1. ÎÊÌâÊÇÕâÑùµÄ£º

½ñÌìÔÚ´¦ÀíÒ»¸öÕâÑùµÄÐèÇó£¬ ÔÚ app\controllers\LoginController.phpÖж¨ÒåÁËindex·½·¨À´´¦ÀíµÇ¼£¨Ö÷ÒªÊÇÓÃÓÚ·ÇWebÒ³ÃæµÇ¼£¬±ÈÈçCurl -X POST http://api/login£©£º

½á¹ûÄØ£¬ ÎÞÂÛÊÇÓòâÊÔ¹¤¾ßPOSTMAN»¹ÊÇÓÃÃüÁîÐÐCURLÇëÇó×ÜÊÇ»áµÃµ½ http400:Bad RequestµÄ´íÎó£»¶øÈç¹ûÓÃWebÍøÒ³·½Ê½GET·ÃÎÊ(È¥³ýverbFilterµÄPOSTÏÞÖÆ)£¬ÊÇÕý³£µÄ

ͨ¹ýÌû×ÓÏÂÃæµÄÌû×ÓÕÒµ½ÁËÎÊÌâµÄËùÔÚ£¬ÊÇCSRFÑéÖ¤µÄÔ­Òò£»

ÒòΪWebÍøÒ³·ÃÎʵÄʱºòform±íµ¥ÖлáÓжÔÓ¦µÄÒ»¸öÒþ²Øinput:_csrf½øÐÐÁËÑéÖ¤²Å¿ÉÒÔÕý³£½øÐзÃÎÊ£»

¶ø·ÇÍøÒ³·ÃÎÊ·½Ê½£¨²»Í¨¹ýWeb±íµ¥£©ÊÇÎÞ·¨Í¨¹ýcsrfÑéÖ¤µÄ¡£

¶øCURL·ÃÎÊ·½Ê½¶¼Ã»ÓÐÓõ½cookie£¬ ¹ÊÎÒÈÏΪûÓбØÒªÔÚÕâÀï·À·¶csrf¹¥»÷£¬ÔÝʱÓÃÏÂÃæµÄ°ì·¨½«Æä½ûÓá£

class Controller extends \yii\base\Controller
{
/**
* @var boolean whether to enable CSRF validation for the actions in this controller.
* CSRF validation is enabled only when both this property and [[Request::enableCsrfValidation]] are true.
*/
public $enableCsrfValidation = false; <- set this to false

2. ³Ã»úÀ´Ñо¿Ï Yii2 µÄ CSRF ·À·¶»úÖÆ

ʲôÊÇ CSRF ¹¥»÷£¿

¼òµ¥Ëµ£¬ ¹¥»÷ÕßµÁÓÃÁËÄãµÄÉí·Ý£¬ÒÔÄãµÄÃûÒå·¢ËͶñÒâÇëÇó¡£

 

×îÓÐЧµØÒ»¸ö·½·¨Ô­ÀíÊÇÕâÑùµÄ£º

Cookie Hashing£¬ È÷þÎñÆ÷·¢Ë͸ø¿Í»§¶ËµÄËùÓÐ±íµ¥Öж¼±êʾһ¸öËæ»úÖµ_csrf£¬²¢Í¬Ê±ÔÚ¿Í»§¶ËµÄCOOKIEÖб£´æÒ»¸öÏà¹ØÁªµÄtoken;

ÑéÖ¤µÄʱºò£¬·þÎñ¶Ëÿ´Î¶Ô½ÓÊÕµ½µÄÇëÇó_POST()¹ýÀ´µÄÒ»¸öinput hidden _csrf¸ú¿Í»§¶ËµÄCOOKIEÖеÄtoken½øÐжÔÕÕÑéÖ¤

¹¥»÷Õß¹¥»÷µÄÔ­ÀíÊÇÀûÓÃÁ˿ͻ§¶ËµÄCOOKIE£¬µ«Êǹ¥»÷ÕßÊǵò»µ½COOKIE¾ßÌåµÄÄÚÈݵģ¬ËûÖ»ÊÇÀûÓÃ(ÕâÀïÅ׿ªXSS¹¥»÷µÄ¿ÉÄÜÐÔ,ÓÉÓÚÓû§µÄCookieºÜÈÝÒ×ÓÉÓÚÍøÕ¾µÄXSS©¶´¶ø±»µÁÈ¡£¬Õâ¾ÍÁíÍâµÄ1%¡£Ò»°ãµÄ¹¥»÷Õß¿´µ½ÓÐÐèÒªËãHashÖµ£¬»ù±¾¶¼»á·ÅÆúÁË)£»ËùÒÔ¹¥»÷Õßû·¨ÔÚ¹¥»÷URLÖмÓÈëtoken£¬ÕâÑù¾ÍÎÞ·¨Í¨¹ýÑéÖ¤¡£

Õâ¿ÉÄÜÊÇ×î¼òµ¥µÄ½â¾ö·½°¸ÁË£¬ÒòΪ¹¥»÷Õß²»ÄÜ»ñµÃµÚÈý·½µÄCookie(ÀíÂÛÉÏ)£¬ËùÒÔ±íµ¥ÖеÄÊý¾ÝÒ²¾Í¹¹Ôìʧ°ÜÁË:>

À´¿´¿´£ºYii2ÊDz»ÊÇÕâô¸ÉµÄ¡£

3. ´ÓÍâµ½ÄÚ̽¾¿

YiiÎĵµÖÐÓÐÕâôһ¶Î»°ÊÇ¶ÔÆäCSRF·À·¶»úÖÆµÄ¸ÅÊö£º

 When CSRF validation is enabled, forms submitted to an Yii Web application must be originated
* from the same application. If not, a 400 HTTP exception will be raised.
*
* Note, this feature requires that the user client accepts cookie. Also, to use this feature,
* forms submitted via POST method must contain a hidden input whose name is specified by [[csrfParam]].
* You may use [[\yii\helpers\Html::beginForm()]] to generate his hidden input.
*
* In JavaScript, you may get the values of [[csrfParam]] and [[csrfToken]] via `yii.getCsrfParam()` and
* `yii.getCsrfToken()`, respectively. The [[\yii\web\YiiAsset]] asset must be registered.
* You also need to include CSRF meta tags in your pages by using [[\yii\helpers\Html::csrfMetaTags()]]

3.1 ÏÈ¿´¿´ä¯ÀÀÆ÷ÖеÄCSRF¶¼ÓÐÄÄЩÌåÏÖ£º

ÔÚµÚÒ»ÕÅͼƬÖУ¬ºÜÃ÷ÏÔ£¬<meta> ºÍ <form>ÖзֱðÓÐÒ»¸ö csrf_token£¬²¢ÇÒÊÇÒ»ÖµÄ

ÔÚµÚ¶þÕÂͼƬÖУ¬cookies['_csrf']ÖÐÒ²ÓÐÒ»¸ö¸ü³¤µÄ´®´®£¬Õâ¸öÊÇ¡£¡£¡££¿

¾­¹ýÒ»·¬Ñо¿£¬Õâ¸ö³¤³¤µÄ´®ÊÇÒòΪYiiĬÈÏ¿ªÆôÁË cookieValidation

½ûÓÃenableCookieValidationÈ÷ÖÎöCSRFµÄ¹ý³Ì±äµÃ¼òµ¥

ÔÚ configÎļþÖнûÓãº

'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' => '83r5HbITBiMfmiYPOZFdL-raVp4O1VV4',
'enableCookieValidation' => false,
'enableCsrfValidation' => true,
]

À´¶Ô±ÈϽûÓÃ֮ǰºÍÖ®ºóµÄÇø±ð£º

ÕâÑù _csrf ¾Í¼òµ¥¶àÁË£¬µ±È»ÕâÊDz»°²È«µÄ

3.2 ´Óview¿ªÊ¼Ñ°ÕÒcsrf

3.2.1 ÏÈÕÒÕÒ±íµ¥ÀïµÄ app\views\site\login.php

ûÓÐÕÒµ½csrfµÄ¶¨Òå,ÄÇÓ¦¸ÃÊÇ·â×°µ½ ActiveFormÁË

3.2.2 vendor\yiisoft\yii2\widgets\ActiveForm.php

class ActiveForm extends yii\base\Widget
{
public function init()
{
...
echo yii\helpers\Html::beginForm(...);
}

public function run()
{
...
echo yii\helpers\Html::endForm(...);
}
}

3.2.3 yii\helpers\Html

ÖÕÓÚÕÒµ½ÁËCSRF

public static function beginForm($action = '', $method = 'post', $options = [])
{
$action = Url::to($action);
$hiddenInputs = [];
$request = Yii::$app->getRequest();
if ($request->enableCsrfValidation && !strcasecmp($method, 'post')) {
$hiddenInputs[] = static::hiddenInput($request->csrfParam, $request->getCsrfToken());
}
... ...

3.2.4 È¥app\views\layouts\main.php¿´¿´ÀïÃæµÄCSRFÊÇÔõôÀ´µÄ

<head>
<meta charset="<?= Yii::$app->charset ?>"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<?= Html::csrfMetaTags() ?>
<title><?= Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>

ÕýºÃÒ²ÊÇÔÚ 3.2.3 yii\helpers\HtmlÖж¨ÒåµÄ

/**
* Generates the meta tags containing CSRF token information.
* @return string the generated meta tags
* @see Request::enableCsrfValidation
*/
public static function csrfMetaTags()
{
$request = Yii::$app->getRequest();
if ($request instanceof Request && $request->enableCsrfValidation) {
return static::tag('meta', '', ['name' => 'csrf-param', 'content' => $request->csrfParam]) . "\n "
. static::tag('meta', '', ['name' => 'csrf-token', 'content' => $request->getCsrfToken()]) . "\n";
} else {
return '';
}

3.2.5 Ô­À´csrf¶¼ÊÇÓÉ Yii::$app->request´¦ÀíµÄ

headÖÐ

$request->getCsrfToken()

formÖÐ

$request->csrfParam
$request->getCsrfToken()

¿´À´ Õû¸öÑéÖ¤µÄÁ÷³Ì¶¼ÊÇÓÉgetCsrfToken()´¥·¢µÄ¡£

3.3 Ñо¿Ô´Âë

À´¸öÁ÷³Ìͼ(ÊÖ»æ°æ)£º

   
2934 ´Îä¯ÀÀ       29
 
Ïà¹ØÎÄÕÂ

iOSÓ¦Óð²È«¿ª·¢£¬Äã²»ÖªµÀµÄÄÇЩÊÂÊõ
Web°²È«Ö®SQL×¢Èë¹¥»÷
ÒÆ¶¯APP°²È«ÔÚÉøÍ¸²âÊÔÖеÄÓ¦ÓÃ
´ÓGoogle±¸·Ý»¥ÁªÍø¿´¡°Êý¾Ý°²È«¡±
 
Ïà¹ØÎĵµ

web°²È«Éè¼ÆÓë·À»¤
»¥ÁªÍøº£Á¿ÄÚÈݰ²È«´¦Àí¼¼Êõ
ºÚ¿Í¹¥»÷Óë·À·¶¼¼Êõ
WEBºÚºÐ°²È«¼ì²â
 
Ïà¹Ø¿Î³Ì

WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

iOSÓ¦Óð²È«¿ª·¢
Web°²È«Ö®SQL×¢Èë¹¥»÷
APP°²È«ÔÚÉøÍ¸²âÊÔÖеÄÓ¦ÓÃ
³õ̽PHPµÄSQL×¢Èë¹¥»÷µÄ¼¼Êõ
´ÓGoogle±¸·Ý¿´¡°Êý¾Ý°²È«¡±

WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
×¢²áÐÅÏ¢°²È«×¨ÒµÈËÔ±(CISP)
ÐÅÏ¢°²È«¹ÜÀí
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶

ÖйúÒøÐÐ ÐÅÏ¢°²È«¼¼Êõ¼°Éî¶È·ÀÓù
WebÓ¦Óð²È«¼Ü¹¹¡¢ÈëÇÖ¼ì²âÓë·À»¤
ij²ÆË°ÁìÓòÖªÃûIT·þÎñÉÌ Web°²È«²âÊÔ
ÆÕÈð¿Ë˹ web°²È«Éè¼Æ¡¢²âÊÔÓëÓÅ»¯
±±¾©ºÍÀûʱ ÐÔÄܺͰ²È«ÐÔ²âÊÔ
SUNÖйú¹¤³ÌÑо¿Ôº JSF¿ò¼Ü¡¢°²È«