Атаки SQL-инъекций

о жесткого кодирования SQL-запросов, таких какSelect * from users where user_id =220202 могут ли они быть сделаны как динамическиеSelect * from $users where $user_id = $input.

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

Моя главная проблема - время загрузки. Как и в случае динамических страниц, база данных должна извлекать содержимое страницы, точно так же, если запросы являются динамическими, сначала система должна искать ссылки, а затем выполнять запросы, так влияет ли это на время загрузки?

Я использую codeignitor PHP.

Если это возможно, то следующий вопрос - где хранить все ссылки? В приложении, в файле, в БД и как?

---РЕДАКТИРОВАТЬ:
Еще лучше: можно ли сделать сам SQL-запрос динамическим? Я могу просто ссылаться на $ sqlA вместо всего запроса? Таким образом, если мне нужно переписать запрос, я могу просто обновить 1 файл.

Ответы на вопрос(4)

какие драйверы баз данных вы используете. Старые драйверы баз данных PHP не поддерживали заполнители (PHP 3.x). Современные (PDO) делают. Вы пишете SQL с вопросительными знаками:

SELECT * FROM Users WHERE User_ID = ?

Затем вы предоставляете значение идентификатора пользователя при выполнении запроса.

Тем не менее, вы не можете предоставить имя столбца, как это - только значения. Но вы можете подготовить оператор из строки, такой как:

SELECT * FROM Users WHERE $user_id = ?

Затем вы предоставляете значение во время выполнения.

Решение Вопроса

CodeigniterЯ бы порекомендовал использоватьActive Record Class чтобы выполнить то, что вы пытаетесь сделать.

Класс активных записей позволяет динамически создавать запросы, позволяя строить их логически. Итак, чтобы взять ваш пример с использованием активной записи ...

( это можно сделать с помощью меньшего количества кода, я просто пытаюсь проиллюстрировать Active Record )

$this->db->select('*');

$this->db->from($table);

$this->db->where($user_id, $input);

и поэтому, чтобы показать, что я имею в виду при построении запроса логически, вы можете создать любую логику, которую захотите В процессе построения запроса. Допустим, у вас есть переменная $ limit, которую вы установили, если хотите ограничить количество полученных результатов. НО, если он не установлен (илиNULL) вы не хотите устанавливать предельное предложение.

if ( $isset($limit) ) {
    $this->db->limit($limit);
}

и теперь, чтобы выполнить ваш запрос теперь, когда он был построен

$query = $this->db->get();

Тогда просто разберись с$query с твоимкласс базы данных как и любой другой объект запроса CodeIgniter.

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

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

Наконец, я рекомендую сохранить это в файл, просто объявив имена столбцов как переменные php

 Samuel Herzog16 янв. 2011 г., 07:20
Небольшое исправление: узким местом обычно является не база данных (что действительно быстро), а установление соединения и связь с базой данных.

ой строкой, она может быть переменной.

$SQL = "SELECT foo FROM bar b";
SQLSet = mysql_query($SQL);

Как видите, вы можете использовать обычные манипуляции со строками для построения всего вашего SQL-запроса.

$SQL="SELECT * FROM MyTable";
$BuzID = 5;
$Filter = "Buz=".$BuzID;
if (is_numeric($BuzID)) SQL .= " WHERE ".$Filter;
SQLSet = mysql_query($SQL);

Это расширится до"SELECT * FROM MyTable WHERE Buz=5" если$BuzID установлен на любое число. Если нет, то заявление будет просто"SELECT * FROM MyTable"

Как видите, вы можете создавать очень сложные операторы SQL на лету без необходимости поддержки переменных на сервере SQL.

Если вам нужны константы, такие как имя базы данных, логин пользователя, вы можете добавить их в отдельное включение, расположенное вне публичного каталога.

SecretStuff.inc.php
$__DatabaseName = "localhost";
$__UserName = "DatabaseAccess";
$__Password = "E19A4F72B4AA091C6D2";

Или иметь весь код подключения к базе данных PHP в одном файле.

 Jonathan Leffler16 янв. 2011 г., 15:39
Быть очень осторожнымАтаки SQL-инъекций.

Ваш ответ на вопрос