Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 29.01.2018, 15:52
Кандидат Javascript-наук
Отправить личное сообщение для Зосимов Посмотреть профиль Найти все сообщения от Зосимов
 
Регистрация: 11.02.2013
Сообщений: 102

Сообщение от laimas Посмотреть сообщение
Из $_POST нужно еще получить данные:
$data = json_decode($_POST['kye'], 1);

А далее данные из массива $data подготовить для запроса учитывая, что данные должны быть обработаны и соответственно представлены (int или string). Если сервер использует оригинальное расширение MySQL, то придется все делать ручками. В случае если mysqli или PDO, то используя подстановки для подготовленного запроса, а "безопасность" запроса обеспечит сам SQL драйвер.
я решил вставлять записи вот так
for ($i = 0; $i < count($data); $i++){
$success = mysql_query("INSERT INTO ....  VALUES ('".$data[$i]["knb"]."', '".$data[$i]["inb"] .....

записей будет около 3000 строк за раз. думаю это не так много
Ответить с цитированием
  #12 (permalink)  
Старый 29.01.2018, 15:55
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Зосимов
записей будет около 3000 строк за раз. думаю это не так много
Очень плохо, что так, ибо дергать базу запросами, это плохо, а 3000 запросов, это слишком плохо. Более того, ваш запрос это 100%-ная дыра в безопасности.
Ответить с цитированием
  #13 (permalink)  
Старый 30.01.2018, 06:20
Кандидат Javascript-наук
Отправить личное сообщение для Зосимов Посмотреть профиль Найти все сообщения от Зосимов
 
Регистрация: 11.02.2013
Сообщений: 102

Сообщение от laimas Посмотреть сообщение
Очень плохо, что так, ибо дергать базу запросами, это плохо, а 3000 запросов, это слишком плохо. Более того, ваш запрос это 100%-ная дыра в безопасности.
так а что вы порекомендуете?
я проверил, запросы выполняются не так долго, несколько секунд. Так что не пойму - что именно плохого?
Ответить с цитированием
  #14 (permalink)  
Старый 30.01.2018, 07:45
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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

Ваш запрос не делает элементарного, экранирование данных. Но если это и будет сделано, то это будет означать только одно - текущий запрос исключает sql-инъекцию. Но данные помещенные в базу могут служить источником данных вложенных запросов впоследствии, а значит нужно будет всегда помнить об этом и производить их экранирование. Все потому, что вы данные не фильтруете, вас вообще не интересует действительно ли это ваши данные, соответствуют ли они типам ожидаемым.

Контекст вашей темы, это оптимизация. А что такое по вашему оптимизация - красиво выполнить действия на клиенте? А на сервере как получится?

Если СУБД не позволяет записать в базу набор данных в рамках одного запроса, это плохо, но придется выполнять массу запросов. Но если позволяет, то почему же вы не думаете об оптимизации? Я ведь показывал что нужно сделать, да даже если бы и не показал, вы, думая об оптимизации, просто обязаны изучить возможности СУБД, дабы сделать запись оптимальной.

Это вы обязаны знать - http://fi2.php.net/manual/ru/security.database.php.
Это очень желательно знать - http://fi2.php.net/manual/ru/book.filter.php.
Это http://fi2.php.net/manual/ru/book.mysqli.php или это http://fi2.php.net/manual/ru/book.pdo.php нужно использовать вместо этого http://fi2.php.net/manual/ru/book.mysql.php.

Используя оригинальное расширение MySQL, вы обязаны сами экранировать данные подставляемые в запрос функцией mysql_real_escape_string(). При этом ожидаемые данные типа integer можно приводить к данному типу, и при этом помещать их в кавычки совсем не требуется.

Допустим, если в ключах knb и inb ожидаем integer, а в cdt строку, то данные первых двух ключей приводим к integer, а последнего экранируем функцией mysql_real_escape_string() и обрамляем кавычками. Подготовив таким образом данные для запроса, делаем запрос:

if($data = json_decode($_POST['kye'])) {
    //каждое вложение $data при таком декодировании будет объектом
    //подготавливаем запрос
    $sql = 'INSERT INTO FROM table (...) VALUES ' . implode(',', array_map(function($v) {
               return '(' . (int)$v->kbn . ',' . (int)$v->inb . ',"' . mysql_real_escape_string($v->cdt) . '")'; 
    }, $data));
    //выполняем запрос
    mysql_query($sql);    
}


При подготовке запроса можно не просто приводить данные к типу и экранировать, а производить их фильтрацию - если (int)$v->kbn или (int)$v->inb ноль, а это не должно быть, значит липовые данные, завершаем работу. Дату ли содержит $v->cdt или "Привет Федя!" ведь тоже не проблема проверить. То есть, либо if((int)$v->kbn) ..., либо используем класс Filter.

А в mysqli и PDO все, кроме фильтрации в контексте "то ли пришло?", можно возложить на sql-драйвер, указав типы и используя подстановки. Драйвер подготовит запрос корректно экранируя и подставив данные в запрос. Запрос будет выглядеть как

'INSERT INTO FROM table (...) VALUES (?,?,?),(?,?,?),(?,?,?),...'

На исполнение отдается этот запрос и массив данных - все вложенные массивы помещаются в один одномерный. Декодирование JSON при этом должно возвращать массив, указывая функции json_decode вторым параметром true/1.

И почитайте о различиях разбора в РНР строковых значений помещенных в одинарные и двойные кавычки.

Последний раз редактировалось laimas, 30.01.2018 в 07:50.
Ответить с цитированием
  #15 (permalink)  
Старый 30.01.2018, 08:18
Кандидат Javascript-наук
Отправить личное сообщение для Зосимов Посмотреть профиль Найти все сообщения от Зосимов
 
Регистрация: 11.02.2013
Сообщений: 102

laimas, все понял. Спасибо большое! Вы мне очень помогли.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите исправить код слайдшоу. 47rus Общие вопросы Javascript 0 20.03.2016 18:43
Ребятки помогите найти код, который отвечает за стиль z-index kyivprogs Библиотеки/Тулкиты/Фреймворки 0 08.12.2015 14:15
Выпадающие списки. Помогите подправить код. cardsmoney Элементы интерфейса 6 18.02.2011 16:20
Код калькулятора на JS. помогите с ошибкой! kirill.psl Общие вопросы Javascript 9 26.08.2010 11:38
Помогите оптимизировать код. pizzZ jQuery 5 17.11.2009 23:52