What's new
Runion

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

аккуратно души питона, валидация данных

p4p4

Light Weight
Депозит
$0
Автор p4p4
Источник https://xss.is

Не пишешь валидацию вводимых данных - ОШИБКА!
Реализуешь валидацию надеясь на синтаксический сахар - ФАТАЛЬНАЯ ОШИБКА!

Распространенным случаем эксплуатации уязвимости приложения при помощи инъекций является отсутствие валидации данных на стороне юзера.

Не редки случаи использования цикла while с инструкцией continue для валидации данных от пользователя
...

ПРИМЕР:
Python: Скопировать в буфер обмена
Code:
while True:
    age = input("Введите ваш возраст: ")
  
    # Проверка, является ли вводимые данные числом
    if not age.isdigit():
        print("ВОЗРАСТ ЭТО ЧИСЛО! Повторите пожалуйста.")
        continue  #  К началу цикла

    age = int(age)

    # Проверка на диапазон
    if age < 18 or age > 30:
        print("Не одобряем малолеток, отвергаем пенсов.")
        continue

    # Если ввод корректный, выходим из цикла
    break

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

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

Сценарии, когда continue может быть безопасным:
- Валидация некритических данных
-Проверка формата ввода, спец. символы и т.п.
-Набросать примитивную валидацию в рамках тестирования в изолированной от внешнего мира среде​


ПРИМЕР НЕУДАЧНОГО ИСПОЛЬЗОВАНИЯ:
вырываю несколько строк из контекста полноценного проекта с БД

Python: Скопировать в буфер обмена
Code:
def user_data():
    while True:
        username = input("Ваше имя? ")
        # Проверка на пустое имя
        if not username:
            print("Имя не может быть пустым. ")
            continue  # Начало цикла

        # Проверка на пробелы
        if " " in username:
            print("Имя не может содержать пробелы. ")
            continue

        return username  # Возвращаем имя юзера при всех пройденных проверках

username = user_data()

print(f"Привет, {username}!")

👆
тУт дыра

Спойлер: О ДЫРЕ
Мейн проблема: инструкция continue переносит выполнение к началу цикла(новая итерация ), не обрабатывая потенциально опасные данные.
Если юзер введет admin; DROP TABLE users; в качестве имени пользователя, код выполнит следующее:

- Проверка на пустое имя
- Проверка на пробелы
- Перейдет к следующей итерации цикла, не обрабатывая DROP TABLE users;
- Возвратит "admin" как имя пользователя и проигнорирует оставшуюся часть строки​

КАК ИТОГ - та самая проигнорированная часть строки DROP TABLE users; может юзаться как вредоносный SQL-запрос, который удалит таблицу юзеров

ЕЩЕ МИНУСЫ(ситуативно):
Когда много условий проверки, continue может привести к запутанному, трудночитаемому коду.
Continue позволяет выйти только из текущей итерации цикла, при фулл выходе из цикла оптимальнее
break


Также стоит обратить внимание на комбинации условий проверки с логическими выражениями (and, or)

Оптимальная альтернатива для работы с чувствительными данными и сложной валидацией
👇
(библы):
validators, marshmallow
 
p4p4 сказал(а):
Перейдет к следующей итерации цикла, не обрабатывая DROP TABLE users;
- Возвратит "admin" как имя пользователя и проигнорирует оставшуюся часть строки​
КАК ИТОГ - та самая проигнорированная часть строки DROP TABLE users; может юзаться как вредоносный SQL-запрос, который удалит таблицу юзеров
Нажмите, чтобы раскрыть...
Очень интересно, но совсем не понятно. По вашей логике должно вернуть "admin;" Но тут идёт проверка в условии на пробел в строке с инпута в переменной username. Оно разве пройдет проверку на истину при наличии пробела в строке? И как Вы используете оператор DROP в данном случае чтобы затереть таблицу? Прошу развернутого ответа.
 
rand сказал(а):
Очень интересно, но совсем не понятно. По вашей логике должно вернуть "admin;" Но тут идёт проверка в условии на пробел в строке с инпута в переменной username. Оно разве пройдет проверку на истину при наличии пробела в строке? И как Вы используете оператор DROP в данном случае чтобы затереть таблицу? Прошу развернутого ответа.
Нажмите, чтобы раскрыть...
не пон
 
