PHP :с использованием подготовленных операторов и защитой от SQL-инъекций по сравнению с экранированием

Я понимаю, что подготовленные операторы — это лучший способ защититься от SQL-инъекций. Однако они обеспечивают ограниченное покрытие; например, в тех случаях, когда я позволяю пользователю решать, каким будет порядок операций (, т. е. это ASC или DESC? etc ), там я не получаю покрытия подготовленными операторами.

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

Например, в случаях, которые я упоминал выше (ASC или DESC ), это можно легко отобразить и проверить по списку допустимых значений. Но нет ли ситуации, когда часть инструкции SQL нельзя проверить по белому списку?

Если такая ситуация существует, то какой рекомендуемый подход?

Если бы мне пришлось экранировать пользовательский ввод _, используя базовую базу данных, встроенную -в утилиту escape (, такую ​​как mysql _real _escape _string для mysql )по всем направлениям, где я потерплю неудачу?

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

Давайте посмотрим на следующий пример и поразмыслим над ним..

select {$fields} from {$table} where Age='{$age}' order by {$orderby_pref}

Предположим, что все переменные предоставляются пользователем.

Если бы я использовал mysql _real _escape _string все переменные в приведенном выше SQL (, в отличие от использования подготовленных операторов, которые охватывают меня только наполовину -способом, заставляющим меня создавать белые списки для другая половина, что это не может помочь ), разве это не было бы одинаково безопасно (и легче кодировать )?Если нет, то при каком входном сценарии утилита выхода потерпит неудачу?

$fields       = mysql_escape($fields);
$table        = mysql_escape($table);
$age          = mysql_escape($age);
$orderby_pref = mysql_escape($orderby_pref);

select {$fields} from {$table} where Age='{$age}' order by {$orderby_pref}
7
задан Average Joe 12 July 2012 в 15:05
поделиться