Skip to content
This repository has been archived by the owner on May 7, 2022. It is now read-only.

dotCirill/captcha_sh

Repository files navigation

Капча

Реализована капча в flaskshop/captcha/forms.py, в flaskshop/templates/captcha хранится jijna шаблон отображения страницы с капчей.

Для создания изображений была добавлена библиотека PIL.

Капча использует email адрес в качестве персональных данных: генерируется 8 изображений, на каждом из которых содержится несколько последовательных символов из email адреса.

  1. Изображения не сохраняются, а сразу переводятся в base64 (это избавляет от проблем с наименованием этих изображений и их последующем удалении после GET запроса).
  2. Изображения перетасовываются, после чего соответствующие изображениям части email адреса добавляются последовательно в Redis базу данных с разделителем (её использование позволяет в том числе убирать "брошенные" пользователями капчи из БД по истечении времени).
  3. Клиент получает base64-изображения в перетасованном порядке.
  4. Ответом клиента является перестановка чисел от 0 до 7 (включительно, числа разделены пробелом). Самих чисел пользователь, естественно, не видит, этим занимается код на стороне клиента.
  5. Сервер, используя числа клиента и соответствие индекс-текст (из второго пункта), сравнивает полученный email адрес с реальным.

Решение об отправке капчи принимает captcha_required, определённая в flaskshop/captcha/views.py. В текущей реализации капча будет показана, если у пользователя значение флага bot – True. Если на некой странице есть необходимость капчи, то её следует использовать captcha_requeired как декоратор (по аналогии с login_required):

@login_required
@captcha_required
def test_pay(token):
    payment = create_payment(token, "testpay")
    payment.pay_success(paid_at=datetime.now())
    return redirect(url_for("order.payment_success"))

Далее ридми о "поднятии" сайте от разработчиков (docker-compose up).

Flask Shop - An Amazing Project

Introduction

This project is a front page copy of saleor old version, but written with flask. It hasn't completed yet.

ScreenShot

Screenshot Home Screenshot Category Screenshot Cart
Screenshot Admin Panel Screenshot Site Configuration Screenshot Order List

Quickstart

Use python virtual environment

First, Clone and Install dependence

git clone https://github.com/hjlarry/flask-shop.git
cd flask-shop
python3 -m venv .venv
# on windows, you should run .venv\Scripts\activate.bat 
source .venv/bin/activate
pip3 install -r requirements.txt

Second, Init db and run

# modify .flaskenv and flaskshop/setting.py
flask createdb
flask seed
flask run

Use Docker

First, Build image and run in background

docker-compose up -d

Second, enter container and add fake data

docker-compose exec web sh
flask createdb
flask seed

About Config

The default admin account is:

username password role
admin admin super administrator
editor editor editor
op op operator

If the js files has been modified, you need to:

npm install
npm run build

Redis and Elasticsearch is unabled by default, You can enable them for good performence and search ablitity.

Атака на капчу

Анализ капчи производится в папке catpcha_analysis. Ввиду некоторой разрозненности исследования утилиты анализа оказались немного разбросанными. Все скрипты являются скорее демонстрацией практической осуществимости атаки на капчу, чем законченным ПО. Запуск всех .py файлов:

python3 filename.py

img2text folder

  1. captcha_generate.py -- скрипт для генерации базы изображений (внутри настраиваемые параметры).
  2. NN -- папка с двумя jupyter-notebook (для обучения и тестирования) вместе с моделью.
  3. method_* -- реализация соответствующего метода. Для brutesearching есть реализация на golang (работает быстрее, параллельно).

Для работы метода teseract требуется установить teseract, удостоверится, что он есть в $PATH, а также данные для его работы (подходит eng.trainddata).

text2img folder
  1. emails_faker.py -- генерация базы email с помощью библиотеки faker (псевдореальные адреса). emails_gen.py - генерация на основе популярных имен/доменов (предпочтительный метод).
  2. main.py и main.go (реализуют одно и то же, реализация на golang быстрее) решают текстовый пазл с помощью расстояния Левенштейна (используются соответствующие библиотеки). В поле INPUT вводится распознанный из предыдущего модуля img2text/NN/model_test.ipynb текст капчи.