Php 清理laravel中的用户输入

Php 清理laravel中的用户输入,php,xss,laravel,Php,Xss,Laravel,我有一个简单的问题: 何时最好清理用户输入? 以下哪一项被认为是最佳实践: 在写入数据库之前清理数据 保存原始数据并在视图中对其进行清理 例如,使用HTML::entities()并将结果保存到数据库。 或者在视图中使用HTML方法,因为在这种情况下,默认情况下,laravel使用HTML::entities()。 或者两者兼用 编辑:我发现了一个有趣的例子。还有其他办法解决这个问题吗 这取决于用户输入。如果您通常要输出他们可能提供的代码(例如,它可能是一个提供代码片段的站点),那么您应该对输出

我有一个简单的问题: 何时最好清理用户输入? 以下哪一项被认为是最佳实践:

  • 在写入数据库之前清理数据
  • 保存原始数据并在视图中对其进行清理
  • 例如,使用
    HTML::entities()
    并将结果保存到数据库。 或者在视图中使用
    HTML
    方法,因为在这种情况下,默认情况下,laravel使用
    HTML::entities()
    。 或者两者兼用


    编辑:我发现了一个有趣的例子。还有其他办法解决这个问题吗

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


    如果它像我前面提到的示例(代码片段),那么就让它以原始的形式通过(但一定要确保数据库不会中断),并在输出时进行清理。使用PHP时,您可以使用
    htmlentities($string)

    我想说您需要两个位置,但原因不同。当数据进入时,您应该根据域验证数据,并拒绝不符合要求的请求。例如,如果您期望一个数字,那么允许标记(或文本)是没有意义的。对于表示.年的参数,您甚至可能需要检查它是否在某个范围内。
    对自由文本字段进行清理。您仍然可以对意外字符(如0字节)执行简单验证。IMHO最好通过安全sql(参数化查询)存储原始数据,然后为输出正确编码。有两个原因。第一个问题是,如果你的消毒液有一个bug,你会如何处理数据库中的所有数据?重新初始化可能会产生不必要的后果。其次,您需要进行上下文转义,对于您使用的任何输出(JSON、HTML、HTML属性等)

    我有一篇关于Laravel中输入过滤的完整文章,您可能会发现它很有用,以下是本文的摘录:

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

    /*
     * 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;
    }
    
    然后将此代码放在before过滤器的开头(在application/routes.php中):


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

    我发现这一点是因为我担心laravel中的xss,所以这是软件包

    这很容易:

    清除输入=$cleaned=Xss::clean(输入::获取('comment')


    要在视图中使用=$cleaned=Xss::clean(输入::文件('profile'),TRUE)

    删除了答案,因为它不适用于XSS。我认为没有硬性或快速的方法…过滤内容,将cookie绑定到IP地址。wiki条目有大量的好信息@DavidBarker,你搞错了。我所需要的是防止在显示用户输入时执行标记和javascript。这如何防止像
    foo“onload=alert这样的东西(document.cookie)
    ?您不需要使用
    echo
    //Our own method to defend XSS attacks globally.
    Common::global_xss_clean();