Вчимося писати скрипти правильно

Багато починаючі веб-програмісти знайомляться з мовою за коштами книг. Книга безперечно дуже важлива і потрібна, але в ній наводяться приклади (для початківців), які за своєю суттю не є правильними з точки зору стійкості і переносимості скрипта. Під стійкістю розуміється можливість виникнення помилок різного виду, під переносимістю - те ж саме, але при перенесенні скрипта з домашньої локальної машини на сервер хостнге-провайдера.







Нижче я б хотів відразу показати початківцям веб-розробникам як треба вчитися відразу писати скрипти, щоб потім не відчувати зайвих проблем і не «ловити» незрозуміло звідки вилазять помилки.

Відразу скажу, що я сам з цим зіткнувся, так що все це пройшло через мої муки.

Розглядати я буду наступні моменти:

1. Налаштування PHP для локальної машини і на сервері.
2. Де заритий «@»?
3. register_globals = Off і ніяк інакше.
4. Основні аспекти синтаксису. Літерал ор нот літерал.

1. Налаштування PHP для локальної машини і на сервері.

Чому я саме з цієї глави починаю. Справа в тому, що багато на локальній машині відразу відключають показ усіх помилок. Це не правильно. Замість того щоб тупо дивитися в монітор і шукати, де, як виявиться, не вистачає крапки з комою, можна помилково, котра видається PHP відразу зрозуміти, в чому справа.

Але спочатку хочу зробити невеликий ліричний відступ по частині того, як налаштовувати PHP, як Apache modul або fast-CGI.
Найоптимальніший варіант - налаштовувати, як модуль веб-сервера. Для цього в файлі конфігурації httpd.conf веб-сервера Apache пишемо такі рядки:

LoadModule php4_module D: /bin/php/sapi/php4apache2.dll
AddType application / x-httpd-php .php .phtml .php4 .php


Відмінність від FastCGI - такі. Перше. При FastCGI php.ini буде довантажувати в пам'ять веб-сервера приблизно кожен другий раз при запуску скрипта, при установці, як модуля Apache завантаження конфігурації PHP буде здійснюватися тільки при завантаженні або рестарт веб-севрера, само собою швидкодія і навантаження на сервер буде менше. Крім цього, при установці як fastCGI недоступні певні функції. Початківцю програмісту вони не знадобляться. але при розробці великого Інтернет-програми ви можете зіткнутися з проблемами. А проблеми краще запобігати.

Тепер перейдемо до конфігурації самого PHP. У файлі конфігурації php.ini в обов'язковому порядку встановлюємо такі директиви з нижче написаними значеннями:

error_reporting = E_ALL
display_errors = On
display_startup_errors = On


Писати чи не писати помилки в лог файли - це вже на ваш розсуд.
На сервері в хостіга-компанії, обов'язково, вимикайте всі ці директиви в цілях безпеки, щоб потенційний зловмисник не міг дізнатися шляху, де лежать ваші скрипти. Але по хорошому, коли ви вже публікуєте свій скрипт в глобальній мережі, він не повинен видавати ніяких помилок.
Крім цього


Для того, щоб ніхто не зміг використовувати


За замовчуванням директива max_execution_time має значення 30, але для швидкості роботи, краще ставити менше. Якщо у вас щось «зациклилося», то 10 секунд цілком достатньо, щоб зрозуміти це.

register_globals = Off






register_argc_argv = Off


У 3 розділі я розповім більш докладно про це.


Дуже часто початківці веб-розробники не розуміють різниці між 'і ", тому вимикаємо директиву. У 4 розділі даний момент буде показаний на прикладі.

2. Де заритий «@»?

Це, мабуть, найголовніша помилка початківців програмістів - використання "@". Цей символ, перед яким-небудь оператором пригнічує висновок помилки і її запис в лог. Він не дозволяє на стадії налагодження відстежити помилку, і ви судорожно намагаєтеся зрозуміти, в чому справа.

Яскравий приклад. Припустимо, ми поставили символ "@" перед рядком $ f = fopen ( "fle.txt". "W +") ;. Якщо взяти тільки найпоширеніші помилки, які можуть виникнути при подальшій fwrite наприклад, то це: а) немає прав доступу до файлу, б) файл не існує, в) fopen не може бути викликана в безпечному режимі. Уявляєте, скільки варіантів помилок може бути? Сила-силенна. І як ви збираєтеся дізнаватися, яка помилка виникла саме у вас, адже ви придушили їх висновок символом «@».

