PDO / MYSQL подготовили операторы без экранирования символов? - PullRequest
1 голос
/ 07 февраля 2012

Я пытаюсь написать функцию поиска в моей программе:

$search = "%".$_POST['search']."%";
$query=$connection->prepare("SELECT * FROM TABLE WHERE COLUMN LIKE ?");
$query->execute(array($search));

Однако, похоже, что пользователи могут просто ввести%, и он возвращает все результаты. Как я могу предотвратить это? У меня сложилось впечатление, что использование подготовленных заявлений могло бы избежать этих персонажей. Это относится и к другим символам (\, 'и т. Д.)? Как это исправить?

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

Подготовленные заявления ничего не избегают. Когда вы готовите оператор, ваш запрос прекомпилируется, поэтому для его заполнения необходимо заполнить только заполнители (?). Поскольку нет способа изменить SQL предварительно скомпилированного запроса, экранирование не требуется.

Чтобы исправить это, вручную выполните % и _.

Добавлено:

Немного здравого смысла: в вашем случае, когда пользователь вводит % в поле поиска, ваша переменная $search содержит строку %%%. Откуда MySQL узнает, какой % он должен покинуть, а какой оставить один?

1 голос
/ 07 февраля 2012

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

if (strpos($_POST['search'], '%') !== FALSE || strpos($_POST['search'], '_') !== FALSE) {
  $query = $connection->prepare("SELECT * FROM TABLE WHERE COLUMN LIKE ?");
  $query->execute(array($search));
}
else echo "% and _ are not allowed!";

Что касается таких символов, как ', они обрабатываются как часть строки, передаваемой вместо заполнителя ?, а не объединяются для построения оператора SQL.Так что они в безопасности.

0 голосов
/ 05 июля 2013

Вы должны правильно экранировать ввод пользователя, чтобы сервер знал, какие символы являются подстановочными знаками, а какие - данными для сопоставления.

$search = '%' . str_replace(array('_', '%'), array('\\_', '\\%'), $_POST['search']) . '%';

Это исключит те символы, которые в противном случае считались бы подстановочными знаками.$search теперь будет содержать что-то вроде:

%100\%%

, что будет соответствовать I always give 100% when working, но не I do 100 pushups daily.

...