Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Laravel4框架中应用xss过滤器?_Php_Security_Laravel - Fatal编程技术网

Php 如何在Laravel4框架中应用xss过滤器?

Php 如何在Laravel4框架中应用xss过滤器?,php,security,laravel,Php,Security,Laravel,你如何看待拉威尔4号的安全性?我是说laravel是如何管理xss攻击的 在codeigniter中,您可以使用xss\u clean($\u GET['yourValue'])之类的工具来清理用户输入的xss代码 拉威尔是如何处理这些问题的?您可以使用Input::get('yourValue')获取用户值,但如何对其应用xss筛选器?它附带了这种开箱即用的功能还是什么 在laravel模板中,来自用户输入的任何数据都应该用三个大括号括起来,以便对其进行清理: {{{$input}} Lar

你如何看待拉威尔4号的安全性?我是说laravel是如何管理xss攻击的

在codeigniter中,您可以使用xss\u clean($\u GET['yourValue'])之类的工具来清理用户输入的xss代码


拉威尔是如何处理这些问题的?您可以使用Input::get('yourValue')获取用户值,但如何对其应用xss筛选器?它附带了这种开箱即用的功能还是什么

在laravel模板中,来自用户输入的任何数据都应该用三个大括号括起来,以便对其进行清理:

{{{$input}}
Laravel中没有本机xss clean函数,但如果您不想使用它,这里有一个codeigniter安全库端口:


您可以使用
App::before
事件过滤所有输入,如下所示

App::before(function($request)
{
    Input::merge(array_strip_tags(Input::all()));
}
require '/custom_helpers.php';
下面给出了
array\u strip\u tags
函数,我把它放在一个助手文件中直接调用它,你可以将它用作助手函数或库,但它很容易用作助手函数,只需在
app/start/
文件夹中创建一个助手文件并给它一个名称,例如
custom\u helper.php
并将其包含在
global.php
文件中,如下所示

App::before(function($request)
{
    Input::merge(array_strip_tags(Input::all()));
}
require '/custom_helpers.php';
功能
array\u strip\u标签

function array_strip_tags($array)
{
    $result = array();
    foreach ($array as $key => $value) {
        $key = strip_tags($key);
        if (is_array($value)) {
            $result[$key] = array_strip_tags($value);
        }
        else {
            $result[$key] = strip_tags($value);
        }
    }
    return $result;
}

这是从我的一个正在工作的项目中复制的。

不幸的是,我相信Laravel没有内置XSS过滤器。但是,有一个软件包您可以尝试使用,而且很容易使用,您只需执行以下操作:
$user->about=Xss::clean(Input::get('about');
您就可以开始了!

还有另一个用于laravel的Xss filter软件包,可以下载

用法示例:

简单表单代码段

{{Form::open(['route' => 'posts.store'])}}
{{Form::text('title')}}
{{Form::textarea('body')}}
{{Form::submit('Post')}}
{{Form::close()}}
过滤包使用

$rules = ['title' => 'required|min:13', 'body' => 'required|min:150'];
$validator = Validator(Input::all(), $rules);

if($validator->passes()){
  $xss = new XSS;
  $xss->clean(Input::all());
  $input = $xss->get();

  $post = new Post;
  $post->title = $input->title;
  $post->body = $input->body;

  // to test the results you can dd($input); & happy coding everyone!
}

以下是我如何解决这个问题的。灵感来自于@TheAlpha的解决方案。我使用的是Laravel4.2

app/start/global.php

function array_strip_tags($array)
{
    $result = array();
    foreach ($array as $key => $value) {
        $key = strip_tags($key);
        if (is_array($value)) {
            $result[$key] = array_strip_tags($value);
        }
        else {
            $result[$key] = strip_tags($value);
        }
    }
    return $result;
}
Route::filter('strip_tags', function()
{
    Input::merge(array_strip_tags(Input::all()));
});
Route::group(array('before' => 'strip_tags'), function(){
    // all routes under this route group will get all their inputs passed through the strip_tags php's function
    Route::any('/', ['as' => 'home', 'uses' => 'PageController@anyHome']);
    Route::any('/some-page', ['as' => 'some-page', 'uses' => 'PageController@anySomePage']);
}
app/filters.php

function array_strip_tags($array)
{
    $result = array();
    foreach ($array as $key => $value) {
        $key = strip_tags($key);
        if (is_array($value)) {
            $result[$key] = array_strip_tags($value);
        }
        else {
            $result[$key] = strip_tags($value);
        }
    }
    return $result;
}
Route::filter('strip_tags', function()
{
    Input::merge(array_strip_tags(Input::all()));
});
Route::group(array('before' => 'strip_tags'), function(){
    // all routes under this route group will get all their inputs passed through the strip_tags php's function
    Route::any('/', ['as' => 'home', 'uses' => 'PageController@anyHome']);
    Route::any('/some-page', ['as' => 'some-page', 'uses' => 'PageController@anySomePage']);
}
app/routes.php

function array_strip_tags($array)
{
    $result = array();
    foreach ($array as $key => $value) {
        $key = strip_tags($key);
        if (is_array($value)) {
            $result[$key] = array_strip_tags($value);
        }
        else {
            $result[$key] = strip_tags($value);
        }
    }
    return $result;
}
Route::filter('strip_tags', function()
{
    Input::merge(array_strip_tags(Input::all()));
});
Route::group(array('before' => 'strip_tags'), function(){
    // all routes under this route group will get all their inputs passed through the strip_tags php's function
    Route::any('/', ['as' => 'home', 'uses' => 'PageController@anyHome']);
    Route::any('/some-page', ['as' => 'some-page', 'uses' => 'PageController@anySomePage']);
}

创建一个新的助手文件,并将这两个方法放在助手中

public static function globalXssClean()
{
    // Recursive cleaning for array [] inputs, not just strings.
    $sanitized = static::arrayStripTags(Input::get());
    Input::merge($sanitized);
}

public static function arrayStripTags($array)
{
    $result = array();

    foreach ($array as $key => $value) {
        // Don't allow tags on key either, maybe useful for dynamic forms.
        $key = strip_tags($key);

        // If the value is an array, we will just recurse back into the
        // function to keep stripping the tags out of the array,
        // otherwise we will set the stripped value.
        if (is_array($value)) {
            $result[$key] = static::arrayStripTags($value);
        } else {
            // I am using strip_tags(), you may use htmlentities(),
            // also I am doing trim() here, you may remove it, if you wish.
            $result[$key] = trim(strip_tags($value));
        }
    }

    return $result;
}
然后将这段代码放在before过滤器的开头(在Laravel4中,它应该在app/filters.php中)


我检查了Laravel的
{{{…}}
对xss攻击的保护。它只是以如下方式使用
htmlentities()
函数:
htmlentities('javascript:alert(“xss”),'entu引号,'UTF-8',false)
只有当您正确使用xss时,它才能保护您免受xss攻击,这意味着不要在某些HTML标记中使用它,因为它会导致xss攻击的可能性。例如:

$a = htmlentities('javascript:alert("xss")', ENT_QUOTES, 'UTF-8', false); 
echo '<a href="'.$a.'">link</a>';
$a=htmlentities('javascript:alert(“xss”)),ENT_引号'UTF-8',false);
回声';

在这种情况下,您的代码易受xss攻击。

使用jquery(ajax调用)获得的数据如何?(ajax调用)这只是剥离标记,而不是阻止xss@SvenB,那么对于
xss
过滤,
跨站点脚本
基本上注入了一个脚本
stillCookie()
标记,在这种情况下我正在剥离标记。这里怎么了?如果我遗漏了什么,你能解释一下
阻止xss
吗?当然,你会想注入那些依赖项或设置一个外观,并且永远不要使用“new!”