Nextras datagrid – order parametr do sql

n.u.r.v.
Člen | 485
+
0
-

Ahoj,
na webech používám nextras datagrid a používám i řazení a limity (paginator)

zjednodušeně takto:

protected function createComponentUserDatagrid() {
        $presenter = $this;
        $grid = new Datagrid;
        $grid->setRowPrimaryKey('ID');
...
...

$grid->setDatasourceCallback(function($filter, $order, Paginator $paginator = NULL) use ($presenter) {
	return $presenter->userRepository->getUserDatagrid($order, $paginator->getLength(), $paginator->getOffset(), $filter);
}

}
public function getUserDatagrid($order, $limit, $offset, $filter = NULL) {
if (is_array($order)) {
     $orderFinall = $order[0] . ' ' . $order[1];
} else {
     $orderFinall = "ID DESC";
}
$limitFinall = "";
if (is_null($limit) == FALSE or is_null($offset) == FALSE) {
  $limitFinall = " LIMIT ? OFFSET ?";
}
...
...
...
return $this->database->queryArgs("SELECT ...
                FROM users AS u
                WHERE ...
                ORDER BY ".$orderFinall." ". $limitFinall, array($limit, $offset));

}

Bohužel výše uvedené má bezpečnostní chybu – přes url lze přes parametr sortu vkládat do sql. Bohužel nevím jak jinak lepé to ošetřit než takto:

Napevno mám vyjmenované podle kterých sloupců se dá řadit a pokud je tento sloupec v parametru, tak ho použiju pro řazení

public function getUserDatagrid($order, $limit, $offset, $filter = NULL) {
$orderList = array('NAZEV_SLOUPCE_1','NAZEV_SLOUPCE_2','NAZEV_SLOUPCE_3','NAZEV_SLOUPCE_4','NAZEV_SLOUPCE_5');
$orderTypeList = array('ASC', 'DESC');
        if (is_array($order) and in_array($order[0], $orderList)) {
            $orderFinall = $orderList[array_search($order[0], $orderList, TRUE)];
            $order[1] = strtoupper($order[1]);
            if(in_array($order[1], $orderTypeList)){
                $orderFinall .= " ".$orderTypeList[array_search($order[1], $orderTypeList, TRUE)];
            }else{
                $orderFinall .= " ASC";
            }
        } else {
            $orderFinall = "ID ASC";
        }
$limitFinall = "";
if (is_null($limit) == FALSE or is_null($offset) == FALSE) {
  $limitFinall = " LIMIT ? OFFSET ?";
}
...
...
...
return $this->database->queryArgs("SELECT ...
                FROM users AS u
                WHERE ...
                ORDER BY ".$orderFinall." ". $limitFinall, array($limit, $offset));
}

Akorát je to takové nehezké, bohužel jsem nepřišel na jiný způsob – když dám order do parametrů queryArgs, tak se z toho udělá string a databáze podle toho neřadí.

Napadá někoho lepší řešení, jak bezpečně předat order z url parameru do SQL?
Díky