在laravel应用中使用原始方法似乎很安全

时间:2018-12-31 05:59:55

标签: laravel-5 sql-injection

我知道在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)如果否,它们安全吗?

谢谢!

0 个答案:

没有答案