2014-01-25 100 views
5

您如何看待laravel 4中的安全性?我的意思是laravel如何管理xss攻擊?如何在laravel 4框架中應用xss過濾器?

在codeigniter中,你有一些像xss_clean($ _ GET ['yourValue'])來清理用戶輸入的xss代碼。

laravel如何處理這些問題?您使用Input :: get('yourValue')獲取用戶值,但是如何對其應用xss過濾器?它具有開箱即用的功能或者什麼?

回答

2

在laravel模板自帶形式的用戶輸入應包含在三個花括號來淨化它的任何數據:

<h1>{{{ $input }}}</h1> 

有在Laravel沒有本地XSS清潔功能,但如果你對一個很絕望有可用的笨安全庫的端口位置:

http://packalyst.com/packages/package/gvlatko/laravel-xss

+0

你用jquery得到的數據怎麼樣? (ajax calls) –

3

您可以使用App::before事件來過濾所有的輸入這樣

App::before(function($request) 
{ 
    Input::merge(array_strip_tags(Input::all())); 
} 

array_strip_tags功能如下,我已經把它放在一個輔助文件來直接調用它,你可以使用它作爲一個輔助函數或作爲一個庫,但它很容易使用它作爲一個輔助功能,裏面global.php文件app/start/文件夾內只創建一個幫助文件,並給它一個名稱,例如custom_helper.php,包括像這樣

require '/custom_helpers.php'; 

功能array_strip_tags

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; 
} 

這是從我的一個工作項目中複製而來的。

+3

這只是剝離標籤,而不是阻止xss –

+3

@SvenB,那麼你還期望什麼'xss'過濾,'跨站點腳本'基本上注入腳本''標籤,我在這種情況下剝離標籤。這裏有什麼問題?如果我錯過了某些東西,你能解釋一下'預防xss嗎? –

0

我相信不幸的是,Laravel沒有內置的XSS過濾器。然而,有一個包可以嘗試laravel-xss,它很容易使用,你只需要做一些事情:$user->about = Xss::clean(Input::get('about');,你就開始了!

0

也有另一種包裝用於laravel XSS濾波器可下載here

使用例:

簡單形式的代碼段

{{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! 
} 
+0

當然,你會想注入這些依賴關係或建立一個門面,而不要使用「新」! – hackel

1

這是我如何解決這個問題。啓發了@ the-alpha的解決方案。我正在使用Laravel 4.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; 
} 

app/filters.php

Route::filter('strip_tags', function() 
{ 
    Input::merge(array_strip_tags(Input::all())); 
}); 

app/routes.php

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' => '[email protected]']); 
    Route::any('/some-page', ['as' => 'some-page', 'uses' => '[email protected]']); 
} 
0

創建一個新的輔助文件,並把這兩種方法在你的幫手。

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; 
} 

然後把這個代碼在你之前,過濾器的開始(在Laravel 4應該是在app/filters.php)。

App::before(function($request) 
{ 
    Helper::globalXssClean(); 
}); 
0

我檢查了Laravel的保護{{{...}}}針對xss攻擊。它只使用htmlentities()函數,如下所示:htmlentities('javascript:alert("xss")', ENT_QUOTES, 'UTF-8', false);只有正確使用它時,才能保護您免受xss的影響,這意味着不要在某些HTML標記中使用它,因爲這會導致XSS攻擊可能性。例如:

$a = htmlentities('javascript:alert("xss")', ENT_QUOTES, 'UTF-8', false); 
echo '<a href="'.$a.'">link</a>'; 

在這種情況下,您的代碼易受xss影響。