-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsecurity.html
179 lines (171 loc) · 26.8 KB
/
security.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome file</title>
<link rel="stylesheet" href="https://stackedit.io/style.css" />
</head>
<body class="stackedit">
<div class="stackedit__left">
<div class="stackedit__toc">
<ul>
<li><a href="#қауіпсіздік">Қауіпсіздік</a>
<ul>
<li><a href="#веб-қосымша-көзімділігі">Веб-Қосымша Көзімділігі</a></li>
<li><a href="#парольді-хештеу">Парольді Хештеу</a></li>
<li><a href="#деректерді-сүзу">Деректерді сүзу</a></li>
<li><a href="#конфигурация-файлдары">Конфигурация Файлдары</a></li>
<li><a href="#тіркеу-жасаулары">Тіркеу Жасаулары</a></li>
<li><a href="#қате-туралы-хабарлау">Қате Туралы Хабарлау</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="stackedit__right">
<div class="stackedit__html">
<h1 id="қауіпсіздік">Қауіпсіздік</h1>
<p>Мен PHP қауіпсіздігі туралы табылған ең жақсы ресурс - <a href="https://paragonie.com/blog/2017/12/2018-guide-building-secure-php-software">2018 жылы Қауіпсіз PHP программаларын құру туралы нұсқаулар</a> отырып, <a href="https://paragonie.com/">Paragon Initiative</a> ұйымының блогы арқылы танудым.</p>
<h2 id="веб-қосымша-көзімділігі">Веб-Қосымша Көзімділігі</h2>
<p>Әр PHP дайыншысы үшін әбден маңызды, <a href="https://paragonie.com/blog/2015/08/gentle-introduction-application-security">веб-қосымша көзімділік жасау бойынша негіздерді</a> түсіну керек, ол бірнеше кезек тақырыптарға бөлінеді:</p>
<ol>
<li>Код-деректерді бөлу.
<ul>
<li>Деректер код ретінде іске қосылады, SQL Injection, Cross-Site Scripting, Жергі/Удаленная файл қосу, жне.</li>
<li>Код деректер ретінде басып шығарылса, ақпарат сыры (мәні C программаларында, <a href="https://www.techtarget.com/searchsecurity/definition/address-space-layout-randomization-ASLR">ASLR</a> атында) жаттығу жасау мүмкін.</li>
</ul>
</li>
<li>Бағдарлама логикасы.
<ul>
<li>Аутентификациянын же авторизациянын басқаруы жоқ.</li>
<li>Кіру жасау.</li>
</ul>
</li>
<li>Жұмыс орны.
<ul>
<li>PHP нұсқалары.</li>
<li>Үшінші тарату кітапханалар.</li>
<li>Жұмыс жасау жүйесі.</li>
</ul>
</li>
<li>Криптографияның қуаттары.
<ul>
<li><a href="https://paragonie.com/blog/2016/01/on-design-and-implementation-stealth-backdoor-for-web-applications">Зейнеталап сандалған нөмірлер</a>.</li>
<li><a href="https://paragonie.com/blog/2015/05/using-encryption-and-authentication-correctly">Таңдалған-мәтін әтті</a>.</li>
<li><a href="https://blog.ircmaxell.com/2014/11/its-all-about-time.html">Тығыз-канал ақпарат сырылары</a>.</li>
</ul>
</li>
</ol>
<p>Сіздің веб-қосымшаңызды қолданатын адамдар бар, оларды қолдану үшін қажетті қауіпсіздік заңын алу керек. Бәрімізге көмек көрсеткен <a href="https://www.owasp.org/">The Open Web Application Security Project</a> (OWASP) қолданбасы бар жанартылған көзімділік мәселелері мен оларға қарсы қалу тәсілдері туралы жаттығу жасады. Бұл қауіпсіздікке тырысып көрген дайыншылар үшін бұл маңызды болатын бір оқу материал. <a href="https://phpsecurity.readthedocs.io/en/latest/index.html">Қақтығыш Жақтыру: PHP Қауіпсіздігі</a> Padraic Brady көмекші PHP қосымша көзімділігін айтады.</p>
<ul>
<li><a href="https://www.owasp.org/index.php/Guide_Table_of_Contents">OWASP Қауіпсіздік Нұсқауларын оқу</a></li>
</ul>
<h2 id="парольді-хештеу">Парольді Хештеу</h2>
<p>Көптеген уақытта барлық PHP қосымшалары анықталу үшін пайдаланушы логиніне негізделгеніп жасалады. Пайдаланушы аты мен парольдар базада сақталады және кіреу кезінде пайдаланушыларды аутентификациялау үшін қолданылады.</p>
<p>Сіз парольдарды сақтау алдында оларды дұрыс <a href="https://wikipedia.org/wiki/Cryptographic_hash_function"><em>хештеу</em></a> жасау ыңғайлы екенін еске салу керек. Хештеу және шифрлау <a href="https://paragonie.com/blog/2015/08/you-wouldnt-base64-a-password-cryptography-decoded">көбіне бір көлемге ие өзгеше неше емес іс-шара</a> болады, бұл адамдарды қиыстырады.</p>
<p>Хештеу бұл бұрышты, бір жолды бағалау функциясы. Бұл жайылымы теріссіздікке дайын болмайтын сызба өнімдерін тізбеге салады. Бұл оның екіншісін басқа бірліктермен салыстыру үшін пайдалана аласыз, бірауыз ұсынылатын тармақ арқылы пайдаланушы сақтау жолауымен салыстырылса, барлық пайдаланушы есептікті сыйылған болады.</p>
<p>Хештеудің өзгермейтіндігі, шифрлаудың (ескі тілде кілт бар болса) боларды бірдей қарапау көзімен ауыстырылатын болуы үшін пайдаланылуы туралы білімді жасайды. Шифрлау басқа көлемдерде қолдау көрсетеді, бірақ парольді қауіпсіздікті сақтау үшін жарақаттамас жол боларында пайдаланулмайды.</p>
<p>Парольдарды ақысыз <a href="https://wikipedia.org/wiki/Salt_(cryptography)"><em>солтылап</em></a> жасау да өте маңызды. Әр парольды хештеу алдында онымен өзара ретінде көмекші саусақты қосу арқылы жасау үшін, сөздік атакалар мен «көмекші кестелер» (жалпы парольдердің криптографиялық хештарын арттау үшін арттырылған тізбек) пайдалану артық болмайды.</p>
<p>Хештеу және солттау пайдаланушылар көптеген қызметтер үшін тең парольдерді пайдаланады және пароль сапасы болуы мүмкін болатын қажетті жаттығулар екенін ескеруі керек.</p>
<p>Жалпыдан, <a href="https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016">ағымдағы пайдаланушы парақшасында</a> анықталған сөздік құйма әдісімен болмаса, жылжымайтын, жалпы көмекші шифрлау функциясын (мысалы, SHA256) пайдалану керек. 2018 жылы қолдануға алынған құпия сөздік құйма алгоритмдерінің қысқаша тізімі:</p>
<ul>
<li>Argon2 (PHP 7.2 және жаңа жағдайларда қолжетімді)</li>
<li>Scrypt</li>
<li><strong>Bcrypt</strong> (PHP оларды үшін ұсынады; төмендегі көруді көріңіз)</li>
<li>PBKDF2 сағатта HMAC-SHA256 немесе HMAC-SHA512 арқылы</li>
</ul>
<p>Кейіннен, ағымдағы кезде PHP бұны оңай жасайды.</p>
<p><strong><code>password_hash</code> арқылы құпия сөздік құйу</strong></p>
<p>PHP 5.5 кезінде <code>password_hash()</code> кіріс жасалды. Бұл уақытта PHP-ның қолдау көрсететін ең қауіпті алгоритмының BCrypt пайдаланылады. Төмендегі кодта біз стрингді құпия сөздікке айналдырамыз, содан кейін шифрді жаңа стрингге тексереміз. Себебі екі көзге түсінетін айналымдарымызды сақтасақ (‘secret-password’ сөзі мен ‘bad-password’ сөзі) бұл кіру бас тартар.</p>
<pre class=" language-php"><code class="prism language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span>
<span class="token keyword">require</span> <span class="token string">'password.php'</span><span class="token punctuation">;</span>
<span class="token variable">$passwordHash</span> <span class="token operator">=</span> <span class="token function">password_hash</span><span class="token punctuation">(</span><span class="token string">'secret-password'</span><span class="token punctuation">,</span> <span class="token constant">PASSWORD_DEFAULT</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">password_verify</span><span class="token punctuation">(</span><span class="token string">'bad-password'</span><span class="token punctuation">,</span> <span class="token variable">$passwordHash</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// Дұрыс құпия сөз</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token comment">// Қате құпия сөз</span>
<span class="token punctuation">}</span>
</span></code></pre>
<p><code>password_hash()</code> сіздің үшін құпия сөзді солттау үшін қамтамасыз етеді. Солт, хештің бөлігі ретінде, алгоритм және “мартабе” боларымен бірге сақталады. <code>password_verify()</code> бұны келесінен тексеру үшін шолып алмайды, сол себепті сіздің солттарын сақтау үшін өзіңізге көмек көрсететін басқа жинауы болмайды.</p>
<ul>
<li><a href="https://www.php.net/function.password-hash"> <code>password_hash()</code> туралы білу</a></li>
<li>PHP >= 5.3.7 && < 5.5 үшін <a href="https://github.com/ircmaxell/password_compat"><code>password_compat</code></a></li>
<li>Шифрлау туралы ақпаратты <a href="https://wikipedia.org/wiki/Cryptographic_hash_function">жіберіңіз</a></li>
<li>Солт туралы <a href="https://wikipedia.org/wiki/Salt_(cryptography)">жіберіңіз</a></li>
<li>PHP <code>password_hash()</code> RFC-сі <a href="https://wiki.php.net/rfc/password_hash">жіберіңіз</a></li>
</ul>
<h2 id="деректерді-сүзу">Деректерді сүзу</h2>
<p>PHP кодыңызға ендіген чужа деректемен дәмдеу үшін дегеніміз жатпай. Оны қолдануға алу алдын, оны санитарлау және тексеру жасау керек. <code>filter_var()</code> және <code>filter_input()</code> функциялары мәтінді санитарлау және мәтін пішімдерін (мысалы, электрондық пошта мекенжайлары) тексеру үшін пайдаланылады.</p>
<p>Чужа деректеме бар болатынша: <code>$_GET</code> және <code>$_POST</code> форма деректері, <code>$_SERVER</code> суперглобалындағы кейбір мәндер, және HTTP сұрау жасау тізімі арқылы <code>fopen('php://input', 'r')</code>. Есте сақтау, пайдаланушы тарапынан жіберілген форма деректерімен шектелген емес. Жүктелген және жүктелген файлдар, сессия мәндері, куки деректері және қосымша веб қызметтерінен деректер де чужа деректе саналады.</p>
<p>Чужа деректеме сақталып, біріктіріліп, көмегімен жасалса да, ол дайын чужа деректе боларымыз. Әр уақыт кодыңызда деректемен өңдеу, шығару, жаттығу немесе қосу кезінде, деректемені дұрыс сүзгендігіні және оны дегенімізді сұрау etsеңіз.</p>
<p>Мәні бойынша деректеме _сүзілетініп _болуы мүмкін. Мысалы, сүзілген чужа деректеме HTML бет шығаруда келеді, ол HTML және JavaScript кодтарын сайтыңызда орындау үшін пайдалана алады! Бұл Cross-Site Scripting (XSS) деп аталады және өте қауіпті атака болуы мүмкін. XSS-тан болу үшін барлық пайдаланушы тасарымындағы деректемені HTML тегтерін аластату үшін <code>strip_tags()</code> функциясын немесе арнайы мааныны бар караларымен шығармалардың <code>htmlentities()</code> немесе <code>htmlspecialchars()</code> функцияларымен аластату көмегімен санитарлау мүмкін.</p>
<p>Басқа бір мысал, команда жолау үшін параметрлерді жіберу. Бұл жаттығу болуы мүмкін (және әдетте елді болмайды), бірақ тіркемелі <code>escapeshellarg()</code> функциясын пайдалана отырып, орындалатын команданың аргументтерін санитарлау мүмкін.</p>
<p>Соңғы мысал, файл жүктеу үшін чужа деректемені қабылдау. Бұл файлдың атын файл жолы болатында қолдану алады. Сізге <code>"/"</code>, <code>"../"</code>, <a href="https://www.php.net/security.filesystem.nullbytes">нұл байттар</a> немесе басқа белгішелерді файл жолынан аластату көмегі көрсетіледі, сондықтан ол қупия, жасырын немесе куәланды файлдарды жүктеу мүмкін емес.</p>
<ul>
<li><a href="https://www.php.net/book.filter">Деректеме сүзу туралы мағлұмат</a></li>
<li><a href="https://www.php.net/function.filter-var"> <code>filter_var</code> туралы мағлұмат</a></li>
<li><a href="https://www.php.net/function.filter-input"> <code>filter_input</code> туралы мағлұмат</a></li>
<li><a href="https://www.php.net/security.filesystem.nullbytes">Нұл байттарды өңдеу туралы мағлұмат</a></li>
</ul>
<h3 id="санитарлау">Санитарлау</h3>
<p>Санитарлау чужа деректеменің жарамсыз немесе қауіпсіз белгішелерін (немесе оларды аулау) жоюды мақсат етеді.</p>
<p>Мысалы, сіздің HTML бетіне қосу немесе жасырын SQL сұрауына қосу алдын чужа деректемені санитарлау керек. <a href="https://phptherightway.com/#databases">PDO</a> пайдалану кезінде параметрлерді қолданғанда, ол сізді үшін деректемені санитарлады.</p>
<p>Базарласқанда, деректемені HTML бетіне қосу кезінде бірнеше қауіпсіз HTML тегтеріне рұқсат беру қажет болуы мүмкін. Бұл жасырын түсіндіруге ыңғайлы емес және басқа, біраз ортаныпты басқаруды қолданумен, Markdown немесе BBCode ұсыну арқылы өтіп, бұна бірақ көптеген ішкі түзетуді шақырудан бас тартарып көбірек рұқсат береді. Мысалы, <a href="http://htmlpurifier.org/">HTML Purifier</a> төмендегі мынамын сақталған тегтерді жою үшін қолданылады.</p>
<p><a href="https://www.php.net/filter.filters.sanitize">Санитарлау сүзгіштерін көру</a></p>
<h3 id="жасырындату">Жасырындату</h3>
<p>Пайдаланушылардан немесе басқа деу-шаралардан өзіндік деректемені <code>unserialize()</code> функциясы арқылы ашу жасырындату қауіпті. Бұл жасырындатуды пайдаланушылардың мақсаттарына сәйкес өзгертетін (пайдаланушы тараптын маанымен) объекттерді инстантциялауға болады, <strong>өйткені объекттер өзінді қолданылмаса да.</strong> Сондықтан сенімсіз деректемелерді жасырындатудан төмендегі таңдаулар бойынша шағымалайсыз.</p>
<p>Пайдаланушыға жасырындатылатын деректемелерді жасау үшін JSON ( <a href="https://www.php.net/manual/function.json-decode.php"><code>json_decode</code></a> және <a href="https://www.php.net/manual/function.json-encode.php"><code>json_encode</code></a>) функциялары арқылы безопас, стандартты деректеме алмасын пайдалануыңызды сізге мүмкін болады.</p>
<h3 id="тексеру">Тексеру</h3>
<p>Тексеру чужа деректемені құттық тізбегендігін тексереді. Мысалы, тіркеу жасау кезінде электрондық пошта мекенжайын, телефон нөмірін немесе жасын тексеру қажет болуы мүмкін.</p>
<p><a href="https://www.php.net/filter.filters.validate">Тексеру сүзгіштерін көру</a></p>
<h2 id="конфигурация-файлдары">Конфигурация Файлдары</h2>
<p>Сіздің қолданбалары үшін конфигурация файлдарын жасау кезінде ең жақсы әдістерді ұсыну көмек көрсетеді:</p>
<ul>
<li>Сіздің конфигурация ақпаратын жеткіліксіздікпен сақтау және файл жүйесі арқылы дайын кіру мүмкін болмайтын орында сақтау көрсетіледі.</li>
<li>Егер сіз конфигурация файлдарын документтік бетінде сақтау көрсеткен болса, файлдарды <code>.php</code> кірісімен атап көріңіз. Бұл, скрипт дайын кіруі де болса, ол тек қалыптас көрсетілмейді.</li>
<li>Конфигурация файлдарындағы ақпаратты қорғау үшін оларды шифрлау немесе топ/пайдаланушы файл жүйесі рұқсаттары арқылы қорғау керек.</li>
<li>Жасырын маңызды ақпараттарды (мысалы, күпірліктер немесе API токендер) ұсынбайды. Сурс кодтың басқау репозиториясына мәліметтерді қамитудан бас тарту үшін келесідей әдістерді қолдану жауапты</li>
</ul>
<h2 id="тіркеу-жасаулары">Тіркеу Жасаулары</h2>
<p><strong>ЕСКЕРТУ:</strong> PHP 5.4.0-нан бастап <code>register_globals</code> баптауы аластатылды және қолдану мүмкін емес. Бұл тек қалыпты қолданушыларды онымен жаттығу байқаулау үшін көрсетілген. Жаттығу қолдану тобын жақсарту кезінде болатын дайындалу үшін ескертуді қосамыз.</p>
<p>Әрекетке асырайтын кезде <code>register_globals</code> баптауы, көмек көрсетілген кезде, сіздің қолданбаңыздың глобал дайындалуында ( <code>$_POST</code>, <code>$_GET</code> және <code>$_REQUEST</code> бойынша бірнеше түрлі анықтамалар) бірнеше түрлі түрлерді мәндерге қолжетімді көрсетеді. Бұл, сіздің қолданбаңыздың деректемесі келетін жерді таппай алмауда, өмір сүрейдігін жаттайды.</p>
<p>Мысалы: <code>$_GET['foo']</code> <code>$foo</code> арқылы қолжетімді болады, сондықтан анықталған мәндерді мұраттауы болмайды.</p>
<p>Егер сіз PHP < 5.4.0 пайдалана түсесіздерсіз, содан әрекеттейін <code>register_globals</code> баптауын <strong>өшірілген</strong> болуын <strong>анықтап көріңіз.</strong></p>
<h2 id="қате-туралы-хабарлау">Қате Туралы Хабарлау</h2>
<p>Қате жазуы, әдебиеттерді іздеу кезіндегі белгілі қатарды табу үшін пайдалы болуы мүмкін, бірақ бұл сіздің қолданбаңыздың құрылымы туралы мәліметтерді шетелге ашуы мүмкін. Бұл хабарлардың шығарылмасыны талап ететін проблемалардан сіздің қолданбаңызды сақтау үшін, дайындау мен жоба (онлайн) режимінде серверіңізді басқаруыңыз керек.</p>
<h3 id="даму">Даму</h3>
<p>Әр түрлі қателерді көрсету үшін <strong>даму</strong> кезінде <code>php.ini</code> файлында келесі параметрлерді орнатыңыз:</p>
<pre class=" language-ini"><code class="prism language-ini"><span class="token constant">display_errors</span> <span class="token attr-value"><span class="token punctuation">=</span> On</span>
<span class="token constant">display_startup_errors</span> <span class="token attr-value"><span class="token punctuation">=</span> On</span>
<span class="token constant">error_reporting</span> <span class="token attr-value"><span class="token punctuation">=</span> -1</span>
<span class="token constant">log_errors</span> <span class="token attr-value"><span class="token punctuation">=</span> On</span>
</code></pre>
<blockquote>
<p><code>-1</code> мәнін енгізу, болашақтағы PHP нұсқаларында жаңа деңгейлер мен константалар қосылса да, барлық мүмкін қателерді көрсетеді. PHP 5.4.нан бастап <code>E_ALL</code> константы да бұл мәнімен жұмыс істейді. - <a href="https://www.php.net/function.error-reporting">php.net</a></p>
</blockquote>
<p><code>E_STRICT</code> қате деңгей константасы 5.3.0-да келтірілген және <code>E_ALL</code> бөлімі емес, бірақ 5.4.0-да <code>E_ALL</code> бөліміне қосылды. Бұл не болмасақты 5.3 нұсқасында барлық мүмкін қателерді хабарлау үшін сізді <code>E_ALL | E_STRICT</code> жосып тартуыңыз көрінеді.</p>
<p><strong>PHP нұсқасы бойынша барлық мүмкін қателерді хабарлау</strong></p>
<ul>
<li>< 5.3 <code>-1</code> немесе <code>E_ALL</code></li>
<li>5.3 <code>-1</code> немесе <code>E_ALL | E_STRICT</code></li>
<li>'> 5.3 <code>-1</code> немесе <code>E_ALL</code></li>
</ul>
<h3 id="жасау">Жасау</h3>
<p>Сіздің <strong>жасау</strong> ортаңызда қателерді жасау үшін <code>php.ini</code> файлын келесідей түрде конфигурациялаңыз:</p>
<pre class=" language-ini"><code class="prism language-ini"><span class="token constant">display_errors</span> <span class="token attr-value"><span class="token punctuation">=</span> Off</span>
<span class="token constant">display_startup_errors</span> <span class="token attr-value"><span class="token punctuation">=</span> Off</span>
<span class="token constant">error_reporting</span> <span class="token attr-value"><span class="token punctuation">=</span> E_ALL</span>
<span class="token constant">log_errors</span> <span class="token attr-value"><span class="token punctuation">=</span> On</span>
</code></pre>
<p>Бұл параметрлермен бірге, продакшн ортасында қателер веб сервердің қателер журналына жазылады, бірақ пайдаланушыға көрсетілмейді. Бұл параметрлер туралы толығырақ мәліметтер үшін PHP нұсқамен таныстырылған мәліметтерді көру үшін:</p>
<ul>
<li><a href="https://www.php.net/errorfunc.configuration#ini.error-reporting">error_reporting</a></li>
<li><a href="https://www.php.net/errorfunc.configuration#ini.display-errors">display_errors</a></li>
<li><a href="https://www.php.net/errorfunc.configuration#ini.display-startup-errors">display_startup_errors</a></li>
<li><a href="https://www.php.net/errorfunc.configuration#ini.log-errors">log_errors</a></li>
</ul>
</div>
</div>
</body>
</html>