практика поля в кавычках

Решения задачи с Ulearn

В этой серии задач вам нужно реализовать парсер полей. Парсером обычно называют алгоритм, который из текста делает набор объектов, представленных в этом тексте.

Итак, на вход нашего парсера подается строка текста. На выход нужно вернуть массив полей, извлечённых из текста по описанным ниже правилам, либо пустой массив, если полей нет.

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

Типы полей

Поля могут быть двух типов: простые и поля в кавычках.

Простые поля

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

Поля в кавычках

Кавычки в конце строки можно не закрывать. Если в строке отсутствует последняя парная закрывающая кавычка, считать, что соответствующее поле заканчивается в конце строки. То есть строка abc «def g h содержит два поля.

Поле внутри кавычек может содержать символы кавычек, экранированные символом ‘\’ (другими словами пара символов \» интерпретируется как символ кавычки, являющийся частью поля.

Символ ‘\’ также может быть экранирован самим же собой. То есть строка «a \»c\»» содержит одно поле, а строка «\\» b — два поля.

В простых полях символ ‘\’ не считается экранирующим символом, поэтому строка \\ — это одно поле из двух слэшей, а \»a b\» — это два поля \ и a b»

Игнорируйте пробелы в начале или в конце строки, если они не входят в поле.

Концепция токена

При решении задач разбора текста, например, вычленении из строки фрагментов, приходится отслеживать 2 вещи:

Иллюстрация поясняющая семантику свойств класса Token при анализе текста:

Источник

Чек-лист для тестирования числового поля

При тестировании встречаются как интересные задачки с замудреной логикой, так и простые, вроде проверки простой строки или числового поля. Для простых полей можно один раз написать чек-лист проверок, а потом переиспользовать, лишь немного меняя под «своё» поле.

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

Итак, у нас есть некое поле, куда нужно вводить число. Например, поле «возраст» при регистрации:

практика поля в кавычках

При этом на сайте нельзя регистрироваться до 18 лет, есть запрещённый контент.

Какие проверки тут можно провести:

Корректные значения

Представьте, что у вас буквально 5 минут на проверку функционала. И вы успеваете провести только первые несколько тестов из чек-листа. А чек-лист у вас:

практика поля в кавычках

Для поля с возрастом какие у нас будут корректные значения? Все, что выше 18 лет:

Тут надо понимать, что мы выбираем какое-то ОДНО значение. Просто каждый раз разное, для избежания эффекта пестицида.

Также важно понимать, что у нас может быть не одно корректное значение. Это когда у нас есть несколько диапазонов, и разные условия на каждом.

Например, тот же возраст:

практика поля в кавычках

Или если у нас идет расчет страховки в зависимости от стажа вождения:

практика поля в кавычках

Каждый раз берем разные значения, но в этом пункте смысл один — взять корректные значения из ТЗ.

Некорректные значения

Тут есть разные варианты. Что значит некорректное значение?

— А что будет, если мы возьмем значение из «неправильного» диапазона? Что, если мне меньше 18 лет? Ну, скажем, 10.

практика поля в кавычках

Потом внимательно смотрим на выбранный интервал:

— Хммммм, но ведь возраст не может быть меньше 0. То есть у нас есть логическая граница, разделяющая два разных класса эквивалентности:

практика поля в кавычках

— Если у нас есть некая логическая граница снизу, должна быть и сверху. Какой максимально возможный возраст у регистрирующихся на нашем сайте? Скорее всего, это около 55-65 лет, потому что более старшее поколение не любит компьютеры. Но можно заложить и условные 100-110 лет долгожителей.

Получаем еще один интервал с неявной границей. Но в любом случае, значения 25 и 145 будут различаться — одно реалистичное, а другое нет. Значит, стоит его тоже попробовать!

практика поля в кавычках

А дальше снова эффект пестицида. Один раз берем 145, а другой — 6666666.

Тут мы можем столкнуться с тем, что в поле нельзя ввести больше 2-3 символов. Разработчик перестраховался «от дурака». Это не повод опускать руки и отказываться от своей проверки. Потому что скорее всего разработчик просто установил maxlength на поле, а он легко обходится!

Граничные значения

Граничные значения отделяют один интервал от другого. Их обязательно надо тестировать. Потому что именно на границах чаще всего встречаются баги. Почему? Да потому что попадают в оба диапазона, или не попадают ни в один.

В нашем примере в ТЗ есть условие «регистрация только для лиц старше 18 лет». Это значит, что разработчик должен сделать в коде программы логику вида:

Источник

Практика «Поля в кавычках»

В этой серии задач вам нужно реализовать парсер полей. Парсером обычно называют алгоритм, который из текста делает набор объектов, представленных в этом тексте.

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

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

Типы полей

Простые поля

Поля в кавычках

Поле внутри кавычек может содержать символы кавычек, экранированные символом \ (другими словами пара символов \» интерпретируется как символ кавычки, являющийся частью поля.

Игнорируйте пробелы в начале или в конце строки, если они не входят в поле.

Концепция токена

При решении задач разбора текста, например, вычленении из строки фрагментов, приходится отслеживать 2 вещи:

Иллюстрация поясняющая семантику свойств класса Tokens при анализе текста:

Задача

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

Метод ReadQuotedField принимает строку и позицию в строке. Гарантируется, что на стартовом индексе находится открывающая кавычка поля в кавычках. Метод должен обработать символы до следующей кавычки, если она есть (если нету, то до конца строки), и вернуть токен поля в кавычках. См. пример на схеме выше.

Проверить корректность работы можно запустив программу на выполнение. Но кроме ручного тестирования вам необходимо создать автоматические тесты в классе QuotedFieldTests в том же файле. Удобно создавать тесты, добавляя новые атрибуты TestCase (см. туториал по запуску тестов).

На проверку нужно отправлять файл, в котором есть и решение задачи и тесты.

Источник

SQL injection для начинающих. Часть 1

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

Предисловие

Для того, чтобы понять данную статью, вам не особо понадобится знания SQL-языка, а хотя бы наличие хорошего терпения и немного мозгов — для запоминания.

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

Что же такое SQL инъекция?

Говоря простым языком — это атака на базу данных, которая позволит выполнить некоторое действие, которое не планировалось создателем скрипта. Пример из жизни:

Отец, написал в записке маме, чтобы она дала Васе 100 рублей и положил её на стол. Переработав это в шуточный SQL язык, мы получим:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе

Так-как отец плохо написал записку (Корявый почерк), и оставил её на столе, её увидел брат Васи — Петя. Петя, будучи хакер, дописал там «ИЛИ Пете» и получился такой запрос:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе ИЛИ Пете

Мама прочитав записку, решила, что Васе она давала деньги вчера и дала 100 рублей Пете. Вот простой пример SQL инъекции из жизни 🙂 Не фильтруя данные (Мама еле разобрала почерк), Петя добился профита.

Подготовка

Для практики, Вам понадобится архив с исходными скриптами данной статьи. Скачайте его и распакуйте на сервере. Также импортируйте базу данных и установите данные в файле cfg.php

Поиск SQL injection

Как Вы уже поняли, инъекция появляется из входящих данных, которые не фильтруются. Самая распространенная ошибка — это не фильтрация передаваемого ID. Ну грубо говоря подставлять во все поля кавычки. Будь это GET/POST запрос и даже Cookie!

Числовой входящий параметр

Для практики нам понадобится скрипт index1.php. Как я уже говорил выше, подставляем кавычки в ID новости.

Т.к. у нас запрос не имеет фильтрации:

Скрипт поймет это как

SELECT * FROM news WHERE color=»#ff0000″>’

И выдаст нам ошибку:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\WebServ\domains\sqlinj\index1.php on line 16

Если ошибку не выдало — могут быть следующие причины:

1.SQL инъекции здесь нет — Фильтруются кавычки, или просто стоит преобразование в (int)
2.Отключен вывод ошибок.

Если все же ошибку вывело — Ура! Мы нашли первый вид SQL инъекции — Числовой входящий параметр.

Строковой входящий параметр

Запросы будем посылать на index2.php. В данном файле, запрос имеет вид:

Тут мы делаем выборку новости по имени пользователя, и опять же — не фильтруем.
Опять посылаем запрос с кавычкой:

Выдало ошибку. Ок! Значит уязвимость есть. Для начала нам хватит — приступим к практике.

Приступаем к действиям

Немного теории

Наверно Вам уже не терпится извлечь что-то из этого, кроме ошибок. Для начала усвойте, что знак » » считается комментарием в языке SQL.

ВНИМАНИЕ! Перед и после него обязательно должны стоять пробелы. В URL они передаются как %20

Выполнится удачно. Можете попробовать это на скрипте index2.php, послав такой запрос:

Выучите параметр UNION. В языке SQL ключевое слово UNION применяется для объединения результатов двух SQL-запросов в единую таблицу. То есть для того, чтобы вытащить что-то нам нужное из другой таблицы.

Извлекаем из этого пользу

Если параметр «Числовой», то в запросе нам не нужно посылать кавычку и естественно ставить комментарий в конце. Вернемся к скрипту index1.php.

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

Подбираем количество полей

Подбор полей делается очень просто, достаточно посылать такие запросы:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Ошибка…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Опять ошибка!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Ошибки нет! Значит количество столбцов равно 5.

GROUP BY

Зачастую бывает, что полей может быть 20 или 40 или даже 60. Чтобы нам каждый раз не перебирать их, используем GROUP BY

Если запрос
sqlinj/index1.php?id=1 GROUP BY 2
не выдал ошибок, значит кол-во полей больше 2. Пробуем:

sqlinj/index1.php?id=1 GROUP BY 8
Оп, видим ошибку, значит кол-во полей меньше 8.

Если при GROUP BY 4 нет ошибки, а при GROUP BY 6 — ошибка, Значит кол-во полей равно 5

Определение выводимых столбцов

Для того, чтобы с первого запроса нам ничего не выводилось, достаточно подставить несуществующий ID, например:

sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5

практика поля в кавычках
Этим действием, мы определили, какие столбцы выводятся на страницу. теперь, чтобы заменить эти цифры на нужную информацию, нужно продолжить запрос.

Вывод данных

Допустим мы знаем, что еще существует таблица users в которой существуют поля id, name и pass.
Нам нужно достать Информацию о пользователе с >
Следовательно построим такой запрос:

sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM users WHERE >
Скрипт также продолжает выводить
практика поля в кавычках

Для этого, мы подставим название полей, за место цифр 1 и 3

sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM users WHERE >
Получили то — что требовалось!
практика поля в кавычках

Чтение/Запись файлов

Для чтения и записи файлов, у пользователя БД должны быть права FILE_PRIV.

Запись файлов
Чтение файлов

Чтение файлов производится еще легче, чем запись. Достаточно просто использовать функцию LOAD_FILE, за место того поля, которое мы выбираем:

Таким образом, мы прочитали предыдущий записанный файл.

Способы защиты

Защититься еще проще, чем использовать уязвимость. Просто фильтруйте данные. Если Вы передаёте числа, используйте

Как подсказал пользователь malroc. Защищаться использованием PDO или prepared statements.

Источник

С чего начать

Документация

Документация

Content

Content

Что такое CSV-файл

CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Строка таблицы соответствует строке текста, которая содержит одно или несколько полей, разделенных запятыми (wikipedia.org).

Другими словами, это текстовый файл, в котором содержится информация в виде отдельных строк, где каждая строка это отдельная запись (например об одном товаре). Разделителем ( delimiter ) значений колонок (разделитель полей CSV) является символ запятая (,) или точка с запятой (;).

Разделитель текста – значения, содержащие зарезервированные символы (двойная кавычка, запятая, точка с запятой, новая строка) обрамляются двойными кавычками (“). Если в значении встречаются кавычки — они представляются в файле в виде двух кавычек подряд.

Наименование полей CSV – первая строка файла обычно сдержит наименование CSV полей (колонок) для идентификации этих полей (колонок).

Пример CSV-файла

Исходный текст CSV-файла, где каждая строка это одна строка таблицы:

Представление в виде втаблицы если открыть в Apache OpenOffice Calc :

_ID__NAME__MODEL__PRICE_
28“HTC Touch HD”“Product 1”1750.0000
29“Palm Treo Pro”“Product 2”112.0000
30“Canon EOS 5D”“Product 3”113.0000

Что бы посмотреть содержимое CSV-файла его можно открыть в любом текстовом редакторе, например в Notepad++ (Как проверить формат CSV-файла) или в любом другом тестовом редакторе.

Как создать CSV-файл

Чем открывать и редактировать CSV-файл

При открытии CSV-файла в приложении Apache OpenOffice Calc выберите параметры в соответствии с настройками как показано на скриншоте ниже:

практика поля в кавычках

Как правильно сохранить CSV-файл

Microsoft Excel умеет открывать CSV-файлы в кодировке Unicode (UTF-8) через импорт данных из файла… и пожалуй на этом можно остановиться!

Microsoft Excel не умеет сохранять CSV-файлы должным образом, при сохранении в Microsoft Excel, вы получите CSV-файл в зависимости от региональных настроек системы, обычно это разделитель табуляция или запятая и кодировка Windows-1251 (для России).

В появившемся окне выбрать тип файла Текст CSV (.csv), установите “галочку” напротив появившегося внизу пункта Изменение настроек фильтра практика поля в кавычках

В открывшемся окне выберите вариант Использовать текущий формат

практика поля в кавычках

В открывшемся окне Экспорт в текстовый файл выберите:

практика поля в кавычках

Нажать кнопку OK для сохранения.

Как проверить формат CSV-файла

CSV является простым и распространенным форматом для табличных данных, это простой текстовый файл, который cодержит текст без форматирования и имеет расширение CSV (.csv) вместо традиционного расширения TXT (.txt), такой файл может быть открыт любой программой для работы с текстом.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *