цитаты в запросах - PullRequest
       3

цитаты в запросах

0 голосов
/ 26 января 2010

У меня есть запрос MySQL, который требует, чтобы параметры были заключены в "" или ",

если у меня есть массив, переданный этой функции:

function orderbyfield($column, array $selection)
{
 // will it be alright (secure) to do this?
 foreach ($selection as $s)
 {
  $s = '"' . $s . '"';
 }
 $string = implode(',', $selection)
 return array($column, $string);
}

и передайте его

function generate_sql()
{
 $fields = $this->orderbyfield(); // assuming the code is in a class
 $sql = 'SELECT FIELDS FROM TABLE ORDER BY FIELD (' . $fields[0] . ',' . mysql_real_escape_string($fields[1]));
}

будут ли проблемы с безопасностью при таком подходе?

EDIT Предположим, что код находится в классе, сделал необходимое добавление $ this ->

EDIT опечатка на foreach

Ответы [ 4 ]

0 голосов
/ 26 января 2010

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

0 голосов
/ 26 января 2010

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

Делая это (Как вы уже делаете - это хорошо) должен предотвращать SQL-инъекции (по крайней мере для строки: вы также должны проверить, что числа действительно соответствуют числовым данным, для экземпляр)


Другое решение, может быть, немного проще, когда вы его получите, - это использование подготовленных операторов.
См .:

0 голосов
/ 26 января 2010

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

function enclose($val, $dbh)
{
  if (($val==='') || (is_null($val))) {
       return 'NULL';
  }
  // is it a number?
  if (preg_match('/^[\+-]*\d+\.?\d*$/', $val)) {
      return($val);
  }
  // its a string
  return("'" . mysql_real_escape_string($val, $dbh) . "'");
}

Обработка нуля может потребоваться настроить. (вышесказанное вырезано из общего интерфейса, который я использую, который также считывает структуру таблицы, используя DESCRIBE, чтобы получить подсказки о том, когда указывать / использовать нули и т. д.)

C.

0 голосов
/ 26 января 2010

Поскольку вы используете функцию mysql_real_escape_string, она довольно безопасна для строк. См. , касающийся SQL инъекций для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...