Yii2的XSS攻击防范策略分析
本文实例讲述了Yii2的XSS攻击防范策略。分享给大家供大家参考,具体如下:
XSS漏洞修复
原则:不相信客户输入的数据
注意:攻击代码不一定在<script></script>中
①将重要的cookie标记为httponly,这样的话Javascript中的document.cookie语句就不能获取到cookie了.
②只允许用户输入我们期望的数据。例如:年龄的textbox中,只允许用户输入数字。而数字之外的字符都过滤掉。
③对数据进行HtmlEncode处理
④过滤或移除特殊的Html标签,例如:script,iframe,<for<,>for>,"for
⑤过滤JavaScript事件的标签。例如"onclick=","onfocus"等等。
Yii中的XSS防范
<?phpechoCHtml::encode($user->name)?>
此方法的源码:
/** *EncodesspecialcharactersintoHTMLentities. *The[[\yii\base\Application::charset|applicationcharset]]willbeusedforencoding. *@paramstring$contentthecontenttobeencoded *@paramboolean$doubleEncodewhethertoencodeHTMLentitiesin`$content`.Iffalse, *HTMLentitiesin`$content`willnotbefurtherencoded. *@returnstringtheencodedcontent *@seedecode() *@seehttp://www.php.net/manual/en/function.htmlspecialchars.php */ publicstaticfunctionencode($content,$doubleEncode=true) { returnhtmlspecialchars($content,ENT_QUOTES|ENT_SUBSTITUTE,Yii::$app->charset,$doubleEncode); }
htmlspecialchars&htmlentities&urlencode三者的区别:
http://php.net/manual/zh/function.htmlspecialchars.php
http://php.net/manual/zh/function.htmlentities.php
http://cn2.php.net/manual/zh/function.urlencode.php
Availableflagsconstants
ConstantName Description
ENT_COMPAT Willconvertdouble-quotesandleavesingle-quotesalone.
ENT_QUOTES Willconvertbothdoubleandsinglequotes.
ENT_NOQUOTES Willleavebothdoubleandsinglequotesunconverted.
ENT_IGNORE Silentlydiscardinvalidcodeunitsequencesinsteadofreturninganemptystring.Usingthisflagisdiscouragedasit»mayhavesecurityimplications.
ENT_SUBSTITUTE ReplaceinvalidcodeunitsequenceswithaUnicodeReplacementCharacterU+FFFD(UTF-8)or&#FFFD;(otherwise)insteadofreturninganemptystring.
ENT_DISALLOWED ReplaceinvalidcodepointsforthegivendocumenttypewithaUnicodeReplacementCharacterU+FFFD(UTF-8)or&#FFFD;(otherwise)insteadofleavingthemasis.Thismaybeuseful,forinstance,toensurethewell-formednessofXMLdocumentswithembeddedexternalcontent.
ENT_HTML401 HandlecodeasHTML4.01.
ENT_XML1 HandlecodeasXML1.
ENT_XHTML HandlecodeasXHTML.
ENT_HTML5 HandlecodeasHTML5.
htmlspecialchars
ConvertspecialcharacterstoHTMLentities
stringhtmlspecialchars( string$string [,int$flags=ENT_COMPAT|ENT_HTML401 [,string$encoding=ini_get("default_charset") [,bool$double_encode=true] ] ] )
Thetranslationsperformedare:
&(ampersand)becomes&
"(doublequote)becomes"whenENT_NOQUOTESisnotset.
'(singlequote)becomes'(or')onlywhenENT_QUOTESisset.
<(lessthan)becomes<
>(greaterthan)becomes>
<?php $new=htmlspecialchars("<ahref='test'>Test</a>",ENT_QUOTES); echo$new;//<ahref='test'>Test</a> ?>
htmlentities
ConvertallapplicablecharacterstoHTMLentities
stringhtmlentities( string$string [,int$flags=ENT_COMPAT|ENT_HTML401 [,string$encoding=ini_get("default_charset") [,bool$double_encode=true] ] ] )
<?php $str="A'quote'is<b>bold</b>"; //Outputs:A'quote'is<b>bold</b> echohtmlentities($str); //Outputs:A'quote'is<b>bold</b> echohtmlentities($str,ENT_QUOTES); ?>
urlencode
URL编码是为了符合url的规范。因为在标准的url规范中中文和很多的字符是不允许出现在url中的。
例如在baidu中搜索"测试汉字"。URL会变成
http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477
所谓URL编码就是:把所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)
此字符串中除了-_.之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与WWW表单POST数据的编码方式是一样的,同时与application/x-www-form-urlencoded的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与RFC1738编码(参见rawurlencode())不同。
<?php echo'<ahref="mycgi?foo=',urlencode($userinput),'">'; ?>
<?php $query_string='foo='.urlencode($foo).'&bar='.urlencode($bar); echo'<ahref="mycgi?'.htmlentities($query_string).'">'; ?>
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。