Nextras datagrid – order parametr do sql
- n.u.r.v.
- Člen | 485
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