Қауіпсіздік

Мен PHP қауіпсіздігі туралы табылған ең жақсы ресурс - 2018 жылы Қауіпсіз PHP программаларын құру туралы нұсқаулар отырып, Paragon Initiative ұйымының блогы арқылы танудым.

Веб-Қосымша Көзімділігі

Әр PHP дайыншысы үшін әбден маңызды, веб-қосымша көзімділік жасау бойынша негіздерді түсіну керек, ол бірнеше кезек тақырыптарға бөлінеді:

  1. Код-деректерді бөлу.
    • Деректер код ретінде іске қосылады, SQL Injection, Cross-Site Scripting, Жергі/Удаленная файл қосу, жне.
    • Код деректер ретінде басып шығарылса, ақпарат сыры (мәні C программаларында, ASLR атында) жаттығу жасау мүмкін.
  2. Бағдарлама логикасы.
    • Аутентификациянын же авторизациянын басқаруы жоқ.
    • Кіру жасау.
  3. Жұмыс орны.
    • PHP нұсқалары.
    • Үшінші тарату кітапханалар.
    • Жұмыс жасау жүйесі.
  4. Криптографияның қуаттары.

Сіздің веб-қосымшаңызды қолданатын адамдар бар, оларды қолдану үшін қажетті қауіпсіздік заңын алу керек. Бәрімізге көмек көрсеткен The Open Web Application Security Project (OWASP) қолданбасы бар жанартылған көзімділік мәселелері мен оларға қарсы қалу тәсілдері туралы жаттығу жасады. Бұл қауіпсіздікке тырысып көрген дайыншылар үшін бұл маңызды болатын бір оқу материал. Қақтығыш Жақтыру: PHP Қауіпсіздігі Padraic Brady көмекші PHP қосымша көзімділігін айтады.

Парольді Хештеу

Көптеген уақытта барлық PHP қосымшалары анықталу үшін пайдаланушы логиніне негізделгеніп жасалады. Пайдаланушы аты мен парольдар базада сақталады және кіреу кезінде пайдаланушыларды аутентификациялау үшін қолданылады.

Сіз парольдарды сақтау алдында оларды дұрыс хештеу жасау ыңғайлы екенін еске салу керек. Хештеу және шифрлау көбіне бір көлемге ие өзгеше неше емес іс-шара болады, бұл адамдарды қиыстырады.

Хештеу бұл бұрышты, бір жолды бағалау функциясы. Бұл жайылымы теріссіздікке дайын болмайтын сызба өнімдерін тізбеге салады. Бұл оның екіншісін басқа бірліктермен салыстыру үшін пайдалана аласыз, бірауыз ұсынылатын тармақ арқылы пайдаланушы сақтау жолауымен салыстырылса, барлық пайдаланушы есептікті сыйылған болады.

Хештеудің өзгермейтіндігі, шифрлаудың (ескі тілде кілт бар болса) боларды бірдей қарапау көзімен ауыстырылатын болуы үшін пайдаланылуы туралы білімді жасайды. Шифрлау басқа көлемдерде қолдау көрсетеді, бірақ парольді қауіпсіздікті сақтау үшін жарақаттамас жол боларында пайдаланулмайды.

Парольдарды ақысыз солтылап жасау да өте маңызды. Әр парольды хештеу алдында онымен өзара ретінде көмекші саусақты қосу арқылы жасау үшін, сөздік атакалар мен «көмекші кестелер» (жалпы парольдердің криптографиялық хештарын арттау үшін арттырылған тізбек) пайдалану артық болмайды.

Хештеу және солттау пайдаланушылар көптеген қызметтер үшін тең парольдерді пайдаланады және пароль сапасы болуы мүмкін болатын қажетті жаттығулар екенін ескеруі керек.

Жалпыдан, ағымдағы пайдаланушы парақшасында анықталған сөздік құйма әдісімен болмаса, жылжымайтын, жалпы көмекші шифрлау функциясын (мысалы, SHA256) пайдалану керек. 2018 жылы қолдануға алынған құпия сөздік құйма алгоритмдерінің қысқаша тізімі:

Кейіннен, ағымдағы кезде PHP бұны оңай жасайды.

password_hash арқылы құпия сөздік құйу

