• Как предотвратить имитацию запросов?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    не удачный пример с платежными системами.
    Данные об оплате поступают от мерчанта.
    В 99% процентов случаев Ваш сайт просто отправляет посетителя на сайт платежной системы так как пройти сертификацию для работы с данными карт (Payment Card Industry Data Security Standard (PCI DSS) ) большой гиморой.
    Для переадресации требуется сумма платежа, идентификатор участника платежной системы в чью пользу оплата, обычно к обязательным полям добавляют возможность добавить идентификатор оплаты со стороны продавца.
    Названия полей и их количество немного отличаются от платежной системе к системе.

    Есть вторая схема. Предварительная регистрация платежа (бакенд дергает апи и получает ид оплаты). Редиректит пользователя на оплату конкретного счета.

    Факт успешной оплаты может проверяться по инициативе со стороны бека, так и через механизм обратных вызовов (хуков)

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

    Даже в этом случае (пользователь ничего не передает) верить не желательно.
    Стоит перепроверить контрольную сумму. Ограничить доступ к хукам по ip.

    Типовой способ защиты: расчет контрольной суммы от
    секретнаястрока+поле_данных1+поледанных2+....+полеN

    Но способ не подходит для JS так как строка будет видна :(
    Ответ написан
    Комментировать
  • Как предотвратить имитацию запросов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Здесь в вопросе - 2 разных вопроса. Мне кажется так:
    1) Как защититься от любого мусора который прилетает с клиента. Скорее всего никак.
    Нужно реагировать только на HTTP запросы которые имеют смысл в контексте пользовательской
    сессии. Тут - как-бы бизнес логика и FSM для сессии должен все решать. Хакеры с помощью
    wget, curl, python могут генерировать фаззингом миллионы самых вариативных запросов
    в поиске вашего слабого места в этой части защиты.

    2) Как защититься от атаки man-in-the-middle.. Это если легальный пользователь
    зашел в свой клиент банк, а некто, кто физически сидит на канале может перехватывать
    IP пакеты. Изменять их. Удалять. Задерживать на какое-то время или делать повторы.
    Здесь коробочное решение это https (TLS/SSL) протокол по идее помогает.
    Ответ написан
    Комментировать
  • Как предотвратить имитацию запросов?

    Elaryks
    @Elaryks
    Да, сымитировать запрос можно. Поэтому есть правило: "Нельзя доверять данным, которые приходят с клиента". Следовательно, данные с клиента нужно проверять на сервере. Критические данные и операции нужно подписывать или хэшировать, чтобы избежать подмены. Например, для защиты от Replay Attack используют одноразовые токены — при повторном запросе токен уже не сработает.
    Ответ написан
    4 комментария
  • Как написать мобильное приложение?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Возможно ли написать бекенд для мобильного приложения на андроид и iOS на Django Python?

    Возможно.
    Если да, то что нужно для этого поизучать

    Все тоже самое, что и для разработки бэка для любого другого проекта.
    и на чем писать фронтенд для мобильного приложения?

    На чем умеете, но вот список от простого к сложному:
    - React Native.
    - Flutter.
    - Kotlin/Swift.
    Ответ написан
    1 комментарий
  • Есть ли качественная дорожная карта для web разработки на python?

    @slochitory
    Сам учусь по такому направлению
    Подробно изучить Python.
    SQL основы - желательно потратить недельку - две на изучение(Но в Джанго своя ОРМ, но я считаю что пригодится знать основы)
    MySQL/PostgreSQL
    Django.
    Django Rest FrameWork(Для создания RESTful приложений).
    Nginx/Apache
    Для фронтенда учу
    HTML
    CSS
    Bootstrap/Tailwind CSS
    SASS/SCSS
    JavaScipt(Основы)
    Какой-то фреймворк для фронта например React/Vue/Angular
    Обязательно научиться пользоваться Git.
    И ещё было бы хорошо научиться пользоваться Docker.
    В целом пока занимаюсь этим.Если что-то не правильно, пожалуйста поправьте, самому будет полезно почитать
    Ответ написан
    1 комментарий
  • Почему асинхронный телебот увеличивает кол-во потоков?

    Vindicar
    @Vindicar
    RTFM!
    while True:
                print(1)
                await asyncio.sleep(1)

    Корутина может выполняться в нескольких экземплярах параллельно. У тебя в коде вечный цикл, поэтому старые запущенные экземпляры никогда не завершаются, так что при запуске новых у тебя появляется всё больше и больше экземпляров.
    Ответ написан
  • Библиотека openai, как исправить?

    HemulGM
    @HemulGM Куратор тега Python
    Delphi Developer, сис. админ
    VPN включи

    OpenAI закрыли API для России. Теперь и для него нужен VPN.

    Ошибка у тебя связана с тем, что на запросы приходит не корректный ответ от сервера, а HTML с инфой от их файервола, где написано "Идите лесом"
    Ответ написан
    Комментировать
  • Как синхронизировать базу данных и python?

    2ord
    @2ord
    Питон - это и есть та прослойка, которая "понимает" как работать с СУБД и которая "знает" когда нужно изменять в последней данные. Начни с основ SQL.
    Ответ написан
    5 комментариев
  • Почему тг бот неправильно принимает сообщение?

    Vindicar
    @Vindicar
    RTFM!
    @bot.message_handler(content_types='text')
                def us(message):
                    bot.send_message(message.chat.id, 'проверка')

    Не надо объявдять обработчики событий по ходу дела, это не будет работать так, как ты ожидаешь.
    Ищи другие средства, какие - зависит от библиотеки. В случае telebot это register_next_step_handler(), в репозитории либы есть пример.
    Ответ написан
    Комментировать
  • Является ли данный код решением задачи о рюкзаке?

    Maksim_64
    @Maksim_64
    Data Analyst
    Смотря в чем задача конкретно, задача рюкзака это общее название.
    У тебя код осуществляет попытку найти максимальную ценность предметов при условии, что в рюкзак можно положить 4 кг. На твое тестовом сете он работает правильно, если я изменю тестовый сет то нет. Например если я сделаю
    =[(4000,4), (2500,1),(2000,3), (8000, 2), (9000, 4), (7000,2)]
    То я ожидаю ценность 15000, а он дает все равно 10500.
    Я бы рекомендовал тебе статью https://www.geeksforgeeks.org/0-1-knapsack-problem... там несколько имплементаций в том числе и рекурсивный, и оптимизированный динамический, и на нескольких языках.

    Задача рюкзака это классика, она требует погружения в проблему, посидеть над ней как следует. Возьми код из ссылки и поработай несколькими способами.
    Ответ написан
    Комментировать
  • Рекурсивный вызов в цикле?

    Maksim_64
    @Maksim_64
    Data Analyst
    x - равняется 0 в твоем коде. Перенеси print(x) в самый верх и увидишь. Рекурсия это бесконечный цикл вызова функцией самой себя, до тех пор пока базовое состояние не прервет его (одно или несколько). None ты в конце видишь потому что это printтебе его возвращает, у тебя уже есть print внутри функции.
    def f(x):
        print(x)
        if x==0:
            return 
        else:
            f(x-1)         
    f(3)
    . В твоем случае он тоже выйдет и return 0 он выполняет, замени return на pass и получишь бесконечную рекурсию.

    Насчет None у тебя вот такая ситуация print(print(1))

    ОТРЕДАКТИРОВАНО После дискусии с Zzzz9, выяснилось, что я не прав насчет None. Базовый кейс в рекурсии останавливает рекурсию, но не выходит из функции. Что бы мы вернули значение базового кейса нам нужно добавить return к рекурсивному случаю. Например
    def f(x):
        if x==0:
            return 100
        else:
            f(x-1)
    print(f(3))

    Вот так выход из рекурсии настает, но рекурсивный кейс не имеет return и функция вернет None а вот в такой вариации
    def f(x):
        if x==0:
            return 100
        else:
            return f(x-1)
    print(f(3))
    Функция вернет 100. Насчет print я полную глупость написал, он возвращает None и я подумал, что это имеет место. Глупость полная. если мы добавляем return к рекурсивному кейсу то выведет то что возвращает базовый кейс. А базовый кейс только останавливает рекурсию но не выходит из функции.

    Насчет цикла если мы добавим return к рекурсивному кейсу то for цикл выполнится только один раз, потому что базовый кейс остановит рекурсию а рекурсивный кейс имеет return соответсвенно, функция напечатает изменение x + один добавочный 0, который возвращает return в базовом кейсе. Например
    def f(x):
        print(x)
        if x==0:
            return 'Конец'
        for i in range(10):
            return f(x-1)
    print(f(3))
    Цикл выполнится лишь раз и затем выход из функции.
    Ответ написан