GithubHelp home page GithubHelp logo

nabuvote's Introduction

National Anti-Corruption Bureau of Ukraine
E-Voting System for Public Control Council
Complies TU U 58.29.4-39582446-001:2015 v1
Copyright NGO E-DEMOCRACY http://ed.org.ua

For further information, please contact us
via e-mail <[email protected]>

Next text in Russian only in UTF-8 charset
try use translate.google.com if necessary.

Система рейтингового интернет голосования

Появилась где-то между 5 и 10 часами вечера 26 мая 2015 года, как альтернатива существующей тогда системе выборов Общественного совета при Национальном антикоррупционном бюро Украины (http://nabu.gov.ua).

Используемые проверки и ограничения

Для предотвращения автоматического и повторного голосования в системе используются следующие проверки:

  1. Анти-робот тест (используется Google reCAPTCHA)
  2. Проверка адреса электронной почты с вводом кода проверки из письма
  3. Проверка номера мобильного телефона с получением кода в SMS

Пользовательские ограничения

  1. Общее ограничение на время одной сессии: от теста reCAPTCHA до выбора кандидатов не более 15 минут.
  2. Ограничение на общее количество POST запросов в рамках одной сессии.
  3. Ограничение на количество попыток ввода кодов проверки e-mail и номера мобильного телефона.
  4. Номер телефона и адрес электронной почты можно использовать только для одного голосования.

Открытый файл протокола голосования

Частично анонимизированные данные проголосовавших с указанием выбранных кандидатов доступны в режиме on-line.

Принципы разработки

Невероятно сжатые сроки разработки и необходимость прохождения аудита безопасности для использования в государственных органах привели к выбору следующих принципов построения системы:

  • Отказ от универсальных решений
  • Решение только задачи выборов Общественного совета НАБ Украины
  • Минимальное количество кода необходимого для аудита
  • Минимальное использование дополнительных библиотек
  • Отказ от использования фреймворков на стороне сервера
  • Поддержка мобильных устройств и адаптивная верстка
  • Защита от известных XSS и CSRF атак
  • Защита от инъекций в пользовательских данных
  • Подключение к базе данных только при необходимости

При отправке замечаний к коду пожалуйста учитывайте эти требования.

Системные требования

  • PHP >= 5.3
  • MySQL >= 4.1
  • php-mysqli
  • php-curl (для sms-gate)

Установка

  1. Распакуйте архив в папку доступную веб-серверу
  2. Создайте или подготовьте базу данных MySQL
  3. Переименуйте settings.example.php в settings.php
  4. Заполните недостающие значения в settings.php
  5. Запустите из командной строки php install.php
  6. При необходимости отредактируйте candidates.php
  7. После завершения установки удалите install.php

Аудит исходного кода

Передана на базовый аудит в Государственную службу специальной связи и защиты информации Украины. Результаты аудита не известны.

Аудит исходного кода приветствуется. Замечания присылайте на адрес указанный ниже. Пожалуйста учитывайте принципы и ограничения описанные выше - это не универсальная система.

Лицензия

В рамках Меморандума о сотрудничестве передана для использования в выборах Общественного совета при Национальном антикоррупционном бюро Украины.

Для использования в других официальных выборах обращайтесь по контактам приведенным ниже.

Контакты

Общественная организация "Электронная демократия"

Сайт: http://ed.org.ua/

E-mail: [email protected]

Также см. раздел контакты на сайте.

nabuvote's People

Contributors

imaginal avatar

Stargazers

Volodymyr Lapytskyi avatar  avatar Kyrylo Kukhelnyi avatar Basem Nassar avatar  avatar Paul (xobb) Chubatyy avatar chornoslyv avatar Bohdan Kmit avatar Yura Taras avatar AL Berez avatar Mykhailo Gorianskyi avatar Max Hordiichuk avatar Ievgenii avatar John Yani avatar Vlad Frolov avatar Taras Lyapun avatar  avatar

Watchers

James Cloos avatar Vladimir Doroshenko avatar  avatar Roman Kolgushev avatar

nabuvote's Issues

повысить шансы email нотификаций не попадать в спам

Здравствуйте, увидел пост на фб

https://www.facebook.com/anatoly.chernenko.25/posts/916594458363866

Заранее прошу простить, если не пригодится.

перед строкой https://github.com/imaginal/nabuvote/blob/master/system/functions.php#L296

чтобы не попадать в спам листы желательно добавить

"Return-Path: {$settings['email_from_header']}\r\n" .

и если позволит аудит, так же

в строке https://github.com/imaginal/nabuvote/blob/master/system/functions.php#L307

изменить на

mail($email, $subject, $message, $headers, "-f {$settings['email_from_header']}");

описано тут
http://us2.php.net/manual/en/function.mail.php

в параграфе "additional_parameters"

не рабоает если включен safe_mode, хотя в последних версиях этот режим deprecated

Feature. browser-uniqueness

Привет,
может быть, это будет полезным для следующих версий - panopticlick.eff.org. У них на сайте есть статья про устойчивую идентификацию браузера посетителя сайта.

check_csrf_token improvement

В коде

function check_csrf_token() {
if (empty($_SESSION['csrf_token']))
return false;
if ($_POST['csrf_token'] != $_SESSION['csrf_token'])
die("csrf protection");
unset($_SESSION['csrf_token']);
}

перенести
unset($_SESSION['csrf_token']);
перед die. Иначе при вызове die() до этой строки не дойдет, и в сессии остается одно и то же значение, увеличивая с каждым запросом мизерную (с учетом капчи), но все же вероятность подбора csrf_token

Remove workaround with seed

https://github.com/imaginal/nabuvote/blob/master/system/functions.php#L171

  1. Why it would be empty?
  2. If we assume that it's good random data (and environment allows using of this openssl PHP function), why don't use it directly instead of rand (limits may be implemented with mod)? I see that now we call seeding every time before we call rand().
  3. Why use machine-depending 'i' option for unpack if we know that length is 4 bytes and know that 'L' is always 4 bytes too?

P.S. also as in PHP "empty" returns true for "", 0 and ever "0", it's bad practice to use it in production in such cases.
It may work but when someone reads $a === '' he knows that you mean that $a may be empty string.
When someone reads empty($a) he don't knows, is $a may be false, '', 0, array() or even '0'.

Сделайте результаты голосование скрытыми до конца голосования

#15 - то же самое что и тут, только наоборот.

Новая пара private/public key.
результаты персонального голосование шифруете публичным ключем + random строчка вконце.
В конце голосование публикуете private key, ну и розшифровываете все результаты.

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

Ну тут сложнее так как нам прийдеться доверять сисадмину что он приватный ключ никому не покажет до конца голосования.

Подпись результатов с помощью openssl_private_encrypt

https://nabu-test.ed.org.ua/public/report.txt - возвращает результаты какие то во время голосование.
Потом я скажу что мне показывались результаты другие во время голосование, и сделаю скрин какой то. И буду говорить что вы врете.
Что бы этого не случилось, подпишите результаты приватным ключем, и опубликуйте публичный ключ, что бы можна было проверить результаты.

Процедура следующая (по коду это где то 100 строчек, смотрите пример):

  1. Генерируете private/public ключи.
  2. Публикуете public ключ.
  3. Все результаты персональные и report.txt подписываете, private ключем.
  4. Каждый человек может проверить это с помощью публичного ключа.
  5. В конце голосование удаляете private ключ.
    Если кто нибуть показывает вам результаты голосование которые не соответсвуют опубликованым вами в конце и можна проверить public key.
    То это значит что ваша система не работает, кто то хакнул сервер или сисадмин подхимичил что то, или кто то украл private key, что тоже самое что кто то вас хакнул и результаты не действительные.

http://www.programering.com/a/MDO2cDMwATQ.html - это достаточно просто, порядка 100 строчек

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.