PHP 5.5 кезінде password_hash() кіріс жасалды. Бұл уақытта PHP-ның қолдау көрсететін ең қауіпті алгоритмының BCrypt пайдаланылады. Төмендегі кодта біз стрингді құпия сөздікке айналдырамыз, содан кейін шифрді жаңа стрингге тексереміз. Себебі екі көзге түсінетін айналымдарымызды сақтасақ (‘secret-password’ сөзі мен ‘bad-password’ сөзі) бұл кіру бас тартар.

<?php
require 'password.php';

$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);

if (password_verify('bad-password', $passwordHash)) {
    // Дұрыс құпия сөз
} else {
    // Қате құпия сөз
}

password_hash() сіздің үшін құпия сөзді солттау үшін қамтамасыз етеді. Солт, хештің бөлігі ретінде, алгоритм және “мартабе” боларымен бірге сақталады. password_verify() бұны келесінен тексеру үшін шолып алмайды, сол себепті сіздің солттарын сақтау үшін өзіңізге көмек көрсететін басқа жинауы болмайды.

Деректерді сүзу

PHP кодыңызға ендіген чужа деректемен дәмдеу үшін дегеніміз жатпай. Оны қолдануға алу алдын, оны санитарлау және тексеру жасау керек. filter_var() және filter_input() функциялары мәтінді санитарлау және мәтін пішімдерін (мысалы, электрондық пошта мекенжайлары) тексеру үшін пайдаланылады.

Чужа деректеме бар болатынша: $_GET және $_POST форма деректері, $_SERVER суперглобалындағы кейбір мәндер, және HTTP сұрау жасау тізімі арқылы fopen('php://input', 'r'). Есте сақтау, пайдаланушы тарапынан жіберілген форма деректерімен шектелген емес. Жүктелген және жүктелген файлдар, сессия мәндері, куки деректері және қосымша веб қызметтерінен деректер де чужа деректе саналады.

Чужа деректеме сақталып, біріктіріліп, көмегімен жасалса да, ол дайын чужа деректе боларымыз. Әр уақыт кодыңызда деректемен өңдеу, шығару, жаттығу немесе қосу кезінде, деректемені дұрыс сүзгендігіні және оны дегенімізді сұрау etsеңіз.

Мәні бойынша деректеме _сүзілетініп _болуы мүмкін. Мысалы, сүзілген чужа деректеме HTML бет шығаруда келеді, ол HTML және JavaScript кодтарын сайтыңызда орындау үшін пайдалана алады! Бұл Cross-Site Scripting (XSS) деп аталады және өте қауіпті атака болуы мүмкін. XSS-тан болу үшін барлық пайдаланушы тасарымындағы деректемені HTML тегтерін аластату үшін strip_tags() функциясын немесе арнайы мааныны бар караларымен шығармалардың htmlentities() немесе htmlspecialchars() функцияларымен аластату көмегімен санитарлау мүмкін.

Басқа бір мысал, команда жолау үшін параметрлерді жіберу. Бұл жаттығу болуы мүмкін (және әдетте елді болмайды), бірақ тіркемелі escapeshellarg() функциясын пайдалана отырып, орындалатын команданың аргументтерін санитарлау мүмкін.

Соңғы мысал, файл жүктеу үшін чужа деректемені қабылдау. Бұл файлдың атын файл жолы болатында қолдану алады. Сізге "/", "../", нұл байттар немесе басқа белгішелерді файл жолынан аластату көмегі көрсетіледі, сондықтан ол қупия, жасырын немесе куәланды файлдарды жүктеу мүмкін емес.

Санитарлау

Санитарлау чужа деректеменің жарамсыз немесе қауіпсіз белгішелерін (немесе оларды аулау) жоюды мақсат етеді.

Мысалы, сіздің HTML бетіне қосу немесе жасырын SQL сұрауына қосу алдын чужа деректемені санитарлау керек. PDO пайдалану кезінде параметрлерді қолданғанда, ол сізді үшін деректемені санитарлады.

Базарласқанда, деректемені HTML бетіне қосу кезінде бірнеше қауіпсіз HTML тегтеріне рұқсат беру қажет болуы мүмкін. Бұл жасырын түсіндіруге ыңғайлы емес және басқа, біраз ортаныпты басқаруды қолданумен, Markdown немесе BBCode ұсыну арқылы өтіп, бұна бірақ көптеген ішкі түзетуді шақырудан бас тартарып көбірек рұқсат береді. Мысалы, HTML Purifier төмендегі мынамын сақталған тегтерді жою үшін қолданылады.

