Я понимаю, что мне нужно внедрить белые списки и подготовленные операторы в мой 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);
?>
Ваш код в его текущей форме очень опасен, вы не только позволяете пользователю решать, какие поля следует выбрать, но вы также позволяете ему решать, какие таблицы запрашивать. Вы должны обязательно выполнить проверку белого списка на них. например:
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'));
Других решений пока нет …