Я знаю, что использование сырых методов не является хорошей практикой в 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;
}
Этот метод используется в форме отчета, где знак $ задается как строковый литерал '>'и filter_voted_at_from - вход для выбора даты, например
$detailedVoteItemUsersResults = VoteItemUsersResult
::getByCreatedAt($filter_voted_at_from, ' > ')
Я имею в виду, что ни одно из этих полей не может иметь опасного значения, например, «удалить пользователей таблицы»;.
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 deguging:
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
Итак, я полагаю, что никаких проблем не возникнет?
В любом случае, я бы предпочел избегать использования необработанных методов.а) Возможно ли в приведенных выше примерах избежать использования необработанных методов?
б) Если нет, безопасны ли они?
Спасибо!