Санитарлау сүзгіштерін көру

Жасырындату

Пайдаланушылардан немесе басқа деу-шаралардан өзіндік деректемені unserialize() функциясы арқылы ашу жасырындату қауіпті. Бұл жасырындатуды пайдаланушылардың мақсаттарына сәйкес өзгертетін (пайдаланушы тараптын маанымен) объекттерді инстантциялауға болады, өйткені объекттер өзінді қолданылмаса да. Сондықтан сенімсіз деректемелерді жасырындатудан төмендегі таңдаулар бойынша шағымалайсыз.

Пайдаланушыға жасырындатылатын деректемелерді жасау үшін JSON ( json_decode және json_encode) функциялары арқылы безопас, стандартты деректеме алмасын пайдалануыңызды сізге мүмкін болады.

Тексеру

Тексеру чужа деректемені құттық тізбегендігін тексереді. Мысалы, тіркеу жасау кезінде электрондық пошта мекенжайын, телефон нөмірін немесе жасын тексеру қажет болуы мүмкін.

Тексеру сүзгіштерін көру

Конфигурация Файлдары

Сіздің қолданбалары үшін конфигурация файлдарын жасау кезінде ең жақсы әдістерді ұсыну көмек көрсетеді:

Тіркеу Жасаулары

ЕСКЕРТУ: PHP 5.4.0-нан бастап register_globals баптауы аластатылды және қолдану мүмкін емес. Бұл тек қалыпты қолданушыларды онымен жаттығу байқаулау үшін көрсетілген. Жаттығу қолдану тобын жақсарту кезінде болатын дайындалу үшін ескертуді қосамыз.

Әрекетке асырайтын кезде register_globals баптауы, көмек көрсетілген кезде, сіздің қолданбаңыздың глобал дайындалуында ( $_POST, $_GET және $_REQUEST бойынша бірнеше түрлі анықтамалар) бірнеше түрлі түрлерді мәндерге қолжетімді көрсетеді. Бұл, сіздің қолданбаңыздың деректемесі келетін жерді таппай алмауда, өмір сүрейдігін жаттайды.

Мысалы: $_GET['foo'] $foo арқылы қолжетімді болады, сондықтан анықталған мәндерді мұраттауы болмайды.

Егер сіз PHP < 5.4.0 пайдалана түсесіздерсіз, содан әрекеттейін register_globals баптауын өшірілген болуын анықтап көріңіз.

Қате Туралы Хабарлау

Қате жазуы, әдебиеттерді іздеу кезіндегі белгілі қатарды табу үшін пайдалы болуы мүмкін, бірақ бұл сіздің қолданбаңыздың құрылымы туралы мәліметтерді шетелге ашуы мүмкін. Бұл хабарлардың шығарылмасыны талап ететін проблемалардан сіздің қолданбаңызды сақтау үшін, дайындау мен жоба (онлайн) режимінде серверіңізді басқаруыңыз керек.

Даму

Әр түрлі қателерді көрсету үшін даму кезінде php.ini файлында келесі параметрлерді орнатыңыз:

display_errors = On
display_startup_errors = On
error_reporting = -1
log_errors = On

-1 мәнін енгізу, болашақтағы PHP нұсқаларында жаңа деңгейлер мен константалар қосылса да, барлық мүмкін қателерді көрсетеді. PHP 5.4.нан бастап E_ALL константы да бұл мәнімен жұмыс істейді. - php.net

E_STRICT қате деңгей константасы 5.3.0-да келтірілген және E_ALL бөлімі емес, бірақ 5.4.0-да E_ALL бөліміне қосылды. Бұл не болмасақты 5.3 нұсқасында барлық мүмкін қателерді хабарлау үшін сізді E_ALL | E_STRICT жосып тартуыңыз көрінеді.

PHP нұсқасы бойынша барлық мүмкін қателерді хабарлау

Жасау

Сіздің жасау ортаңызда қателерді жасау үшін php.ini файлын келесідей түрде конфигурациялаңыз:

display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On

Бұл параметрлермен бірге, продакшн ортасында қателер веб сервердің қателер журналына жазылады, бірақ пайдаланушыға көрсетілмейді. Бұл параметрлер туралы толығырақ мәліметтер үшін PHP нұсқамен таныстырылған мәліметтерді көру үшін: