• Компютри и Електроника
  • Програмиране

Как да се създаде сигурна скрипт за влизане в PHP и MySQL

Гледането на все повече и повече новини за хакери, разработчиците търсят по-добри начини за защита на своите интернет страници. Ако вашият сайт е за вход система, съществува опасност от напукване и загуба на потребителски данни. В тази статия ще научите един от начините да се създаде сигурна вход, използвайки PHP. Можете да напишете голямо код, но в същото време, пропуснете някои важни аспекти на сигурността. Основни понятия на компютърната сигурност се променят непрекъснато. Може би забравих да спомена някои подробности, ако е така, моля да ни уведомите за това и ние ще го добавите към съществуващата информация. Като следвате това ръководство, можете да защитите вашата лична информация от потребителите на много видове атаки. Видове атаки, от които ние ще ви помогнат да се предпазите:

  • SQL инжекции

  • Крадене на сесията

  • Network Подслушване

  • Cross Site Scripting

  • Атаките груба сила

Подходът е да се използват филтри криптиране на информация и други техники, които усложняват живот хакери.

Ние непрекъснато работим върху подобряването на сценария. Най-новата версия на скрипта е достъпно на GitHub. Може да забележите лека разлика между кода, който сте изтеглили, и кода в тази статия. Опитахме се да украсят сключване на HTML страници

Може да забележите, че ние не тясно tahy в PHP файлове с PHP код.

Препоръчваме ви да се създаде всички необходими файлове в различни папки в главната папка на програмата. Най-лесният начин да се създаде правилно архитектурата на местоположението на файлове - е да изтеглите един от най-новите версии на кода, връзките, представени по-горе.

Моля, използвайте тази молба за собствените си проекти. Не ви препоръчваме да го използвате като добър пример за промишлени колекции.

Какво ви трябва

Що се отнася до достъпа до MySQL ще използваме PHP класове Setu mysqli_ *, ще се наложи тази версия на PHP и MySQL.

  • PHP версия 5.3 или по-висока

  • MySQL версия 4.1.3 или по-висока

Можете, разбира се, е необходим уеб сървър, който е конфигуриран чрез използване на PHP. Шансовете са вашия уеб хостинг сървър, освен ако ти самият домакин на вашия сайт.

За да проверите версията на PHP и MySQL на вашия сървър, използвайте phpinfo ();

Стъпки

Част 1 от 8: Конфигуриране на сървър

  1. 1Инсталиране на уеб сървър, PHP и MySQL.

    Повечето хостинг е инсталиран PHP и MySQL. Вие ще трябва да проверите версията на тази статия е полезна за вас. Ако инсталиран продукт версии по-ниски от PHP5.3 и MySQL5 - в своя полза, ще научат повече за безопасността на страната домакин. Support Pack вашите продукти - е част от мерките за осигуряване на безопасността.

    Ако сте уеб хост сървър - у дома, след това да инсталирате най-новите продукти, необходими за нашата кандидатура. Като цяло, ако не използвате вашата колекция за производствени цели и работи под Windows или OS / X, инсталиране на XAMPP. Изтегляне на правилната версия за вашата операционна система тук:

    http://www.apachefriends.org/en/xampp.html

    Но не забравяйте, не използвайте XAMPP за конфигурация производство.

    Под Linux, използвайте пакетния мениджър за изтегляне на необходимите пакети. Някои от колекциите, например, Ubuntu, събира цялата необходима заявка на един пакет. Използвайте терминален прозорец за тези команди:

    ап-да инсталирате лампа-сървър ^ PhpMyAdmin



    След инсталирането на необходимите елементи, за да се определи надеждна парола Rue в MySQL.

