Мен PHP қауіпсіздігі туралы табылған ең жақсы ресурс - 2018 жылы Қауіпсіз PHP программаларын құру туралы нұсқаулар отырып, Paragon Initiative ұйымының блогы арқылы танудым.
Әр PHP дайыншысы үшін әбден маңызды, веб-қосымша көзімділік жасау бойынша негіздерді түсіну керек, ол бірнеше кезек тақырыптарға бөлінеді:
Сіздің веб-қосымшаңызды қолданатын адамдар бар, оларды қолдану үшін қажетті қауіпсіздік заңын алу керек. Бәрімізге көмек көрсеткен 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()
бұны келесінен тексеру үшін шолып алмайды, сол себепті сіздің солттарын сақтау үшін өзіңізге көмек көрсететін басқа жинауы болмайды.
password_hash()
туралы білуpassword_compat
password_hash()
RFC-сі жіберіңіз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()
функциясын пайдалана отырып, орындалатын команданың аргументтерін санитарлау мүмкін.
Соңғы мысал, файл жүктеу үшін чужа деректемені қабылдау. Бұл файлдың атын файл жолы болатында қолдану алады. Сізге "/"
, "../"
, нұл байттар немесе басқа белгішелерді файл жолынан аластату көмегі көрсетіледі, сондықтан ол қупия, жасырын немесе куәланды файлдарды жүктеу мүмкін емес.
filter_var
туралы мағлұматfilter_input
туралы мағлұматСанитарлау чужа деректеменің жарамсыз немесе қауіпсіз белгішелерін (немесе оларды аулау) жоюды мақсат етеді.
Мысалы, сіздің HTML бетіне қосу немесе жасырын SQL сұрауына қосу алдын чужа деректемені санитарлау керек. PDO пайдалану кезінде параметрлерді қолданғанда, ол сізді үшін деректемені санитарлады.
Базарласқанда, деректемені HTML бетіне қосу кезінде бірнеше қауіпсіз HTML тегтеріне рұқсат беру қажет болуы мүмкін. Бұл жасырын түсіндіруге ыңғайлы емес және басқа, біраз ортаныпты басқаруды қолданумен, Markdown немесе BBCode ұсыну арқылы өтіп, бұна бірақ көптеген ішкі түзетуді шақырудан бас тартарып көбірек рұқсат береді. Мысалы, HTML Purifier төмендегі мынамын сақталған тегтерді жою үшін қолданылады.
Пайдаланушылардан немесе басқа деу-шаралардан өзіндік деректемені unserialize()
функциясы арқылы ашу жасырындату қауіпті. Бұл жасырындатуды пайдаланушылардың мақсаттарына сәйкес өзгертетін (пайдаланушы тараптын маанымен) объекттерді инстантциялауға болады, өйткені объекттер өзінді қолданылмаса да. Сондықтан сенімсіз деректемелерді жасырындатудан төмендегі таңдаулар бойынша шағымалайсыз.
Пайдаланушыға жасырындатылатын деректемелерді жасау үшін JSON ( json_decode
және json_encode
) функциялары арқылы безопас, стандартты деректеме алмасын пайдалануыңызды сізге мүмкін болады.
Тексеру чужа деректемені құттық тізбегендігін тексереді. Мысалы, тіркеу жасау кезінде электрондық пошта мекенжайын, телефон нөмірін немесе жасын тексеру қажет болуы мүмкін.
Сіздің қолданбалары үшін конфигурация файлдарын жасау кезінде ең жақсы әдістерді ұсыну көмек көрсетеді:
.php
кірісімен атап көріңіз. Бұл, скрипт дайын кіруі де болса, ол тек қалыптас көрсетілмейді.ЕСКЕРТУ: 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 нұсқасы бойынша барлық мүмкін қателерді хабарлау
-1
немесе E_ALL
-1
немесе E_ALL | E_STRICT
-1
немесе E_ALL
Сіздің жасау ортаңызда қателерді жасау үшін php.ini
файлын келесідей түрде конфигурациялаңыз:
display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On
Бұл параметрлермен бірге, продакшн ортасында қателер веб сервердің қателер журналына жазылады, бірақ пайдаланушыға көрсетілмейді. Бұл параметрлер туралы толығырақ мәліметтер үшін PHP нұсқамен таныстырылған мәліметтерді көру үшін: