在laravel中清理用户输入

时间:2012-10-10 06:40:39

标签: php xss laravel

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

  1. 在写入数据库之前清理数据。
  2. 保存原始数据并在视图中清理它。
  3. 例如,使用HTML::entities()并将结果保存到数据库。 或者在视图中使用HTML方法,因为在这种情况下,laravel默认使用HTML::entities()。 或者也许使用两者。

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

5 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:9)

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

您可以自己进行全局XSS清理,如果您没有库来编写您可能经常需要的常用方法,那么我请您在应用程序/库中创建一个新的Common库。将这两种方法放在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();

答案 2 :(得分:3)

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

答案 3 :(得分:1)

这取决于用户输入。如果您通常会输出他们可能提供的代码(例如,它可能是提供代码片段的网站),那么您将对输出进行清理。这取决于具体情况。如果你要求用户名,并且他们正在输入HTML标签,那么你的验证应该是选择这个并且“不,这不是很酷,伙计!”

如果它像我之前所说的那样(代码片段),那么让它通过RAW(但一定要确保你的数据库没有中断),并在输出上进行清理。使用PHP时,您可以使用htmlentities($string)

答案 4 :(得分:0)

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

很容易:

清除输入= $ cleaning = Xss :: clean(输入:: get('评论');

在views = $ cleaning = Xss :: clean中使用(输入::文件('个人资料'),TRUE);

相关问题