Част 2 от 8: Конфигуриране на MySQL база данни

  1. 1Създаване на MySQL база данни.

    Отидете на база данни "secure_login".

    Вижте как Създаване-на-Database-в-бърз.

    Можете да използвате кода или да направи същото в PhpMyAdmin / любимата си клиент GUI MySQL:

    CREATE DATABASE `secure_login`; Забележка: Някои домакин не ви позволява да създадете база данни чрез PhpMyAdmin, научи как да направите това в Cpanel.

  2. 2Създаване на потребител с привилегии SELECT, UPDATE и го поставете.

    Създаване на потребител с привилегии е мярка за сигурност, ако в някакъв момент от нашия скрипт намери вратичка, и хакер счупи този блог - не можете да изтривате или премахнете нещо от базата данни. Използването на тези привилегии достатъчно за всички характеристики на нашата молба. Ако искате да се усложни, изграждане на потребителска за всяка функция.

    Разбира се, за да се създаде на потребителя, които сте съхранили в MySQL с определени привилегии. Напротив, при корена.

    Информация за потребителя, че ние създаваме:
    • Потребител: sec_user

    • Парола: eKcGZr59zAa2BEWU


    • Имайте предвид, че е желателно да се използват парола, която е различна от това, което се появява тук. Все пак, не забравяйте да смените кода от картинката по-долу и съединение база данни код PHP, които ние създаваме.

      Не забравяйте, че не е нужно да се помни тази парола, да я направи по-трудно. Можете да използвате генератор на парола

      Ето SQL код, за да създадете потребител на базата данни и назначаването на някои привилегии. Или можете да използвате GUI клиент за базата данни, например, PhpMyAdmin, ако желаете:

      Създаване на потребителски "sec_user" @ "Localhost", идентифицирани от "eKcGZr59zAa2BEWU"; GRANT SELECT, INSERT, UPDATE ON `secure_login`. * ДА "sec_user" @ "Localhost";

      Ако имате намерение да изтриете записи в таблиците си, можете да го добавите към списъка ИЗТРИЙ привилегии или създайте нов потребителски за тази функция. Не е нужно да изтриете привилегия за този скрипт.
    • 3Създайте таблица MySQL призова членовете.

      Този код създава таблица с 5 полета (ID, име, имейл, парола, сол). Ние използваме CHAR тип данни за полета с отдавна знаят за полета "парола" и "сол", дължината винаги ще бъде 128 символа. Използване ЗНАК, ние се опрости процеса:

      Създаване на таблица `secure_login`.`members` (` id` INT NOT NULL auto_increment първичен ключ, `username` VARCHAR (30) NOT NULL,` email` VARCHAR (50) NOT NULL, `password` CHAR (128) NOT NULL, `salt` CHAR (128) NOT NULL) ENGINE = InnoDB;
      Можете да го направите във всеки клиент.

    • 4Създайте таблица за опитите за влизане опити.

      Ние ще използваме тази таблица, за да запишете опитите за влизане опити. Това е един от начините да се усложни груба сила атака:

      Създаване на таблица `secure_login`.`login_attempts` (` user_id` INT (11) NOT NULL, `time` VARCHAR (30) NOT NULL) ENGINE = InnoDB

    • 5Създайте нов тест колона в членове.

      Важно е да тествате сценария за вход, представени по-долу скрипт, за да създадете потребител с конкретни подробности:
      • Потребителско име: test_user

      • Email: This email address is being protected from spambots. You need JavaScript enabled to view it.

      • Парола: 6ZaxN2Vzm9NUJT2y


      • Кодът трябва да се логнете с този потребител:

        INSERT INTO `secure_login`.`members` стойности (1," test_user "," This email address is being protected from spambots. You need JavaScript enabled to view it. ", '00807432eae173f652f2064bdca1b61b290b52d40e429a7d295d76a71084aa96c0233b82f1feac45529e0726559645acaed6f3ae58a286b9f075916ebf66cacc', 'f9aab579fc1b41ed0c44fe4ecdbfcdb4cb99b9023abb241a6db833288f4eea3c02f76e0d35204a8695077dcf81932aa59006423976224be0390395bae152d4ef');

      Част 3 от 8: Добави съединения страница в базата данни

      1. 1Добави страница глобалните настройки

        Създайте папка с име включва в главната папка на програмата и след това да създадете нов PHP файл в същата папка. С такова име PSL-config.php. В производството, монтажа, е препоръчително да поставите файла (и други) - извън кореновата приложението. Ако го направите, ние ви препоръчваме да направите промяна на конфигурацията, така че тя може да намери вашите файлове.

        Местоположение на файловете си извън главната папка означава, че вашите файлове не могат да бъдат намерени с помощта на URL адреса.

        Този файл съдържа глобалните настройки за конфигурация. Например, които могат да се присъединят или защитен (HTTPS) свързване и други важни подробности ...

        LT;? PHP / ** * В базата данни за информация за потребителя * / дефинира (хост, Localhost); // Приемащата искате да се свържете. дефинира (USER, sec_user); // Име на базата данни. дефинира (PASSWORD, 4Fa98xkHVd2XmnfK); // Парола на базата данни. дефинира (база данни, secure_login); // Name.define базата данни (CAN_REGISTER, има такива); дефинира (DEFAULT_ROLE, член); дефинира (Secure, FALSE); // ЗА РАЗВИТИЕ САМО!

      2. 2Добави страница на базата данни свързаност

        Този код PHP, че ще използвате, за да се свържете с нашата база данни mySQLcode. Създаване на нов PHP файл с име db_connect.php папка включва заявление и добавете кода по-долу. След това можете да поставите файла на всяка страница, когато се свързвате към базата данни.

        LT;? PHP include_once "PSL-config.php"; // Като functions.php не е включена $ MySQLi = нова MySQLi (HOST, USER, ПАРОЛА, база данни);

      Част 4 от 8: Създаване на функцията PHP

      Тези функции ще следи всички детайли на скрипта за регистрация. Добави всички функции в functions.php на страница, в заявленията папка включва.

      1. 1Отвори сейфа PHP сесия.
        PHP сесия известен с несигурност, важно е да се започне, не само посредством session_start (); горната част на страницата, на която се планира да използва PHP сесия. Ние създаваме функция, наречена sec_session_start (), следователно, на сесията отваря в безопасен режим. Ако сте загрижени за сигурността на бисквитките, вижте: Създаване-на-Secure-Session-Managment-System-в-Php-и-MySQL.

        Тази функция прави скрипта е много по-безопасно. Това спира на хакерите да получат достъп до сесия ID бисквитка чрез JavaScript (например, XSS) атака. И също така функционира session_regenerate_id (), която генерира сесиен идентификатор за всяка страница на опресняване помага Кражба сесии. Забележка: Ако използвате HTTPS във вашите Вход за приложения, сложи променливата "$ осигуряване" да е вярно. При получаването на производство - използва HTTPS.

        Създаване на нов файл наречен functions.php в кандидатурата си и да добавите код включва: LT;? PHP include_once "PSL-config.php"; функция sec_session_start () {$ session_name = "sec_session_id"; // Задаване на име на потребителски сесия $ осигури = SECURE; // Това спира JavaScript е в състояние за достъп до ID на сесията. $ Само HTTP = вярно; сесии // сили, за да използват само бисквитките. ако (ini_set ("session.use_only_cookies", 1) === FALSE) {хедър (Местоположение: не ../error.php?err=Could започне безопасно сесия (ini_set)); изход (); } // Взима настоящите бисквитки PARAMS. $ CookieParams = session_get_cookie_params (); session_set_cookie_params ($ cookieParams [живот, $ CookieParams [пътека, $ CookieParams [домейн, $ сигурна, $ Само HTTP); // Задава името на сесия на този, определен по-горе. session_name ($ session_name); session_start (); // Започнете session_regenerate_id на PHP сесия (); // Регенерирана сесията, изтриване на стария. }

      2. 2Създайте функция за вход.
        Тази функция проверява базата данни имейл и парола. Ако отговорът е вярно, тогава те са едни и същи. Добави тази функция в файл functions.php:
        функция за вход ($ имейл, $ парола, $ MySQLi) {// Използване подготвени отчети означава, че SQL инжекция не е възможно. ако ($ stmt = $ MySQLi-GT; подготви (SELECT ID, потребителско име, парола, солта от членовете, когато имейл = LIMIT 1)?) {$ Stmt-БТ; bind_param ("S", $ имейл); // Bind $ Email на параметър. $ Stmt-GT; Изпълнение (); // Изпълнение на заявката подготвени. $ Stmt-GT; store_result (); // Get променливи от резултат. $ Stmt-GT; bind_result ($ user_id, $ потребителско име, $ db_password, $ сол); $ Stmt-GT; донеса (); // Hash паролата с уникална сол. $ Password = хеш ("sha512", $ парола $ Salt.); ако ($ stmt-GT; NUM_ROWS == 1) {// Ако потребителят съществува проверяваме ако сметката е заключена // от твърде много опити за влизане, ако (checkbrute ($ user_id, $ MySQLi) == вярно) {// Account е заключена // изпратете имейл на потребителя казвайки им сметка е заключена връщане фалшиви; } Още {// Проверете дали паролата в базата данни мачове // паролата на потребителя, внесено. ако ($ db_password == $ парола) {// Password е правилно! // Вземете низ потребителски агент на потребителя. $ User_browser = $ _SERVER ['HTTP_USER_AGENT "; // XSS защита, както можем да отпечатате тази стойност $ user_id = preg_replace (/ [^ 0 - + / ,, $ USER_ID); $ _SESSION ['USER_ID "= $ user_id; // XSS защита, както можем да отпечатате тази стойност $ потребителско име = preg_replace (/ [^ A-Za-Z0-9 _ \ - + / ,, $ име); $ _SESSION ['Име' = $ потребителско име; $ _SESSION ['Login_string "= хеш (" sha512 ", $ парола $ User_browser.); // Влез успешна. върнете вярно; } Още {// парола не е правилна // Записваме този опит в $ база данни вече = времето (); $ MySQLi-GT; заявка (INSERT INTO login_attempts (user_id, време) VALUES ('$ user_id', '$ сега ")); връщане фалшиви; }}} Още {// Не съществува потребител. връщане фалшиви; }}}

      3. 3Функция Брут сила.
        Атаките Брут сила - е, когато един хакер се опитва хиляди пароли в един профил, или случайно генерирани или пароли от речника. В този сценарий, ако потребителят използва пет неуспешни опита zalohynytsya, сметката е блокирана.

        Атаките Брут сила е много трудно да се предотврати. Няколко опции за защита срещу такива атаки - използване CAPTCHA заключване тест потребителски сметки и добавяне на забавяне между вход, така че потребителят не може да влезете в сегашните 30 секунди.

        Ние силно препоръчваме употребата на CAPTCHA. За момента не се използва този метод в нашите код примери, но се надявам да го направят в близко бъдеще, като се използва SecureImage. Можете да използвате нещо по-сериозно като reCAPTCHA от Google.

        Какво щеше да се използва схемата, ние препоръчваме да използвате CAPTCHA изображения след два неуспешни опита за влизане да не причиняват неудобство за потребителите.

        Когато става въпрос за груба сила атаки, повечето разработчици блокира IP-адреса на нападателя. Въпреки това, има много инструменти, които да заобикалят такава съдба, например, хакерите могат да използват прокси сървър или променят IP-адрес автоматично всяка атака. В нашия код пишем неуспехите на Вход и заключване на потребителския акаунт. Това ще доведе до изпращането на имейл до потребителя с искане за възстановяване на паролата, в момента ние не го прилага в нашия код. Добави този код към functions.php:

        функция checkbrute ($ user_id, $ MySQLi) {// Get клеймото на текущото време $ сега = времето (); // Всички опити за влизане се преброяват от последните два часа. $ Valid_attempts = $ сега - (2 * 60 * 60);? Ако ($ stmt = $ MySQLi-GT; подготви (Изберете време ОТ login_attempts LT; codegt; LT; pregt където user_id = и час GT; '$ Valid_attempts " )) {$ Stmt-GT; bind_param ("I", $ user_id); // Изпълнение на заявката подготвени. $ Stmt-GT; Изпълнение (); $ Stmt-GT; store_result (); // Ако е имало повече от 5 не успя влизания ако ($ stmt-GT; NUM_ROWS GT; 5) {върнете вярно; } Още {връщане фалшиви; }}}

      4. 4Вижте информация за браузъра.
        Правим това като проверка на "USER_ID" и "login_string" сесийна променлива. Променлива login_string SESSION браузър разполага с информация и парола. Ние използваме информация браузъра, тъй като е малко вероятно, че един от потребителите смени браузъра в средата на сесията. Помага Кражба сесии. Добави тази функция във файла functions.php във вашето приложение включва:

        функция login_check ($ MySQLi) {// Проверете дали всички сесийни променливи са определени, ако (Isset ($ _ SESSION ['user_id ", $ _SESSION [' име ', $ _SESSION [' login_string")) {$ USER_ID = $ _SESSION [ "USER_ID"; $ Login_string = $ _SESSION ['login_string "; $ Име = $ _SESSION ['име'; // Вземете низ потребителски агент на потребителя. $ User_browser = $ _SERVER ['HTTP_USER_AGENT "; ако ($ stmt = $ MySQLi-GT; подготви (Изберете парола от членовете, когато ID = LIMIT 1)?) {// Bind $ USER_ID да параметър. $ Stmt-GT; bind_param ("I", $ user_id); $ Stmt-GT; Изпълнение (); // Изпълнение на заявката подготвени. $ Stmt-GT; store_result (); ако ($ stmt-GT; NUM_ROWS == 1) {// Ако потребителят съществува получат променливи от резултат. $ Stmt-GT; bind_result ($ парола); $ Stmt-GT; донеса (); $ Login_check = хеш ("sha512", $ парола $ User_browser.); Ако ($ login_check == $ login_string) {// Влезли сте! върнете вярно; } Още {// Няма влязъл връщане фалшиви; }} Още {// Няма влязъл връщане фалшиви; }} Още {// Няма влязъл връщане фалшиви; }} Още {// Няма влязъл връщане фалшиви; }}

      5. 5Clean URL на PHP_SELF
        Следните изчиства от променлива PHP_SELF сървър. Тази модификация функция, името се използва WordPress система за управление на съдържанието:

        функция esc_url ($ URL) {ако ('' == $ URL) {връщане $ URL; } $ Url = preg_replace ("| [^ а-z0-9- ~ + _ # =;, /:.?!% @ $ \ | * \" () \\ X80 - \\ xff | I "," ", $ URL); $ Strip = масив ("% 0d ','% 0A ','% 0D ","% 0А "); $ Url = (низ) $ URL; $ Count = 1; докато ($ брой) {$ URL = str_replace ($ ивица, '', $ URL, $ брой); } $ Url = str_replace ("; // ',': //", $ URL); $ Url = htmlentities ($ URL); $ Url = str_replace ("усилвател; ',' # 038;", $ URL) ; $ Url = str_replace (',' # 039; ", $ URL); ако ($ URL ==!" / ") {// Ние сме заинтересовани само в относителни връзки от $ _SERVER ['" връщане "PHP_SELF"; } Още {връщане $ URL; }}

        Използването на нефилтрирана променлива сървър - възможно ли е да го използвате в кръстосани сайта скрипт атаки. Повечето източници предлагат да се използва htmlentities (), обаче, тази опция не е напълно премахва риска.

        Други съветват да напусне атрибут действие е празно или сложи нулева линия. Това действие оставя формата отворена за атаки от кражба на вградена рамка.

      Част 5 от 8: Създаване на преработка на страница

      1. 1Добави обработка страница за вход (process_login.PHP)

        Създайте файл за обработка на данни за вход наречени process_login.php в молбата Ви включва.

        Ние ще използваме mysqli_ * функции PHP, защото тя е една от най-новите MySQL разширенията.

        LT;? PHP include_once "db_connect.php"; include_once "functions.php"; sec_session_start (); // Нашата обичай сигурен начин за стартиране на PHP session.if (Isset ($ _ POST ['имейл', $ _POST ['p')) {$ имейл = $ _POST ['имейл'; $ Password = $ _POST ['р'; // Password.if хешираното (вход ($ имейл, $ парола, $ MySQLi) == вярно) {// Влез успех с глава ("Местоположение: ../protected_page.php"); } Още {// Вход успя с глава ("Местоположение: ../index.php?error=1"); }} Още {// Правилните POST променливи не са били изпратени на тази страница. ехо "Невалидна заявка"; }

      2. 2Създаване на изход скрипт.

        Вашият скрипт трябва да започне сесия, да го изтриете, и след това се пренасочи към друго място. Забележка: да е добра идея - добави защита CSRF ако някой изпрати линк към скритата страница. За да разберете повече информация за CSRF, можете да посетите Nightmares програмиране.

        Код за потребителски изход, можете да добавите файл, наречен logout.php във вашето приложение включва, както следва:

        LT;? PHP include_once "включва / functions.php"; sec_session_start (); // Отмяна на зададените всички сесийни стойности $ _SESSION = масив (); // Вземане параметри сесия $ PARAMS = session_get_cookie_params (); // Изтриване на действителната бисквитката. setcookie (session_name (), '', времето () - 42,000, $ PARAMS [пътека, $ PARAMS [домейн, $ PARAMS [сигурна, $ PARAMS [Само HTTP); // Унищожи сесия session_destroy (); заглавна част ("Местоположение: ../ index.php");

      3. 3Регистрация страница.

        Регистрация код, включен в две нови файлове, наречени register.php в главната папка на програмата и register.inc.php папка включва. Какво го прави:
        • Получава и проверява името на потребителя при регистриране

        • Получава и проверява имейла на потребителя

        • Получава и проверява паролата при регистриране

        • Изпреварва парола и го изпраща обратно към страницата за регистрация


        • Повечето проверки е в JavaScript, от страна на клиента. Това е така, защото потребителят не трябва да се заобиколят тези проверки. Какво потребителят иска да създаде по-сигурна сметка? Ние ще обсъдим в следващата част JavaScript

          Сега създадете файл register.php и добавете следния код:

          LT;? PHP include_once "включва / register.inc.php"; include_once "включва / functions.php"; ? Gt; LT;! DOCTYPE htmlgt; LT; htmlgt; LT; headgt; LT; мета кодировка = UTF-8gt; LT; titlegt; Secure Login: Регистрация Formlt; / Titlegt; LT; Тип скрипт = текст / JavaScript SRC = JS / sha512.jsgt; LT; / Scriptgt; LT; Тип скрипт = текст / JavaScript SRC = JS / forms.jsgt; LT; / Scriptgt; LT; линк отн = стилове HREF = стилове / main.css / Gt; LT; / Headgt; LT; bodygt; LT;! - Регистрационна форма за изход ако постът променливи не са посочени или ако скрипта за регистрация, причинена от грешка. --gt; LT; h1gt; Регистрирайте се с uslt; / H1gt; LT;? PHP, ако {ехо $ ERROR_MSG (празна ($ ERROR_MSG)!); }? Gt; LT; ulgt; LT; ligt; Потребителските имена могат да съдържат само цифри, малки и главни букви и underscoreslt; / Ligt; LT; ligt; Имейли трябва да имат валиден имейл formatlt; / Ligt; LT; ligt; Паролите трябва да са най-малко 6 символа longlt; / Ligt; LT; ligt; Паролите трябва да съдържат LT; ulgt; LT; ligt; Най-малко една главна буква (A..Z) LT; / Ligt; LT; ligt; Най-малко една малка буква (a..z) LT; / Ligt; LT; ligt; Най-малко един брой (0-9) LT; / Ligt; LT; / Ulgt; LT; / Ligt; LT; ligt; Вашата парола и потвърждение трябва да съвпада exactlylt; / Ligt; LT; / Ulgt; LT; формуляр за действие = LT;? PHP ехо esc_url ($ _ СЪРВЪРА ['PHP_SELF "); ? Gt; метод = пост име = registration_formgt; Потребител: LT; тип вход = "текст" име = "потребителско име" ID = "потребителско име" / GT; LT; brgt; Email: LT; Вид вход = име текст = имейл ID = имейл / Gt; LT; brgt; Парола: LT; Вид вход = Парола = парола ID = парола / Gt; LT; brgt; Потвърди паролата: LT; Вид вход = Парола = confirmpwd ID = confirmpwd / Gt; LT; brgt; LT; вход тип = бутона стойност = Регистрирайте OnClick = връщане regformhash (this.form, this.form.username, this.form.email, this.form.password, this.form.confirmpwd); / Gt; LT; / Formgt; LT; ПГТ; Назад към LT; един HREF = index.phpgt; акаунта си pagelt; / Agt; .lt; / ПГТ; LT; / Bodygt; LT; / Htmlgt;

          File register.inc.php папка включва, да включва:

          LT;? PHP include_once "db_connect.php"; include_once "PSL-config.php"; $ ERROR_MSG =; ако (Isset ($ _ POST ['име', $ _POST ['имейл', $ _POST ['p')) {// дезинфекцирайте и валидиране на данните, предадени в $ потребителско име = filter_input (INPUT_POST, "потребителско име", FILTER_SANITIZE_STRING); $ Email = filter_input (INPUT_POST, "имейл", FILTER_SANITIZE_EMAIL); $ Email = filter_var ($ имейл, FILTER_VALIDATE_EMAIL); ако (! filter_var ($ имейл, FILTER_VALIDATE_EMAIL)) {// Не е валиден имейл $ ERROR_MSG. = "Lt; р клас = errorgt; Имейл адресът, който сте въвели не е validlt; / ПГТ; "; } $ Password = filter_input (INPUT_POST, "р", FILTER_SANITIZE_STRING); ако (strlen ($ парола)! = 128) {// ДКР хешираното трябва да е с дължина 128 символа. // Ако не е, нещо наистина странно се е случило $ ERROR_MSG. = "Lt; р клас = errorgt; Невалиден парола configuration.lt; / ПГТ; "; } // Име валидност и валидността на паролата са били проверени от страна на клиента. // Това трябва да бъде адекватно, както никой не печели никакви предимства от // нарушаването на тези правила. // $ Prep_stmt = SELECT идентификация от членовете, когато имейл =? LIMIT 1; $ Stmt = $ MySQLi-GT; подготви ($ prep_stmt); ако ($ stmt) {$ stmt-GT; bind_param ("S", $ имейл); $ Stmt-GT; Изпълнение (); $ Stmt-GT; store_result (); ако ($ stmt-GT; NUM_ROWS == 1) {// A потребител с този имейл адрес вече съществува $ ERROR_MSG. = "Lt; р клас = errorgt; Потребител с този имейл адрес вече exists.lt; / ПГТ; "; }} Още {$ ERROR_MSG. = "Lt; р клас = errorgt; Database errorlt; / ПГТ; "; } // TODO: // Ще също така да вземе предвид ситуацията, когато потребителят не разполага // права да направя регистрация, чрез проверка какъв тип потребител се опитва да // извършите operation.if (празна ($ ERROR_MSG)) {// Създаване на случаен сол $ random_salt = хеш ("sha512", uniqid (openssl_random_pseudo_bytes (16), истина));. // Създаване подсолена парола $ парола = хеш ("sha512", $ парола $ Random_salt); // въведете новия потребител в базата данни, ако ($ insert_stmt = $ MySQLi-GT;???? подготвят (INSERT INTO членове (потребителско име, имейл, парола, сол) стойности (,,,))) {$ Insert_stmt-GT; bind_param ("сетълмент на ценни книжа", $ потребителско име, $ имейл, $ парола, $ random_salt); // Изпълнение на заявката подготвени. ако (! $ insert_stmt-GT; изпълни ()) {удар с глава ("Местоположение: ../error.php?err=Registration недостатъчност: INSERT"); }} Header ("Местоположение: ./register_success.php"); }}

          Ако данните на POST е пропусната във форма, има форма за регистрация. Бутон за потвърждаване на формата - тичам regformhash на JavaScript (). Функция прави необходимите проверки и издаване формата, когато всичко е наред. JavaScript функция се дискутира в следващия раздел.

          Ако съществуват данни поста, след проверките на сървъра, данните ще бъдат почистени и proveryatsya. Имайте предвид, че тези проверки не са били извършени, докато пишете. Някои от проблемите, дискутирани във файла коментари. В момента тестваме формат имейл адрес, дължина на паролата, и че лицето не може да се регистрирате с имейл адреса, който вече съществува в базата данни.

          Ако всички проверки са успешни, той създава нов потребител, и добавя нов запис в членовете на масата.


        Част 6 от 8: Създаване на файлове

        1. 1Създайте файл sha512.JS

          Този файл е реализация на алгоритъм sha512 в JavaScript. Ние използваме хеш функция, която не оставя паролата като обикновен текст.

          Можете да свалите файла тук pajhome.org.uk

          (Това е и хранилище GitHub)

          Запишете файла в папка, наречена "JS", извън кореновата приложението.


        2. 2Създайте файл форми.JS
          Файлът трябва да създадете папка, JS, се справят heshyrovanyem пароли за вход форми (formhash ()) и регистрация (regformhash ()) форми:

          функция formhash (форма, парола) {// създаване на нов входен елемент, това ще бъде нашата област хеширано парола. Var р = document.createElement (вход); // Добавяне на нов елемент на нашата форма. form.appendChild (р); p.name = р; p.type = скрито; p.value = hex_sha512 (password.value); // Уверете обикновено текстово паролата не се получи изпратени. password.value =; // Накрая изпратете формата. form.submit (); } Function regformhash (форма, UID, имейл, парола, конф) {// Проверете всяко поле има стойност, ако (uid.value == '' || email.value == '' || password.value == '' . | | conf.value == '') {сигнал ("Трябва да предоставите всички необходими подробности, моля опитайте отново"); връщане фалшиви; } // Проверете usernamere = / ^ \ w + $ /; (! re.test (form.username.value)), ако {сигнал (. име трябва да съдържа само букви, цифри и подчертава Моля, опитайте отново); form.username.focus (); връщане фалшиви; } // Проверете дали паролата е достатъчно дълъг (мин 6 символа) // Проверката се дублира по-долу, но това е включено, за да се даде по-// конкретни насоки за потребителя, ако (password.value.length LT; 6) {сигнал ("дълги пароли трябва да бъде най-малко 6 символа Моля, опитайте отново. '); form.password.focus (); връщане фалшиви; } // Най-малко един брой, една малка буква и една главна буква // Най-малко шест знака Var Re = / (? =. * \ D) (? =. * [Az) (? =. * [AZ). { 6} /; ако {сигнал ("Паролите трябва да съдържат най-малко един номер, една малка буква и една главна буква Моля, опитайте отново.") (re.test (password.value)!); връщане фалшиви; } // Проверете парола и потвърждение, са същите, ако (password.value = Conf.value!) {Сигнал ("Вашата парола и потвърждение не съвпадат Моля, опитайте отново. '); form.password.focus (); връщане фалшиви; } // Създаване на нов входен елемент, това ще бъде нашата област хеширано парола. Var р = document.createElement (вход); // Добавяне на нов елемент на нашата форма. form.appendChild (р); p.name = р; p.type = скрито; p.value = hex_sha512 (password.value); // Уверете обикновено текстово паролата не се получи изпратени. password.value =; conf.value =; // Накрая изпратете формата. form.submit (); върнете вярно; }

          И в двата случая, JavaScript heshiruet парола и я изпраща до пункт на данни, чрез създаване на скрито поле.


        Част 7 от 8: Създаване на HTML страница

        1. 1Създаване на формуляр за вход (вход.PHP).

          Това HTML форма с две полета, "парола" и "имейл" адрес. Тази форма представя бутон нарича JS formhash (), която hesh генерира парола и изпраща "съобщение" и "р" (heshyrovani и пароли) сървър. Създайте файл в главната папка.

          Когато вход е най-добре да се използва нещо скрито от обществото, в тази статия ние използваме имейл, както Login ID и име да ви идентифицира.

          Имайте предвид, че дори и след heshyrovanyya парола, пак Ви препоръчваме да се използва протокол HTTPS (TLS / SSL), по време на предаването на пароли в промишлен монтаж. Един heshyrovanye малко. Възможно е да се използват атаките човек-в Близкия, хеширане четат и използват информацията, за да влезете.

          LT;? PHP include_once "включва / db_connect.php"; include_once "включва / functions.php"; sec_session_start (); ако (login_check ($ MySQLi) == вярно) {$ влезли = "в"; } Още {$ влизали = "вън"; }? Gt; LT;! DOCTYPE htmlgt; LT; htmlgt; LT; headgt; LT; titlegt; Secure Login: Влезте Inlt; / Titlegt; LT; линк отн = стилове HREF = стилове / main.css / Gt; LT; Тип скрипт = текст / JavaScript SRC = JS / sha512.jsgt; LT; / Scriptgt; LT; Тип скрипт = текст / JavaScript SRC = JS / forms.jsgt; LT; / Scriptgt; LT; / Headgt; LT; bodygt; LT;? PHP, ако (Isset ($ _ GET ['грешка')) {ехо "LT; р клас = errorgt; Error Logging В! LT; / ПГТ; "; }? Gt; LT; формуляр за действие = включва метод / process_login.php = пост име = login_formgt; Email: LT; Вид вход = име текст = имейл / Gt; Парола: LT; Вид вход = Парола = парола ID = парола / Gt; LT; вход тип = бутона стойност = Влез OnClick = formhash (this.form, this.form.password); / Gt; LT; / Formgt; LT; ПГТ; Ако не разполагате с потребителско име, моля, LT; един HREF = register.phpgt; registerlt; / Agt; LT; / ПГТ; LT; ПГТ; Ако сте готови, моля LT; един HREF = включва / logout.phpgt; влезте outlt; / Agt; .lt; / ПГТ; LT; ПГТ; В момента сте влезли LT;? PHP ехо $ влезете? GT; .lt; / ПГТ; LT; / Bodygt; LT; / Htmlgt;

        2. 2Добави страница register_success.PHP

          Създаване на нова страница PHP нарича register_success.php, в главната директория. Това е страница, на която потребителите ще бъдат прехвърлени след успешна регистрация. Написахме нашата страница register_success.php, изглежда така:

          LT;! DOCTYPE htmlgt; LT; htmlgt; LT; headgt; LT; мета кодировка = UTF-8gt; LT; titlegt; Secure Login: Регистрация Successlt; / Titlegt; LT; линк отн = стилове HREF = стилове / main.css / Gt; LT; / Headgt; LT; bodygt; LT; h1gt; Регистрация успешно! LT; / H1gt; LT; ПГТ; Сега можете да се върнете към LT; един HREF = index.phpgt; акаунта си pagelt; / Agt; и влезте inlt; / ПГТ; LT; / Bodygt; LT; / Htmlgt;

        3. Създайте грешка страница

          Създаване на нова HTML страница в главната директория на приложението.
          Какво error.php. Тази страница, където потребителите ще бъдат предавани, ако грешката отива в акаунта си или се регистрирайте. Забележка: Тази страница заключение трябва да бъде добре филтрирана срещу XSS атаки. Примерен код:

          LT;? PHP $ грешка = filter_input (INPUT_GET, "ERR", $ филтър = FILTER_SANITIZE_STRING); ако ($ грешка!) {$ грешка = "Oops! Случило неизвестна грешка. "; }? Gt; LT;! DOCTYPE htmlgt; LT; htmlgt; LT; headgt; LT; мета кодировка = UTF-8gt; LT; titlegt; Secure Login: Errorlt; / Titlegt; LT; линк отн = стилове HREF = стилове / main.css / Gt; LT; / Headgt; LT; bodygt; LT; h1gt; Имаше problemlt; / H1gt; LT; р клас = errorgt; LT;? PHP ехо $ грешка; ? Gt; LT; / ПГТ; LT; / Bodygt; LT; / Htmlgt;

        Част 8 от 8: Защита на страници

        1. 1Защитно страница скрипт.

          Един от най-често срещаните проблеми за идентификация - е, че програмистът забрави да провери дали потребителят е вече в системата. Важно е да се използва кода представени по-долу за всяка защитена страница. Използвайте тази функция, за да проверите състоянието на потребителя.

          // Включи свързване на базата данни и функции тук. Виж 3.1. sec_session_start (); ако (login_check ($ MySQLi) == вярно) {// Добавете съдържание, защитено страница тук! } Още {ехо "Нямате права за достъп до тази страница, моля логнете."; }

          Включили сме пример за защитена страница. Създайте файл с име protected_page.php в главната папка на програмата. Съдържанието на файла трябва да изглеждат така:

          LT;? PHP include_once "включва / db_connect.php"; include_once "включва / functions.php"; sec_session_start (); ? Gt; LT;! DOCTYPE htmlgt; LT; htmlgt; LT; headgt; LT; мета кодировка = UTF-8gt; LT; titlegt; Secure Login: Защитена Pagelt; / Titlegt; LT; линк отн = стилове HREF = стилове / main.css / Gt; LT; / Headgt; LT; bodygt; LT;? PHP, ако (login_check ($ MySQLi) == вярно):? GT; LT; ПГТ; Добре дошли LT;? PHP ехо htmlentities ($ _ SESSION ['име'); ? Gt;! Lt; / ПГТ; LT; ПГТ; Това е пример защитена страница. За достъп до тази страница, потребителите трябва да се идентифицирали. На определен етап, ние също така ще проверява ролята на потребителя, така че страниците ще бъдат в състояние да определят вида на потребителското право на достъп до страницата. LT; / ПГТ; LT; ПГТ; Назад към LT; един HREF = index.phpgt; акаунта си pagelt; / Agt; LT; / ПГТ; LT;? PHP друго:? GT; LT; ПГТ; LT; педя клас = errorgt; Нямате права за достъп до този page.lt; / Spangt; Моля LT; един HREF = index.phpgt; loginlt; / Agt ;. LT; / ПГТ; LT;? PHP endif; ? Gt; LT; / Bodygt; LT; / Htmlgt;

          Нашата молба дава тази страница, след успешно влизане. Вашето собствено приложение не е задължително да съвпада с нашата.


        Съвет

        • С малки изменения, примери за тези скриптове могат да работят с други SQL системи, например, SQLLite или PostreSQL.

        • Ако искате да използвате различен алгоритъм за хеширане вместо sha512, опитайте Whirlpool. Избягвайте Gost, SHA1 и md5. Вдъхнови потребителите си създаде силни и уникални пароли с големи и малки букви, цифри и символи. Мисля, че това може да бъде най-добре, ако вашите потребители ще използват различно име за вход и потребителски имена.

        • Използвайте HTML и CSS, за да украсят на Вход и другите искате.

        • Не използвайте md5 () в скриптове за вход, md5 хеш не се считат за безопасни.

        Предупреждение

        • Влез и регистрационни страници трябва да използват HTTPS. Тези скриптове не ви принуди да използвате този протокол, но в промишлен монтаж трябва да използвате HTTPS.

        • Уверете се, че потребителят може да видите вашия PHP скрипт, който може да се обърка, когато конфигурацията на сървъра. Има вероятност, че потребителите ще могат да събират информация за вашите имена на база данни и пароли, ако си PHP скрипт се отваря. В идеалния случай, всички скриптове, които са в други скриптове или страници трябва да се съхраняват на сървър файловата система с връзки като "../../includes/myscript.inc.php"

        • Не е 100% сигурност. Не забравяйте да се запознаят с най-новите новини предпазни мерки за подобряване на сигурността на вашите скриптове.

        • Сценарият срещу Брут сила, която блокира потребителски акаунт не може да бъде конфигуриран правилно. Препоръчваме използването на технологии като CAPTCHA.

        • Можете да използвате 2 Zend, Symfony или CakePHP. Тези рамки включват и мерки за закрила и подпомагане по време на влизане. Можете също така да се подобри прилагането използване рамки.

        • С помощта на CAPTCHA на страницата за вход е силно препоръчително да се уверите, че изпълнява атаки и груба сила DoS ще бъде много по-трудно. Препоръчваме ви да използвате CAPTCHA след два неуспешни опита за влизане. В момента този метод не се използва в нашите код примери.