2012-10-10 47 views
10

我有一个简单的问题: 什么时候最好对用户输入进行清理? 和其中的一个被认为是最好的做法:在laravel中清理用户输入

  1. 写入数据库之前清理数据。
  2. 保存原始数据并在视图中对其进行消毒。

例如使用HTML::entities()并保存结果到数据库中。 或在视图中使用HTML方法,因为在这种情况下,默认情况下,laravel使用HTML::entities()。 或者也许通过使用两者。

编辑:我发现有趣的例子http://forums.laravel.com/viewtopic.php?id=1789。还有其他方法可以解决这个问题吗?

+0

删除了答案,因为它没有应用到XSS。我认为没有硬性或快速的方法...过滤内容,将Cookie与IP地址绑定。Wiki条目具有很好的信息负载http: //en.wikipedia.org/wiki/Cross-site_scripting –

+0

@DavidBarker,你让我错了。我需要的只是在显示用户输入时防止执行标签和JavaScript。 – warmspringwinds

回答

11

我会说你需要两个地点,但由于不同的原因。当数据进入时,您应根据域验证数据,并拒绝不符合的请求。作为一个例子,如果你希望得到一个数字,那么允许标签(或者文本)就没有意义。对于代表一年的参数,您甚至可能需要检查它是否在某个范围内。 卫生处理为自由文本字段开始。您仍然可以对意外字符(如0字节)进行简单验证。恕我直言,最好通过安全的sql(参数化查询)存储原始数据,然后正确编码输出。有两个原因。首先,如果您的卫生洗涤剂存在缺陷,您如何处理数据库中的所有数据?再次使用可能会产生不必要的后果。其次,你想要做的上下文转义,无论哪个输出使用的是(JSON,HTML,HTML属性等)

1

这取决于用户输入。如果您通常会输出他们可能提供的代码(例如,也许这是一个提供代码片段的网站),那么您将对输出进行清理。这取决于上下文。如果你要求一个用户名,并且他们正在输入HTML标签,你的验证应该选择这个,然后“不,这不太酷,男人!”

如果它像我之前陈述的例子(代码片段),那么让它通过RAW(但一定要确保您的数据库不会中断),并对输出进行消毒。使用PHP时,可以使用htmlentities($string)

9

我有输入一个完整的文章中Laravel过滤,你可能会发现它有用http://usman.it/xss-filter-laravel/,这里是本文摘自:

如果您没有库来编写可能需要的常用方法,那么您可以自己进行全局XSS清理,然后请您在应用程序/库中创建一个新库。将这个两个方法在公共库:

/* 
* Method to strip tags globally. 
*/ 
public static function global_xss_clean() 
{ 
    // Recursive cleaning for array [] inputs, not just strings. 
    $sanitized = static::array_strip_tags(Input::get()); 
    Input::merge($sanitized); 
} 

public static function array_strip_tags($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::array_strip_tags($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; 
} 

然后把这个代码在你之前,过滤器的开始(在应用程序/ routes.php文件):

//Our own method to defend XSS attacks globally. 
Common::global_xss_clean(); 
+0

这怎么可能防止'foo'onload = alert(document.cookie)''? – 735Tesla

3

我刚刚发现这个问题。另一种方法是将动态输出放入三个方括号中,如{{{ $var }}},刀片将为您摆脱字符串。这样,你可以保留有潜在危险的字符,以防它们在代码中的其他地方很重要,并将它们显示为转义字符串。

+0

你不需要使用'echo' –

+0

@HasibMahmud非常正确,我会修复它 – 735Tesla

0

我发现这一点,因为我担心在laravel XSS,所以这是包gvlatko

很容易:

要清除输入= $清理= XSS ::干净(输入: :获得( '评论');

要在视图中使用= $清理= XSS ::干净(输入::文件( '个人资料'),TRUE);