Доброго времени суток. У меня есть запрос в БД вида: Код (Text): public function updateDataString($table, $name, $param) { $mysqli = $this->bd_connect->mysqli; $stmt = $mysqli->stmt_init( ); if (($stmt->prepare("UPDATE {$table} SET {$name}=? WHERE id = ?") === FALSE) or ($stmt->bind_param('si', $param, $this->id) === FALSE) or ($stmt->execute( ) === FALSE) or ($stmt->close( ) === FALSE) ) { die('Select Error (' . $stmt->errno . ') ' . $stmt->error); } } Я знаю, что нужно проверять все вводимые пользователем данные при добавлении их в БД. В данном случае я самостоятельно, в коде, через аргументы функции updateDataString( ) задаю названия таблиц и колонок для UPDATE. Подскажите пожалуйста, есть ли смысл проводить какие-либо манипуляции и с этими данными?
если фактические параметры зависят от пользовательского ввода, то нужно что-то с этим делать ))) К.О.
да, есть, их как минимум надо экранировать - real_escape_string, любы данные приходящие со стороны надо как минимум экранировать. И еще на мой взгляд (далеко не профессиональный) код какой то мутный, он должен быть попроще.
А как проще можно записать такого вида запрос? Я проверяю каждую операцию на выполнение. Эти данные я самостоятельно указываю в коде. То есть пользователи к ним не причастны. Изначально вопрос стоял в этом.
Код (PHP): function q($array) { // в функцию я бы передавал в виде ассоциативного массива // $array = array( 'table' => '', 'name' => '' ); $db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); // тут соответственно не каждый раз подключать, а $db вынести и использовать как глобальное значение // или как статическую переменную класса if ($db->connect_errno) { die('<h2>Error! Not connect with data base!</h2>'); } foreach ( $array as $key => $value ) { $array[$key] = $db->real_escape_string($array[$key]); // экранирование } $result = $db->query("UPDATE `{$array['table']}` SET {$array['name']}=? WHERE id = ?"); // а потом проверять что получили } примерно как то так, хотя не видя всего и учитывая ночь код мягко сказать не полный и не конечный. данные приходящие со стороны всегда экранируй, данные приходящие от себя можно не экранировать, но желательно все же экранировать - для порядка.
Армянское радио отвечает: Какой внезапный вывод ) Ты понимаешь что такое фактические параметры? Твоя реализация перекладывает ответственность за безопасность на ту часть кода, в которой будет происходить вызов функции. А по-хорошему та часть кода должна воспринимать твою функцию как "черный ящик" и ничего про mysql знать не обязана! Иначе вообще не стоило писать свою обертку над query, я так думаю. Добавлено спустя 100500 минут: Прикол в том, что эти имена проблематично заэкранировать через mysqli_real_escape_string. Экранирование помогает в местах, окруженных кавычками. Доказывать лень, можете сами поэкспериментировать и убедиться. Как плейсхолдеры имена таблиц/полей тоже никак не оформить! Достойный выход — гарантировать, что они придут из безопасного места. Что-то вроде "белых списков".
http://habrahabr.ru/post/148701/ Нашёл на хабре статью. Я только учусь. Не пинайте сильно. То есть, например, создаю массив с допустимыми именами полей и таблиц и при вызове функции, проверяю их в updateDataString перед запросом. Всё верно?