我知道在larabel中使用原始方法不是一个好习惯,但是在某些情况下,我需要使用它们。所以在我的laravel 5.7中,我定义了下一个范围,如:
1)
public function scopeGetByCreatedAt($query, $filter_voted_at_from= null, string $sign= null)
{
if (!empty($filter_voted_at_from)) {
if (!empty($sign)) {
$query->whereRaw(with(new VoteItemUsersResult)->getTableName().'.created_at ' . $sign . "'".$filter_voted_at_from."' ");
} else {
$query->where(with(new VoteItemUsersResult)->getTableName().'.created_at', $filter_voted_at_from);
}
}
return $query;
}
此方法以报表形式使用,其中$ sign作为字符串文字'>'给出,filter_voted_at_from是日期选择输入,例如
$detailedVoteItemUsersResults = VoteItemUsersResult
::getByCreatedAt($filter_voted_at_from, ' > ')
我的意思是这些字段都不能像“ drop table users;”那样具有危险的价值。
2)当我需要按几个字段进行选择
public function scopeGetByName($query, $name = null)
{
if ( ! isset($name)) {
return $query;
}
return $query->whereRaw(' ( ' . ContactUs::myStrLower('author_email', false, false) . ' like ' . ContactUs::myStrLower($name, true,
true) . ' OR ' . ContactUs::myStrLower('author_name', false, false) . ' like ' . ContactUs::myStrLower($name, true, true) . ' ) ');
}
...
public static function myStrLower($value, $with_single_quote, $with_percent) : string
{
$percent= $with_percent ? '%' : '';
if ( $with_single_quote ) {
$ret = "LOWER('" . $percent . $value . $percent . "')";
} else {
$ret= "LOWER(" . $percent . $value . $percent . ")";
}
return $ret;
}
使用此范围的$ name字段是文本输入,因此,如果用户填写“教授;删除表用户;”之类的文本 我有下一个SQL伪装:
SELECT *
FROM `contact_us`
WHERE ( LOWER(author_email) like LOWER('%Prof;drop table users;%') OR LOWER(author_name) like LOWER('%Prof;drop table users;%') )
ORDER BY `created_at` asc
所以我想不会触发任何问题?
无论如何,我宁愿避免使用原始方法。
a)在上面的示例中是否可以避免使用原始方法?
b)如果否,它们安全吗?
谢谢!