2016-11-05 5 views
0

Во избежание SQL-инъекций я сделал некоторые исследования и основал на this ответах. Я начал использовать подготовленные статичные таблицы MySQLi. Все прошло нормально, пока я не попал в параметры order by и order type, которые отправляются из интерфейса, на основе того, что пользователь нажимает. Чтобы быть более конкретным, у меня есть несколько таблиц с некоторыми заголовками, и пользователь может упорядочить данные с учетом имени, цены, даты и т. Д., А также он может выбирать между ASC или DESC. Я сохраняю это в скрытом виде ввода, поэтому я предполагаю, что они могут изменить это, используя firebug. Из-за этого я должен быть уверен, что они не могут вводить что-либо в мою базу данных.PHP | MySQLi подготовленные операторы - Обработка порядка и параметров типа заказа

$stmt = $dbConnection->prepare('SELECT * FROM mytable WHERE 1 ORDER BY ? ?'); 
$stmt->bind_param('ss', $_GET['order_by'], $_GET['order_type']); 

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

Если вы используете последнюю версию РНР mysql_real_escape_string вариант приводится ниже больше не будет доступна

Так что я gueess это не так же. Итак, мой вопрос остается, что мне делать дальше? Есть ли решение для этой проблемы?

+0

Вы можете использовать только параметры для значений, вы не можете использовать их для замены имен таблиц и столбцов. – Barmar

+0

Причина 'mysql_real_escape_string' недоступна, так как расширение' mysql' исчезло. Но если вы используете 'mysqli', то он имеет' mysqli_real_escape_string'. Но это не полезно для этого, потому что это для экранирования строк, а не от столбцов. – Barmar

ответ

1

SQL не позволяет использовать параметры для псевдонимов столбцов, выражений или ключевых слов. Вам необходимо подключить их непосредственно в запросе:

$stmt = $dbConnection->prepare('SELECT * FROM mytable WHERE 1 ORDER BY '.$_GET['order_by'].' '.$_GET['order_type'); 

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

+0

Если я должен проверить их раньше, я должен использовать готовые statemets в конце концов? .. поскольку они не справляются с этим вместо меня? – paulalexandru

+1

@paulalexandru Используйте подготовленный оператор, если запрос имеет другие параметры. – Barmar

+0

@ Barmar - Зачем нужны другие параметры? Почему не все параметры? Эти параметры поступали с пользовательской стороны, он может редактировать их, если захочет. – paulalexandru

2

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

$allowed_order_by = array('col1', 'col2', 'col3', ...); 
$allowed_order_type = array('asc', 'desc', ''); 
if (in_array(strtolower($_GET['order_by']), $allowed_order_by) && 
    in_array(strtolower($_GET['order_type'], $allowed_order_type)) { 
    $stmt = $dbConnection->prepare(" 
     SELECT * FROM mytable 
     ORDER BY {$_GET['order_by']} {$_GET['order_type']}"); 
    $stmt->execute(); 
} 
+0

'$ _GET ['order_ty [e]' отбрасывает подсветку синтаксиса. Возможно, вы имели в виду '$ _GET ['order_type']' –

+0

@ Fred-ii- Не стесняйтесь редактировать очевидные опечатки, подобные этому – Barmar

+0

Я бы, но TBH, не был полностью уверен в том, что могло быть другим массивом. –

 Смежные вопросы

  • Нет связанных вопросов^_^