p4p4 сказал(а):
не пон
Нажмите, чтобы раскрыть...
Что непонятного? =) Тут и без интерпретатора понятно что Ваша функция (хотя-бы проверяйте что пишите) расходится с написанным:
p4p4 сказал(а):
Мейн проблема: инструкция continue переносит выполнение к началу цикла(новая итерация ), не обрабатывая потенциально опасные данные.
Если юзер введет admin; DROP TABLE users; в качестве имени пользователя, код выполнит следующее:

- Проверка на пустое имя
- Проверка на пробелы
- Перейдет к следующей итерации цикла, не обрабатывая DROP TABLE users;
- Возвратит "admin" как имя пользователя и проигнорирует оставшуюся часть строки​
КАК ИТОГ - та самая проигнорированная часть строки DROP TABLE users; может юзаться как вредоносный SQL-запрос, который удалит таблицу юзеров
Нажмите, чтобы раскрыть...
Не пройдет это условие в истину если вбить эту строку admin; DROP TABLE users;, так как в этой строке есть пробелы.:
Python: Скопировать в буфер обмена
Code:
if " " in username:
    print("Имя не может содержать пробелы. ")
    continue
Но меня больше интересует этот момент:
p4p4 сказал(а):
КАК ИТОГ - та самая проигнорированная часть строки DROP TABLE users; может юзаться как вредоносный SQL-запрос, который удалит таблицу юзеров
Нажмите, чтобы раскрыть...
Ладно, допустим я вбиваю строку без пробелов по Вашему примеру. Как вы используете оператор DROP на БД из переменной строкового типа "username"? Как использовать эту дыру? Раз уж сказали, пожалуйста аргументируйте.
 
rand сказал(а):
Не пройдет это условие в истину если вбить эту строку admin; DROP TABLE users;, так как в этой строке есть пробелы.:
Нажмите, чтобы раскрыть...
ааа, рил, я не обратил внимание, позже отредактирую как время будет
rand сказал(а):
Как вы используете оператор DROP на БД из переменной USERNAME? Как использовать эту дыру? Раз уж сказали, пожалуйста аргументируйте.
Нажмите, чтобы раскрыть...
думать надо, в гпт кину, переделаю, я сейчас на островах бузой соре
 
p4p4 сказал(а):
ааа, рил, я не обратил внимание, позже отредактирую как время будет

думать надо, в гпт кину, переделаю, я сейчас на островах бузой соре
Нажмите, чтобы раскрыть...
Ну так вот за непроверенную информацию, и лишь бы сказануть того чего не знаете получайте заслуженный дизлайк (а ставить я их не люблю). Как ГПТ напишет что полезного и перестанет вводить участников форума в заблуждение, дизлайк сниму.
 
rand сказал(а):
Ну так вот за непроверенную информацию, и лишь бы сказануть того чего не знаете получайте заслуженный дизлайк (а ставить я их не люблю). Как ГПТ напишет что полезного и перестанет вводить участников форума в заблуждение, дизлайк сниму.
Нажмите, чтобы раскрыть...
оки доки
 
p4p4 сказал(а):
Автор p4p4
Источник https://xss.is

Не пишешь валидацию вводимых данных - ОШИБКА!
Реализуешь валидацию надеясь на синтаксический сахар - ФАТАЛЬНАЯ ОШИБКА!

Распространенным случаем эксплуатации уязвимости приложения при помощи инъекций является отсутствие валидации данных на стороне юзера.

Не редки случаи использования цикла while с инструкцией continue для валидации данных от пользователя
...

ПРИМЕР:
Python: Скопировать в буфер обмена
Code:
while True:
    age = input("Введите ваш возраст: ")
 
    # Проверка, является ли вводимые данные числом
    if not age.isdigit():
        print("ВОЗРАСТ ЭТО ЧИСЛО! Повторите пожалуйста.")
        continue  #  К началу цикла

    age = int(age)

    # Проверка на диапазон
    if age < 18 or age > 30:
        print("Не одобряем малолеток, отвергаем пенсов.")
        continue

    # Если ввод корректный, выходим из цикла
    break

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

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

Сценарии, когда continue может быть безопасным:
- Валидация некритических данных
-Проверка формата ввода, спец. символы и т.п.
-Набросать примитивную валидацию в рамках тестирования в изолированной от внешнего мира среде​


ПРИМЕР НЕУДАЧНОГО ИСПОЛЬЗОВАНИЯ:
вырываю несколько строк из контекста полноценного проекта с БД

