Как использовать белые списки и подготовленные операторы с Postgresql в php?

Я понимаю, что мне нужно внедрить белые списки и подготовленные операторы в мой php-код. Но я не уверен, как это сделать с Postgresql, и действительно ли это необходимо для моего кода? Я использую списки выбора, чтобы передать выбранные пользователем значения в запрос.

<?php

include "connect.php";

$table          = $_POST['tableSelected'];
$field          = $_POST['fieldSelected'];
$attribute      = $_POST['attributeSelected'];
$operator       = $_POST['operatorSelected'];
$fieldList      = $_POST['fieldList'];

$fieldstr = $fieldList . ",ST_AsGeoJSON(ST_Transform(l.geom,4326))";$sql = "SELECT $fieldstr
FROM $table l";

if (!empty($field) && !empty($operator) && !empty($attribute)) {
$sql .= " WHERE {$field} {$operator} '{$attribute}'";
}

echo ($sql);

?>

2

Решение

Белый листинг

Ваш код в его текущей форме очень опасен, вы не только позволяете пользователю решать, какие поля следует выбрать, но вы также позволяете ему решать, какие таблицы запрашивать. Вы должны обязательно выполнить проверку белого списка на них. например:

if($_POST['tableSelected'] == 'acceptable_table1' || $_POST['tableSelected'] == 'acceptable_table2) {
$table = $_POST['tableSelected']
}

Точно так же вы должны проверить списки полей. Но проверка списка полей будет довольно сложной, потому что ваши поля будут зависеть от таблицы. Я предлагаю создать массивы и проверить, что выделение находится в нем.

$table1_fields = array('col1','col2',...)
$table2_fields = array('col1','col2',...)

Подготовленные заявления

Как вы знаете, подготовленные операторы могут использоваться только для привязки параметров. Их нельзя использовать для заполнения имен таблиц и столбцов. Вот почему вам нужны как подготовленные заявления, так и белый список. Я рекомендую использовать PDO. Это может выглядеть примерно так

$stmt = $dbh->prepare("SELECT {$fieldlist} FROM {$table} where field = ?");
$stmt->execute(array('somevalue'));
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]