我有一个简单的问题: 什么时候最好消毒用户输入? 其中哪一项被认为是最佳实践:
例如,使用HTML::entities()
并将结果保存到数据库。
或者在视图中使用HTML
方法,因为在这种情况下,laravel默认使用HTML::entities()
。
或者也许使用两者。
编辑:我找到了有趣的例子http://forums.laravel.com/viewtopic.php?id=1789。还有其他方法可以解决这个问题吗?
答案 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);