Python: Скопировать в буфер обмена
Code:
def user_data():
    while True:
        username = input("Ваше имя? ")
        # Проверка на пустое имя
        if not username:
            print("Имя не может быть пустым. ")
            continue  # Начало цикла

        # Проверка на пробелы
        if " " in username:
            print("Имя не может содержать пробелы. ")
            continue

        return username  # Возвращаем имя юзера при всех пройденных проверках

username = user_data()

print(f"Привет, {username}!")

👆
тУт дыра

Спойлер: О ДЫРЕ
Мейн проблема: инструкция continue переносит выполнение к началу цикла(новая итерация ), не обрабатывая потенциально опасные данные.
Если юзер введет admin; DROP TABLE users; в качестве имени пользователя, код выполнит следующее:

- Проверка на пустое имя
- Проверка на пробелы
- Перейдет к следующей итерации цикла, не обрабатывая DROP TABLE users;
- Возвратит "admin" как имя пользователя и проигнорирует оставшуюся часть строки​

КАК ИТОГ - та самая проигнорированная часть строки DROP TABLE users; может юзаться как вредоносный SQL-запрос, который удалит таблицу юзеров

ЕЩЕ МИНУСЫ(ситуативно):
Когда много условий проверки, continue может привести к запутанному, трудночитаемому коду.
Continue позволяет выйти только из текущей итерации цикла, при фулл выходе из цикла оптимальнее
break


Также стоит обратить внимание на комбинации условий проверки с логическими выражениями (and, or)

Оптимальная альтернатива для работы с чувствительными данными и сложной валидацией
👇
(библы):
validators, marshmallow
Нажмите, чтобы раскрыть...
p4p4 сказал(а):
не пон
Нажмите, чтобы раскрыть...
p4p4 сказал(а):
думать надо
Нажмите, чтобы раскрыть...
p4p4 сказал(а):
в гпт кину, переделаю
Нажмите, чтобы раскрыть...
1723042838065.png



играл сам с собой - проиграл
 
p4p4 сказал(а):
КАК ИТОГ - та самая проигнорированная часть строки DROP TABLE users; может юзаться как вредоносный SQL-запрос, который удалит таблицу юзеров
Нажмите, чтобы раскрыть...
ну пример с sql injection очевидно неудачный.
На питоне мне доводилось мучать только sqlite. Там насколько я помню ты делаешь запрос вида "SELECT * FROM users WHERE username = ?" (или вместо вопроса %s, точно не вспомню) и передаешь username в списке вторым аргументом в функцию, где ты выполняешь запрос.
например так:
cursor.execute("SELECT admin FROM users WHERE username = %(username)s", {'username': username});
Собственно в username можно любое говно засунуть и оно отфильтруется. Есть конечно каста отдельных кретинов, которые создают запрос и конкатенируют к нему параметры, для них да фильтры нужны)))
Но самопальные фильтры будут хуже тех, что есть в либе.
 
CheckerChin сказал(а):
ну пример с sql injection очевидно неудачный.
Нажмите, чтобы раскрыть...
возможно да, скилла не хватает для удачных примеров

CheckerChin сказал(а):
Собственно в username можно любое говно засунуть и оно отфильтруется.
Нажмите, чтобы раскрыть...
CheckerChin сказал(а):
точно не вспомню) и передаешь username в списке вторым аргументом в функцию, где ты выполняешь запрос.
Нажмите, чтобы раскрыть...
где-то там, я хз, мне рил в падлу сорсы искать чо там ваще было, чтобы угодить кому-то...

чтобы дизлайк убрали АХАХАХ(умираю)
 
p4p4 сказал(а):
Автор p4p4
Источник https://xss.is

Не пишешь валидацию вводимых данных - ОШИБКА!
Реализуешь валидацию надеясь на синтаксический сахар - ФАТАЛЬНАЯ ОШИБКА!

Распространенным случаем эксплуатации уязвимости приложения при помощи инъекций является отсутствие валидации данных на стороне юзера.

Не редки случаи использования цикла while с инструкцией continue для валидации данных от пользователя
...

ПРИМЕР:
Python: Скопировать в буфер обмена
Code:
while True:
    age = input("Введите ваш возраст: ")
 
    # Проверка, является ли вводимые данные числом
    if not age.isdigit():
        print("ВОЗРАСТ ЭТО ЧИСЛО! Повторите пожалуйста.")
        continue  #  К началу цикла

    age = int(age)

    # Проверка на диапазон
    if age < 18 or age > 30:
        print("Не одобряем малолеток, отвергаем пенсов.")
        continue

    # Если ввод корректный, выходим из цикла
    break

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

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