Тому строго на строго забороняємо вам використовувати @.

Ви запитаєте, а як же тоді зробити, щоб не виводилася помилка?
Щоб не виводилася помилка її треба або запобігати, як у випадку з файлами, тобто а) перевіряти файл на існування, б) перевіряти, а можна (є права) в нього щось записати is_writeable () ;.

В інших випадках, наприклад при використанні mysql_connect (); треба перевіряти значення, яке поверне функція. Як правило, по ньому можна визначити, є помилка чи ні. Зазвичай при помилці повертається значення FALSE, NULL або порожній рядок.

Це дозволить вам, видавати користувачеві не порожню сторінку, якщо, наприклад, він спробував звернутися до інформації (? N = 14), а інформація зберігається у вас в файлах, і файлу 14 не існує, а текст повідомлення: «Інформація не знайдена» .

«Ловля» помилок є також дуже важливим аспектом безпеки при роботі скрипта.

3. register_globals = Off і ніяк інакше.

Якщо в перших двох розділах я робив акцент на тих моментах, з якими програміст зіткнеться вже відразу, то в цьому розділі я розповім про такий момент, який проявиться вже пізніше. часто з ним все стикаються при перенесенні скрипта (вже готового) на сервер хостинг провайдера. Особисто я довго звикав до register_globals = Off, тому товариші, початківці програмісти, одразу ставте цю директиву виключеною. Крім цього, даний момент ДУЖЕ ВАЖЛИВИЙ в забезпеченні безпеки скрипта.


if (isset ($ form))
if (isset ($ family) isset ($ form))
print "Ваше прізвище:". $ Family. "
";
print "Ви були тут:". $ Form. "
";
>
else
// Показуємо нашу форму.
>
>

Тобто фактично все зводиться до того, що є можливість підміни всіх змінних. По суті це суттєвий мінус в безпеці, оскільки дуже велика ймовірність того, що зловмисник зможе подивитися будь-які важливі файли на сервері.

Тепер про те, як це реалізувати під register_globals = Off

У PHP існують кілька глобальних масивів. $ _GET, $ _POST, $ _COOKIE, $ _REQUEST (об'єднання перших трьох, не рекомендується в цілях безпеки), $ _FILES (для аплода файлів), $ _SESSIONS (сесії), $ _SERVER (серверні змінні), $ _ENV (змінні середовища) , $ GLOBALS (об'єднує всі).

Що це означає. Нижче я просто перепишу скрипт, дані мною раніше для register_globals = Off ..


if (isset ($ _GET [ 'form']) isset ($ _COOKIE [ 'family']) isset ($ _COOKIE [ 'form']))
print "Ваше прізвище:". $ _COOKIE [ 'family']. "
";
print "Ви були тут:". $ _COOKIE [ 'form']. "
";
>
else
// Показуємо нашу форму.
>

У цьому ж розділі хочу розглянути наступний маленький приклад. Знову ж спочатку розглянемо приклад з включеним register_globals.

4. Основні аспекти синтаксису. Літерал ор але літерал.

1. Знову ж багато початківці програмісти не розуміють різниці між записом: $ _POST [ 'pole'] і $ _POST [pole]. Перший варіант - синтаксично вірний, а другий ні. PHP буде намагатися знайти не елемент pole, а елемент з ім'ям, яке зберігається в константі pole, якої у вас - ні.

Лапками обрамляются літерали, тобто рядки. Якщо у вас масив - індексний, то в ньому не треба писати $ _POST [ '1'], а треба $ _POST [1].

Різниці між "і" немає.

2. Висновок змінних часто здійснюють таким чином:

print "My name is $ name. I $ age years old. ";


Така рядок «розбирається» інтерпретатором набагато повинен, ніж

print "My name is". $ Name. ". I". $ Age. "Years old." ;
// або
print "My name is. I years old." ;
?>


Перший варіант найкращий, та й з точки зору редагування програмного коду - легше зрозуміти, де у тебе змінна, а де в тебе текст.







Схожі статті