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();