2016-12-07 68 views
3

我一個使用DoctrineSymfony 2.8的項目,我不知道是否有SQL注入的風險使用queryBuilderaddOrderBy()方法時:學說queryBuilder:addOrderBy()方法中的SQL注入風險?

// Order options. Real code does not specify this manually, but receives 
// the options via user form input 
$orderBy' = array(
    'column1' => 'ASC', 
    'column2' => 'DESC', 
    ... 
    'columnN' => 'ASC', 
); 

$qb = $this->em->createQueryBuilder(); 
... 

foreach ($orderBy as $column => $orderOption) { 
    $qb->addOrderBy("e.$column", $orderOption); 

    // Does not work: 
    // $qb->addOrderBy("e.$column", ':orderOption') 
    // ->setParameter('orderOption', $orderOption); 
    // 
    // Error: Expected end of string, got ':orderOption'" 
} 

// Result is something like: 
...ORDER BY e0_.column1 ASC, e0_.column2 DESC... 

的問題是,該命令選項可通過用戶收到表單輸入可以被操縱爲像; DROP TABLE someTable而不是ASCDESC

我已經嘗試過這一點,但查詢生成器似乎並不接受;,分隔的多個查詢,這並不意味着,這不可能有任何其他/更好的注射:-)

當然的了問題很容易通過過濾收到的結果並跳過所有無效的搜索選項來解決。但我想明白,如果一般的addOrderBy()方法。 爲方法傳遞任何價值並且Doctrine會處理剩下的問題還是存在潛在風險,是否存儲?

我不知道爲什麼->setParameter()方法不起作用,就像使用->where()時那樣。

回答

7

簡短的回答是可能實際上被用於提交表單列名一個sql注入攻擊。學說假定您已經正確驗證了列(和表)的名稱。

學說代碼非常容易閱讀,這是值得考慮看看這些各種各樣的問題:

public function addOrderBy($sort, $order = null) 
{ 
    $orderBy = ($sort instanceof Expr\OrderBy) ? $sort : new Expr\OrderBy($sort, $order); 

    return $this->add('orderBy', $orderBy, true); 
} 

注意,有在查詢中使用Expr的根本沒有價值。教義照顧爲你生成它們。

$這個 - >添加是有點複雜,但基本上是第二個參數結束了沒有轉義或過濾等

不知沿傳遞爲什麼 - >的setParameter()方法不起作用,因爲這將 在使用 - >,其中()

的重要概念是準備好的語句不僅保護沒有列或表名。

所以,它完全取決於你過濾來自野外的表/列名稱。並且查看源代碼可以提供信息。

1

可以使用Expr類:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#the-expr-class

或簡單的函數/方法返回一個有效的值:

function orderOption($option, $defaultOption = 'ASC') { 
    if (in_array(strtoupper($option), ['ASC', 'DESC']) { 
     return $option; 
    } 
    return $defaultOption; 
} 
+0

謝謝你,但正如在問題中解釋的那樣,它不是關於尋找保存過濾器函數,而是關於如果addOrderBy()在第一個位置是風險。 –

+0

所以,使用'Expr'。 – rogeriolino

+0

我不想使用'Expr' :)我想了解使用'addOrderBy()'是否存在風險。.. –