13

我有一个简单的问题:清理用户输入的最佳时间是什么时候?其中哪一项被认为是最佳实践:

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

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

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

4

5 回答 5

12

我会说你需要两个位置,但出于不同的原因。当数据进来时,您应该根据域验证数据,并拒绝不符合要求的请求。例如,如果您需要一个数字,则允许使用标签(或文本)是没有意义的。对于代表年份的参数,您甚至可能想要检查它是否在某个范围内。对自由文本字段进行清理。您仍然可以对 0 字节等意外字符进行简单验证。恕我直言,最好通过安全的 sql(参数化查询)存储原始数据,然后正确编码输出。有两个原因。首先,如果您的消毒剂有错误,您将如何处理数据库中的所有数据?重新消毒可能会产生不良后果。其次,无论您使用哪种输出(JSON、HTML、

于 2012-10-11T04:56:53.937 回答
10

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

你可以自己做一个全局 XSS 清理,如果你没有一个库来编写你可能经常需要的常用方法,那么我要求你在应用程序/库中创建一个新的库 Common。将这两种方法放在您的公共库中:

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

然后将此代码放在之前过滤器的开头(在 application/routes.php 中):

//Our own method to defend XSS attacks globally.
Common::global_xss_clean();
于 2013-02-11T13:14:10.657 回答
3

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

于 2014-01-08T18:23:46.790 回答
1

这取决于用户输入。如果您通常要输出他们可能提供的代码(例如,它可能是一个提供代码片段的站点),那么您将对输出进行清理。这取决于上下文。如果您要输入用户名,并且他们正在输入 HTML 标记,那么您的验证应该选择这个并继续“不,这不酷,伙计!”

如果它就像我之前所说的示例(代码片段),那么让它通过 RAW(但请确保您的数据库不会损坏),并在输出时进行清理。使用 PHP 时,您可以使用htmlentities($string).

于 2012-10-11T04:38:40.913 回答
0

我发现这个是因为我担心 laravel 中的 xss,所以这是gvlatko包

这很容易:

清除输入 = $cleaned = Xss::clean(Input::get('comment');

在视图中使用 = $cleaned = Xss::clean(Input::file('profile'), TRUE);

于 2014-10-08T17:51:08.947 回答