将验证结果直接传递给新对象是否安全
Is it safe to pass validation result directly to new object
我已经设置了以下请求 class 来验证我的输入:
.
.
.
class SupplierStoreRequest extends FormRequest
{
.
.
.
public function rules()
{
return [
'name' => 'required|string|max:255',
'address' => 'required|string|max:255',
];
}
}
我的控制器中有以下方法:
public function store(SupplierStoreRequest $request)
{
$validated = $request->validated();
$supplier = new Supplier($validated);
$supplier->save();
return redirect()->route('Admin::supplier.index');
}
这完全符合预期。我的问题是:
是否存在 SQL 或 JavaScript 注入的风险,或此代码中的任何其他安全风险,或者 FormRequest class 是否会处理这些问题?
TL;DR 通过 Eloquent 准备语句并通过 blade 变量使用 htmlspecialchars
转义是防止 SQL 注入和 JavaScript 注射。验证仅用于检查用户输入是否为预期格式(甚至可以是 JavasScript 或 SQL)。
如果您使用 Eloquent(没有 raw
),您使用的是准备好的语句,这有助于防止 SQL 注入。验证不是此过程的一部分,只是检查输入的有效性,而不是针对攻击本身。
Laravel's database query builder provides a convenient, fluent
interface to creating and running database queries. It can be used to
perform most database operations in your application and works on all
supported database systems.
The Laravel query builder uses PDO parameter binding to protect your
application against SQL injection attacks. There is no need to clean
strings being passed as bindings.
至于JavaScript 注入,同样适用于在Blade 文件中使用{{ $var }}
语句。您不应该仅仅依靠验证来防止攻击。通过验证来防止所有形式的攻击真的非常非常难。
Blade {{ }} statements are automatically sent through PHP's
htmlspecialchars function to prevent XSS attacks.
我已经设置了以下请求 class 来验证我的输入:
.
.
.
class SupplierStoreRequest extends FormRequest
{
.
.
.
public function rules()
{
return [
'name' => 'required|string|max:255',
'address' => 'required|string|max:255',
];
}
}
我的控制器中有以下方法:
public function store(SupplierStoreRequest $request)
{
$validated = $request->validated();
$supplier = new Supplier($validated);
$supplier->save();
return redirect()->route('Admin::supplier.index');
}
这完全符合预期。我的问题是:
是否存在 SQL 或 JavaScript 注入的风险,或此代码中的任何其他安全风险,或者 FormRequest class 是否会处理这些问题?
TL;DR 通过 Eloquent 准备语句并通过 blade 变量使用 htmlspecialchars
转义是防止 SQL 注入和 JavaScript 注射。验证仅用于检查用户输入是否为预期格式(甚至可以是 JavasScript 或 SQL)。
如果您使用 Eloquent(没有 raw
),您使用的是准备好的语句,这有助于防止 SQL 注入。验证不是此过程的一部分,只是检查输入的有效性,而不是针对攻击本身。
Laravel's database query builder provides a convenient, fluent interface to creating and running database queries. It can be used to perform most database operations in your application and works on all supported database systems.
The Laravel query builder uses PDO parameter binding to protect your application against SQL injection attacks. There is no need to clean strings being passed as bindings.
至于JavaScript 注入,同样适用于在Blade 文件中使用{{ $var }}
语句。您不应该仅仅依靠验证来防止攻击。通过验证来防止所有形式的攻击真的非常非常难。
Blade {{ }} statements are automatically sent through PHP's htmlspecialchars function to prevent XSS attacks.