您现在的位置是:首页 > 学无止境 > Web网站首页Web laravel框架中防止XSS安全漏洞插件包
laravel框架中防止XSS安全漏洞插件包
- Web
- 2019-08-11
简介作为一个合格的Web开发工程师,必须遵循一个安全原则:永远不要信任用户提交的数据。字数
1516.5
XSS也称跨站脚本攻击(Cross Site Scripting),恶意攻击者往Web页面里插入恶意JavaScript代码,当用户浏览该页之时,嵌入其中Web里面的JavaScript代码会被执行,从而达到恶意攻击用户的目的。
一种比较常见的XSS攻击是Cookie窃取。我们都知道网站是通过Cookie来辨别用户身份的,一旦恶意攻击者能在页面中执行JavaScript代码,他们即可通过JavaScript读取并窃取你的Cookie,拿到你的Cookie以后即可伪造你的身份登录网站。
有两种方法可以避免XSS攻击:
-
第一种,对用户提交的数据进行过滤;
-
第二种,Web网页显示时对数据进行特殊处理,一般使用htmlspecialchars()
输出。
Laravel的Blade语法{{ }}
会自动调用PHP htmlspecialchars
函数来避免XSS攻击。但是因为我们支持WYSIWYG编辑器,我们使用的是{!! !!}
来打印用户提交的话题内容:
<div class="topic-body">
{!! $topic->body !!}</div>
Blade的{!! !!}
语法是直接数据,不会对数据做任何处理。在我们这种场景下,因为业务逻辑的特殊性,第二种方法不适用,我们将使用第一种方法,对用户提交的数据进行过滤来避免XSS攻击。
编辑器Simditor默认为我们的内容提供转义,我们可以使用以下这段代码来测试:
编辑器中输入:
测试xss攻击
<script>alert(211);</script>
测试xss攻击
存入数据库中的是:
<p>测试xss攻击</p>
<p><script>alert(211);</script></p>
<p><br /></p>
<p>测试xss攻击<br /></p>
可见Simditor编辑器默认为我们输入的内容提供转义了!
页面上显示:
很多同学会大意地认为前端页面有WYSIWYG为我们做转义,就是安全的,事实并不是这样的。
现实生活中,不良用户不一定是网页上向服务器提交内容,有太多的工具可以执行此操作
接下来我们一起解决此问题。
HTMLPurifier
PHP一个比较合理的解决方案是HTMLPurifier。HTMLPurifier本身就是一个独立的项目,运用『白名单机制』对HTML文本信息进行XSS过滤。这种过滤机制可以有效地防止各种XSS变种攻击。只通过我们认为安全的标签和属性,对于未知的全部过滤。
「白名单机制」指的是使用配置信息来定义「HTML标签」,「标签属性」和「CSS属性」数组,在执行clean()
方法时,只允许配置信息「白名单」里出现的元素通过,其他都进行过滤。
如配置信息:
'HTML.Allowed' => 'div,em,a[href|title|style],ul,ol,li,p[style],br','CSS.AllowedProperties' => 'font,font-size,font-weight,font-style,font-family',
当用户提交时:
<a someproperty="somevalue" href="http://example.com" style="color:#ccc;font-size:16px">
文章内容<script>alert('Alerted')</script></a>
会被解析为:
<a href="http://example.com" style="font-size:16px">
文章内容</a>
以下内容因为未指定会被过滤:
-
someproperty
未指定的HTML属性
-
color
未指定的CSS属性
-
script
未指定的HTML标签
1.安装Laravel 5的HTMLPurifier
使用Composer安装:
$ composer require "mews/purifier:~2.0"
2.配置Laravel 5的HTMLPurifier
命令行下运行
$ php artisan vendor:publish --provider="Mews\Purifier\PurifierServiceProvider"
请将配置信息替换为以下:
配置/ purifier.php
<?phpreturn [
'encoding' => 'UTF-8',
'finalize' => true,
'cachePath' => storage_path('app/purifier'),
'cacheFileMode' => 0755,
'settings' => [
'user_topic_body' => [
'HTML.Doctype' => 'XHTML 1.0 Transitional',
'HTML.Allowed' => 'div,b,strong,i,em,a[href|title],ul,ol,ol[start],li,p[style],br,span[style],img[width|height|alt|src],*[style|class],pre,hr,code,h2,h3,h4,h5,h6,blockquote,del,table,thead,tbody,tr,th,td',
'CSS.AllowedProperties' => 'font,font-size,font-weight,font-style,margin,width,height,font-family,text-decoration,padding-left,color,background-color,text-align',
'AutoFormat.AutoParagraph' => true,
'AutoFormat.RemoveEmpty' => true,
],
],];
里配置的user_topic_body
的英文我们为话题内容定制的,配合clean()
方法使用:
$topic->body = clean($topic->body, 'user_topic_body');
开始过滤
一切准备就绪,现在我们只需要在数据入库前进行过滤即可:
应用程序/观察员/ TopicObserver.php
<?phpnamespace App\Observers;use App\Models\Topic;// creating, created, updating, updated, saving,// saved, deleting, deleted, restoring, restoredclass TopicObserver{
public function saving(Topic $topic)
{
$topic->body = clean($topic->body, 'user_topic_body');
$topic->excerpt = make_excerpt($topic->body);
}}
HTMLPurifier把白名单里设定的内容通过,script
标签未设定,自动过滤掉。
至此XSS安全漏洞已修复。
转载:
感谢您对莫愁个人博客网站平台的认可,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源莫愁个人博客 https://www.mochoublog.com/study/315.html”。
- Web
- 2019-08-11
XSS也称跨站脚本攻击(Cross Site Scripting),恶意攻击者往Web页面里插入恶意JavaScript代码,当用户浏览该页之时,嵌入其中Web里面的JavaScript代码会被执行,从而达到恶意攻击用户的目的。
一种比较常见的XSS攻击是Cookie窃取。我们都知道网站是通过Cookie来辨别用户身份的,一旦恶意攻击者能在页面中执行JavaScript代码,他们即可通过JavaScript读取并窃取你的Cookie,拿到你的Cookie以后即可伪造你的身份登录网站。
有两种方法可以避免XSS攻击:
-
第一种,对用户提交的数据进行过滤;
-
第二种,Web网页显示时对数据进行特殊处理,一般使用
htmlspecialchars()
输出。
Laravel的Blade语法{{ }}
会自动调用PHP htmlspecialchars
函数来避免XSS攻击。但是因为我们支持WYSIWYG编辑器,我们使用的是{!! !!}
来打印用户提交的话题内容:
<div class="topic-body">
{!! $topic->body !!}</div>
Blade的{!! !!}
语法是直接数据,不会对数据做任何处理。在我们这种场景下,因为业务逻辑的特殊性,第二种方法不适用,我们将使用第一种方法,对用户提交的数据进行过滤来避免XSS攻击。
编辑器Simditor默认为我们的内容提供转义,我们可以使用以下这段代码来测试:
编辑器中输入:
测试xss攻击
<script>alert(211);</script>
测试xss攻击
存入数据库中的是:
<p>测试xss攻击</p>
<p><script>alert(211);</script></p>
<p><br /></p>
<p>测试xss攻击<br /></p>
可见Simditor编辑器默认为我们输入的内容提供转义了!
页面上显示:
很多同学会大意地认为前端页面有WYSIWYG为我们做转义,就是安全的,事实并不是这样的。
现实生活中,不良用户不一定是网页上向服务器提交内容,有太多的工具可以执行此操作
接下来我们一起解决此问题。
HTMLPurifier
PHP一个比较合理的解决方案是HTMLPurifier。HTMLPurifier本身就是一个独立的项目,运用『白名单机制』对HTML文本信息进行XSS过滤。这种过滤机制可以有效地防止各种XSS变种攻击。只通过我们认为安全的标签和属性,对于未知的全部过滤。
「白名单机制」指的是使用配置信息来定义「HTML标签」,「标签属性」和「CSS属性」数组,在执行clean()
方法时,只允许配置信息「白名单」里出现的元素通过,其他都进行过滤。
如配置信息:
'HTML.Allowed' => 'div,em,a[href|title|style],ul,ol,li,p[style],br','CSS.AllowedProperties' => 'font,font-size,font-weight,font-style,font-family',
当用户提交时:
<a someproperty="somevalue" href="http://example.com" style="color:#ccc;font-size:16px">
文章内容<script>alert('Alerted')</script></a>
会被解析为:
<a href="http://example.com" style="font-size:16px">
文章内容</a>
以下内容因为未指定会被过滤:
-
someproperty
未指定的HTML属性 -
color
未指定的CSS属性 -
script
未指定的HTML标签
1.安装Laravel 5的HTMLPurifier
使用Composer安装:
$ composer require "mews/purifier:~2.0"
2.配置Laravel 5的HTMLPurifier
命令行下运行
$ php artisan vendor:publish --provider="Mews\Purifier\PurifierServiceProvider"
请将配置信息替换为以下:
配置/ purifier.php
<?phpreturn [
'encoding' => 'UTF-8',
'finalize' => true,
'cachePath' => storage_path('app/purifier'),
'cacheFileMode' => 0755,
'settings' => [
'user_topic_body' => [
'HTML.Doctype' => 'XHTML 1.0 Transitional',
'HTML.Allowed' => 'div,b,strong,i,em,a[href|title],ul,ol,ol[start],li,p[style],br,span[style],img[width|height|alt|src],*[style|class],pre,hr,code,h2,h3,h4,h5,h6,blockquote,del,table,thead,tbody,tr,th,td',
'CSS.AllowedProperties' => 'font,font-size,font-weight,font-style,margin,width,height,font-family,text-decoration,padding-left,color,background-color,text-align',
'AutoFormat.AutoParagraph' => true,
'AutoFormat.RemoveEmpty' => true,
],
],];
里配置的user_topic_body
的英文我们为话题内容定制的,配合clean()
方法使用:
$topic->body = clean($topic->body, 'user_topic_body');
开始过滤
一切准备就绪,现在我们只需要在数据入库前进行过滤即可:
应用程序/观察员/ TopicObserver.php
<?phpnamespace App\Observers;use App\Models\Topic;// creating, created, updating, updated, saving,// saved, deleting, deleted, restoring, restoredclass TopicObserver{
public function saving(Topic $topic)
{
$topic->body = clean($topic->body, 'user_topic_body');
$topic->excerpt = make_excerpt($topic->body);
}}
HTMLPurifier把白名单里设定的内容通过,script
标签未设定,自动过滤掉。
至此XSS安全漏洞已修复。
转载: 感谢您对莫愁个人博客网站平台的认可,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源莫愁个人博客 https://www.mochoublog.com/study/315.html”。