Сценарии, когда continue может быть безопасным:
- Валидация некритических данных
-Проверка формата ввода, спец. символы и т.п.
-Набросать примитивную валидацию в рамках тестирования в изолированной от внешнего мира среде​


ПРИМЕР НЕУДАЧНОГО ИСПОЛЬЗОВАНИЯ:
вырываю несколько строк из контекста полноценного проекта с БД

Python: Скопировать в буфер обмена
Code:
def user_data():
    while True:
        username = input("Ваше имя? ")
        # Проверка на пустое имя
        if not username:
            print("Имя не может быть пустым. ")
            continue  # Начало цикла

        # Проверка на пробелы
        if " " in username:
            print("Имя не может содержать пробелы. ")
            continue

        return username  # Возвращаем имя юзера при всех пройденных проверках

username = user_data()

print(f"Привет, {username}!")

👆
тУт дыра

Спойлер: О ДЫРЕ
Мейн проблема: инструкция continue переносит выполнение к началу цикла(новая итерация ), не обрабатывая потенциально опасные данные.
Если юзер введет admin; DROP TABLE users; в качестве имени пользователя, код выполнит следующее:

- Проверка на пустое имя
- Проверка на пробелы
- Перейдет к следующей итерации цикла, не обрабатывая DROP TABLE users;
- Возвратит "admin" как имя пользователя и проигнорирует оставшуюся часть строки​

КАК ИТОГ - та самая проигнорированная часть строки DROP TABLE users; может юзаться как вредоносный SQL-запрос, который удалит таблицу юзеров

ЕЩЕ МИНУСЫ(ситуативно):
Когда много условий проверки, continue может привести к запутанному, трудночитаемому коду.
Continue позволяет выйти только из текущей итерации цикла, при фулл выходе из цикла оптимальнее
break


Также стоит обратить внимание на комбинации условий проверки с логическими выражениями (and, or)

Оптимальная альтернатива для работы с чувствительными данными и сложной валидацией
👇
(библы):
validators, marshmallow
Нажмите, чтобы раскрыть...
Немного не понятно при чём здесь SQL база данных и как это должно отразиться, так как ты не написал это в коде и не показал пример ( так как я +- хорошо знаю python я +- понял про что ты, но думаю новичкам будет не понятно ). Я думаю что любой кто делает программы с добавлением / созданием юзеров / паролей в базу данных продумывает такие моменты, тем более даже если есть подобные дыры на стадии тестов их довольно легко выявить, простой унит тест и готово. Я думаю что можно сразу заворачивать input в str что бы не создавать 100500 лишних строк, [ username = str(input('USERNAME: ') ], так же да бы исключить ввод комманд бд можно попробовать сплитовать пробелы ( ведь без них ты не сможешь ввести какую либо комманду ) как пример: [ try: username = username.split(' ') except: pass ], проверка на спец символы может быть реализована с помощью списка спец символов и цикла их поиска [ username.find() ] или перезаписи [ username.replace() ]. Если понравились мысли, можешь добавить к статье или написать 2ю часть.
 
DarkBLUP сказал(а):
новичкам
Нажмите, чтобы раскрыть...
так я сам новичок )
DarkBLUP сказал(а):
продумывает такие моменты
Нажмите, чтобы раскрыть...
поэтому когда сурсы с гита разбирал и сам писал, пришла мысль о том, что это немаловажный аспект и возможно кто-то будет задаваться вопросом о подобном
DarkBLUP сказал(а):
Если понравились мысли
Нажмите, чтобы раскрыть...
понравились, себе сделал пометки;)
благодарю за здравую критику и конструктив!
 
p4p4 сказал(а):
так я сам новичок )

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

понравились, себе сделал пометки;)
благодарю за здравую критику и конструктив!
Нажмите, чтобы раскрыть...
Не за что, тема на самом деле интересная, удачи :)
 
p4p4 сказал(а):
Распространенным случаем эксплуатации уязвимости приложения при помощи инъекций является отсутствие валидации данных на стороне юзера.
Нажмите, чтобы раскрыть...
sky.pro

Параметры SQL-запроса в Pandas с SQLAlchemy: рекомендации

С использованием метода `read_sql` в Pandas приводим SQL-запроса с параметрами к безопасному виду. Используется SQLAlchemy и PostgreSQL.
sky.pro
sky.pro
 
Top