跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。 (推荐学习:yii框架)
由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。
这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
yii2的csrf,这里简单介绍一下它的验证机制。
取用于csrf验证的token值;判断用于csrf的token是否存在,如果不存在则使用generateCsrfToken()生成。
验证web\Controller中的beforeAction()方法中有Yii::$app->getRequest()->validateCsrfToken()判断,用于验证csrf。
一般我的认识yii2的csrf都是从Yii::$app->request->getCsrfToken()开始;好的,我们就从getCsrfToken()说起。 此方法在yii\web\Request.php中:
/** * Returns the token used to perform CSRF validation. * 返回用于执行CSRF验证的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为空则调用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(); //生成随机的安全字符串 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; } /** * 每次调用控制器中的方法的时候都会调用下面的Yii::$app->getRequest()->validateCsrfToken()验证 * @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; } } /** * 校验方法 * 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()这个我也不太理解,还请指点一下 } } /** * @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; //验证从客户端获取的csrf的token和真实的token是否相等 }
以上是yii csrf是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

Yii框架适用于企业级应用、中小型项目和个人项目。1)在企业级应用中,Yii的高性能和可扩展性使其在电商平台等大型项目中表现出色。2)中小型项目中,Yii的Gii工具帮助快速搭建原型和MVP。3)个人项目和开源项目中,Yii的轻量级特性使其适合小型网站和博客。

Yii框架适合构建高效、安全和可扩展的Web应用。1)Yii基于MVC架构,提供组件化设计和安全特性。2)它支持基本CRUD操作和高级RESTfulAPI开发。3)提供日志记录和调试工具栏等调试技巧。4)建议使用缓存和延迟加载进行性能优化。

Yii的目的是让开发者快速、高效地构建Web应用。其实现通过以下方式:1)组件化设计和MVC架构提高代码可维护性和可重用性;2)Gii工具自动生成代码,提升开发速度;3)延迟加载和缓存机制优化性能;4)灵活的扩展性便于集成第三方库;5)提供RBAC功能处理复杂业务逻辑。

1)简单站点,yiioOfferSeaseAseaseAseaseAseAseAseAseAseAseAseAseAseAseAseAseAseAseAseAseAseAseAseAseAseAseAssetUpandRapidDevelopment.2)forcomplexprojects,ItmodularityAndrbacSystemManagesManagesManageSmanageScalagionsalageScalabilityscalability calability andsecurity andsecurity andsecurity。

Yii框架在未来PHP框架发展中将继续扮演重要角色。1)Yii提供高效的MVC架构、强大的ORM系统、内置缓存机制和丰富扩展库。2)其组件化设计和灵活性使其适用于复杂业务逻辑和RESTfulAPI开发。3)Yii不断更新以适应现代PHP特性和技术趋势,如微服务和容器化。

Yii框架适合开发各种规模的Web应用,其优势在于高性能和丰富的功能集。1)Yii采用MVC架构,核心组件包括ActiveRecord、Widget和Gii工具。2)通过请求处理流程,Yii高效处理HTTP请求。3)基本用法展示了创建控制器和视图的简单示例。4)高级用法通过ActiveRecord展示了数据库操作的灵活性。5)调试技巧包括使用调试工具栏和日志系统。6)性能优化建议使用缓存和数据库查询优化,遵循编码规范和依赖注入以提高代码质量。

在 Yii2 中,显示错误提示有两种主要方法。一种是使用 Yii::$app->errorHandler->exception(),在异常发生时自动捕获和显示错误。另一种是使用 $this->addError(),在模型验证失败时显示错误,并可以在视图中通过 $model->getErrors() 访问。视图中,可以用 if ($errors = $model->getErrors())

随着PHP框架技术的不断发展,Yi2和TP5作为两大主流框架备受关注。它们都以出色的性能、丰富的功能和健壮性着称,但却存在着一些差异和优劣势。了解这些区别对于开发者在选择框架时至关重要。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载
最流行的的开源编辑器

禅工作室 13.0.1
功能强大的PHP集成开发环境