Фев 042023
 
Предлагаем список вопросов, шпаргалка, которые задают разработчикам на технических собеседованиях с PHP7 или PHP8. Конечно, он не является исчерпывающим: cформирован специалистами, проводящими интервью в разных компаниях.

Junior
Общее вопросы:
1. Что такое ссылка?
2. Каковы основные операции с использованием ссылок?
3. Назовите простые типы данных, поддерживаемые в РНР?
4. Что такое инкремент и декремент, в чем разница между префиксным и постфиксным инкрементом и декрементом?
5. Что такое рекурсия?
6. В чем разница между операторами =, == и ===?
7. Какие знаете принципы ООП?
8. Какая система типов используется в PHP? Опишите плюсы и минусы.
9. Чем отличаются ключевые слова: include и require, mysql_connect и mysql_pconnect?
10. Что такое интерфейсы? Используете ли их? Если да – расскажите об этом.
11. Что такое отвлеченный класс и чем он отличается от интерфейса?
12. Может ли абстрактный класс содержать частный метод?
13. Какие модификаторы видимости есть в РНР?
14. Какие магические методы вы знаете и как они применяются?
15. Что такое генераторы и как их использовать?
16. Что делает оператор yield?
17. Что такое traits? Альтернативное решение? Приведите пример.
18. Опишите поведение при использовании traits с одинаковыми именами полей и/или методов?
19. Будут ли доступны частные методы trait в классе?
20. Можно ли компоновать traits в trait?
21. Расскажите об обработке ошибок и исключениях (try catch, finaly и throw).
22. Что такое type hinting, как работает, зачем нужен?
23. Что такое namespace и зачем они?
24. Сравнение значений переменных в РНР и подводных камнях? Приведение типов. Что изменилось в PHP 8 в этом контексте?
25. Как работает session в РНР, где хранится, как инициализируется?
26. Суперглобальные массивы. Какие знаете? Как использовали?
27. Сравните include vs required, include_once vs required_once.
28. Что означает сложность алгоритма?
29. Что такое замыкание в PHP? Приведите пример.
30. Какая разница между замыканием в PHP и JavaScript?
31. Что такое позднее связывание? Расскажите о поведении и применении static.
32. Как переопределить хранение сессий?
33. Расскажите о SPL-библиотеке (Reflection, autoload, структуре данных).
34. Расскажите о принципах SOLID.
35. Расскажите о шаблонах GRASP.
36. Расскажите о Dependency Injection: что такое DI-контейнеры? Какие варианты реализаций?
37. Что вам известно о MVC?
38. Что вам известно о шаблонах GoF?
39. Что вам известно о шаблонах, применяемых в ORM?
40. Напишите/расскажите на PHP пример реализации паттерна Singleton.
41. Что такое Docker? Каков принцип его работы?
42. Что такое LAMP/NAMP?
43. Расскажите о regexp.
44. Расскажите о SSH-протоколе.
45. Что такое PDO?
46. Что нового появилось в PHP 8?
47. Что такое PHP PEAR?
48. Какие версии PHP все еще поддерживаются?
49. В чем разница между GET и POST?
50. Чем отличаются операторы BREAK и CONTINUE?
51. Есть ли разница между одинарными и двойными кавычками?
52. Что такое Cookie и зачем они используются?
53. Что нельзя хранить в Cookie и почему?
54. Какой среде разработки предпочитаете и почему?

Git
55. Какой командой добавить изменения?
56. Какой командой зафиксировать изменения?
57. Какой командой отправить изменения в удаленный репозиторий?

Базы данных
58. Что такое транзакция?
59. Что такое нормализация?
60. Что такое денормализация? Зачем она нужна?
61. Какие типы связей в базе данных?
62. Что означает утверждение о том, что СУБД поддерживает контроль ссылочной целостности связей?
63. Если используемая вами СУБД не поддерживает каскадные удаления для поддержания ссылочной целостности связей, что можно сделать для достижения аналогичного результата?
64. Что такое первичный и внешний ключи?
65. Какие отличия между первичным и уникальным ключами?
66. Какие типы JOIN, и в чем отличия?
67. Что такое курсоры в базах данных?
68. Что такое агрегатные функции SQL? Приведите несколько примеров.
69. Что такое миграции?
70. Расскажите о связях друг к другу, друг ко многим, много ко многим.
71. Назовите и объясните три любых агрегирующих метода.
72. Зачем используют оператор группировки GROUP BY?
73. В чем разница между WHERE и HAVING? Приведите примеры.
74. В чем разница между операторами DISTINCT и GROUP BY?
75. Для чего нужны операторы UNION, INTERSECT, EXCEPT?
76. Опишите разность типов данных DATETIME и TIMESTAMP.
77. Какие вы знаете движители таблиц и чем они отличаются?
78. Какие способы оптимизации производительности баз данных знаете?
79. Что такое партиционирование, репликация и шардинг?
80. Чем отличаются SQL от NoSQL базы данных?
81. Какие бывают NoSQL базы данных?
82. Какие типы данных есть в MySQL?
83. Разница между LEFT JOIN, RIGHT JOIN, INNER JOIN?
84. Разница между JOIN и UNION?
85. Что такое индексы? Как они влияют на время выполнения SELECT, INSERT?
86. Что такое сохраненные процедуры, функции и триггеры в MySQL? Зачем они? Приведите примеры использования.
87. Как организовать сохранение вложенных категорий в MySQL?

Laravel
88. Какие связи и как они реализуются в Laravel?
89. Что такое полиморфные связи, как они работают?
90. Что такое middleware? К чему это? На каком этапе выполняется?

Composer
91. Что такое Composer?
92. Чем отличается require от require-dev?

Практические задачи
93. Спроектируйте базу данных для хранения информации о книгах и их авторах. Напишите запрос для выборки всех авторов и количества написанных книг.
94. Есть матрица 3×3. Посчитайте диагонали, только четные/нечетные числа в диагоналях.
95. Ваше приложение выдает 500 ошибку. Опишите последовательность поиска проблемы.
96. Напишите функцию, которая определяет, является ли слово палиндромом.
97. Какой результат выдаст такой код:
If (-1) print "True" else print "False"
98. Какой результат выдаст такой код:
$a = 3; $b = 2;
echo (int) $a / (int) $b;
99. Какой результат выдаст такой код:
var_dump (array_merge ([2 => 'a'], [3 => 'b']));
100. Есть массив товаров в случайном порядке с указанием изготовителей. Напишите метод его сортировки, чтобы максимальное количество первых товаров соответствовало следующему критерию: каждый следующий товар имел производителя, отличного от предыдущего. 101. Чему будет равно $x после выполнения выражения $x = 1 + «1%» + «$1»? 102. Есть массив Integer, напишите возможные способы, как увеличить каждый элемент на единицу (+1). 103. Схематически воплотить структуру (классы) для задачки: - Создать API для размещения постов в Facebook и Google. - URL для размещения постов Google www.google.com/new-post?text= - URL для размещения постов Google facebook.com/add-post?message= 104. Имеются таблицы 2×3 и 3×2. Select * from a, b. Какова размерность результата?
Order
iduser_idmoney
User
idemail
К таблице есть запросы: - все пользователи из конкретного города; - все удаленные пользователи; - все удаленные пользователи из конкретного города. Какие индексы для таблицы лучше всего поставить?
User
city_iddeleted (bool)
105. Напишите запрос для увеличения значения column1 на +1 для id = 2
idcolumn1
11
22
106. Напишите цикл for так, чтобы аргумент цикла изменялся в геометрической прогрессии. 107. Чему равны выражения:
print (!! "false")
print (!! true)
print ((int) '125g7')
print ((int) 'x52')
108. Каков результат выполнения функции? Как исправить результат?
in_array (1, [0, '0', true])
109. Напишите класс с реализацией всех возможных способов строгой типизации данных с учетом возможностей PHP 7.4. Laravel: 110. Напишите метод для связи «многие». В методе добавьте условие для значения, сохраненного в поле промежуточной таблицы. К примеру, есть студенты и курсы, на которые они записались. Запись студента на курс должна быть подтверждена. Подтверждение хранится в промежуточной таблице как is_approve. Для модели студентов должен быть метод approvedCourses. 111. Напишите запрос с использованием модели Query Builder, который будет отвечать запросу:
Select * from `users` where ( 'age'> 21 and ( 'has_education' == 1 or 'work_experience'> 2))
112. Напишите artisan команду для создания модели и миграции для нее. 113. Напишите artisan-команду для очищения кэша фреймворка. Middle Общее 1. Как передаются переменные (по значению или по ссылке)? 2. Какие процессы происходят, когда пользователь вводит URL в браузере? 3. Что такое вариативная функция или splat-оператор? 4. Что такое OWASP? 5. Какие типы уязвимостей знаете? Как от них защищаться? 6. Что такое идемпотентные методы? Какие HTTP-методы идемпотентны для REST? 7.Чт о такое stateless? 8. SOAP vs REST. В чем разница? 9. Какие методы авторизации используют для построения API? 10. Что может содержать интерфейс? 11. Класс содержит свойство, которое, в свою очередь, является объектом. Что будет содержать это свойство в клонированном объекте: ссылку на тот же дочерний объект или копию дочернего объекта? Что нужно сделать, чтобы это изменить? 12. Что такое Mock? Где используются и зачем? 13. Что такое PSR? 14. Опишите реализацию одного из шаблонов проектирования. 15. Что такое Redis? 16. Как хранятся данные в Redis/Memcached? 17. Расскажите о целесообразности применения Redis/Memcached для кэширования. Какие плюсы и минусы? 18. Назовите отличия между nginx и Apache. 19. Что такое Opcash? Как он работает? 20. Что такое JIT? Как он работает? 21. Зачем нужно ключевое слово final? 22. Что нового в РНР 7/8? 23. Что такое SOLID, DRY, KISS, YAGNI? 24. Назовите паттерны проектирования, с которыми приходилось работать. 25. Что такое простая фабрика? 26. Что такое Service Layer и где его следует использовать? 27. Как устроен Singleton и почему его считают антипатерном? 28. Что такое идемпотентность? 29. Опишите жизненный цикл HTTP-запроса? 30. Что такое куча и стек? 31. Что такое рефлексия? 32. Что такое хэш-функция и где она используется? 33. Как используются очереди в РНР? 34. Как в общих чертах работает OPcache? 35. Что такое GRASP? 36. Что такое TDD? 37. Чем отличаются модульные тесты от интеграционных? 38. Что такое Трейти? Как использовать на практике? 39. Как разрешить конфликты при использовании trait? 40. Как работает автозагрузка классов? 41. В чем разница между стеком и очередью? 42. Расскажите о Unit Tests (required), Functional Tests (optional). Моки и стаб в PHP. 43. Представим ситуацию, в которой нам нужно вызвать частный метод, как это сделать? 44. Опишите разницу между PHP-FPM и PHP на сокете. 45. Как бы вы реализовали загрузку больших отчетов с большим количеством данных (файлы от 1 гигабайта до N гигабайтов). 46. Как бы вы импортировали 50-гигабайтный файл xml в базу данных? 47. Почему после PHP 5 идет сразу 7, куда делось 6? 48. Есть ли разница между self и this в PHP? 49. Что такое PuTTY? 50. У нас есть важный PHP-файл, его нужно запускать каждые 20 секунд, как бы вы это сделали? 51. Как расшифровать 644 в правах на файл в Linux? 52. Что такое Opcode? Git 53. В чем разница между merge и rebase? 54. Какой командой можно произвести ресет изменений, не потеряв их? 55. Что такое stash и для чего он нужен? Базы данных 56. Какая разница между MyISAM и InnoDB? В каких вариантах и что лучше использовать? 57. Как найти и оптимизировать «трудные» запросы? 58. Какие типы индексов? 59. Как сохранять координаты точки на карте в БД? 60. Какие типы индексов бывают у RDBMS? 61. Какое свойство полей БД следует учитывать при выборе типа индекса? 62. Когда следует использовать индексы, какие преимущества и недостатки? 63. Что такое ACID? 64. Что такое план выполнения запроса и как его узнать? 65. В чем разница между типами данных CHAR и VARCHAR в SQL? 66. Какое предназначение транзакций? Расскажите о принципе работы. 67. Назовите 3–4 нормальных формы реляционных БД. 68. Какое предназначение репликации? Какие типы связей и в чем разница между ними? 69. Что такое индексация? Какие типы индексов? Каков смысл их использовать? 70. Что такое полнотекстовый поиск в MySQL? Как он реализуется? 71. Что такое cursor в MySQL-процедурах? 72. Расскажите о RabbitMQ или Gearman. 73. Что знаете о Solr/ElasticSearch? 74. Что такое дедлоки MySQL? 75. Влияет ли порядок JOIN на план выполнения MySQL-запроса? Laravel 76. Как и какие формируются запросы при использовании метода with()? 77. Чем отличаются методы with() и load()? Практические задачи 78. Вам нужно спарсить продукты и их цены из интернет-магазина. С помощью чего это будете делать и какие основные нюансы нужно учесть? 79. Для сайта пользователей необходимо сделать механизм добавления и отображения аватарок. Как бы вы его реализовали? 80. Какой результат выдаст такой код:
class Test
{
public $ value;
}
 
$a = new Test;
$a->value = 1;
 
$b = $ a;
$b->value = 2;
 
echo $a->value;
81. Какие модификаторы доступа допустимы в реализации метода getName:
abstract class Cls
{
protected abstract function getName ();
}
 
class Child extends Cls
{
(Public, protected, private) function getName () {}
}
82. Реализуйте очередь сообщений, используя MySQL для хранения данных. Как избежать ситуации, когда несколько воркеров получат в обработку одинаковое сообщение? 83. Есть матрица с числами 3×3. Как найти числа, не имеющие четных/нечетных соседей? 84. Есть мануал на API от Европейского центрального банка с курсом валют. Нужно найти минимумы-максимумы за 5 лет, а затем то же, но с разбивкой по месяцам. 85. Сохраните свою библиотеку в БД. Следует сохранить названия книг и имена авторов. Предложите структуру таблиц. Выведите отчет «книга – количество соавторов». 86.Реализуйте примитивный роутинг, который обеспечивает работу Рауса по шаблону "/{class_name}/{method_name}/" 87. Напишите архитектуру, основанную на базовой абстракции. Дочерние классы расширяются при помощи интерфейсов. Реализацию одинаковых методов выполните, используя трейты (реализовывать в абстракции). 88. Напишите запрос, в результате выполнения которого выведется значение «id» и «val», если значение столбца column> 5 => val = val1 или val2.
idcolumnval1val2
11‘a’‘d’
26‘b’‘e’
32‘c’‘f’
89. Laravel: напишите расписание, которое будет выполняться каждую пятницу каждый час в 15 минут. 90. Напишите кастомную artisan-команду, которая в консоль будет выводить текущее время. Senior Общее 1. Как вы понимаете REST? 2. Что такое Copy-on-write? 3. Что такое позднее статическое связывание? 4. Что такое CQRS? 5. Что такое cohesion и coupling? 6. Как можно получить значение частного свойства класса в рантайме? 7. Как можно получить значение частного свойства класса в рантайме без использования рефлексии? 8. Следует ли использовать в методах значение по умолчанию null. Если нет, то почему? 9. Стоит ли возвращать null из методов. Если нет, почему и как писать код в таких случаях? 10. Следует ли передавать null как параметр методов. Если нет, то почему и как писать код? 11. Как вы понимаете Special Case/Null Object и где его следует применять? 12. Какой подход следует применять при тестировании кода, имеющего внешние зависимости (например, обращение к API Google)? 13. Что такое DDD? 14. Что такое микросервисная архитектура? 15. Какие способы коммуникации между микросервисами? 16. Расскажите о ReactPHP или Swoole. 17. Что такое фильтр Блума? 18. Что такое gap locks в MySQL? 19. Зачем нужно кэширование? Какую проблему оно решает? 20. Какие виды кэшхранилищ знаете и применяли? Чем они отличаются? 21. Чем характеризуется эффективность кэширования? 22. Приведите самый сложный пример кэширования из практики. 23. Что такое sensitive данные? Как хранятся в базе? Как отображаются в логах? 24. Кратко расскажите об истории PHP. Что появлялось в каждой версии? Куда развивается PHP на ваш взгляд? Что нового в последней версии? 25. Как в PHP очистить память? 26. Что такое антипаттерны? Приведите несколько примеров. 27. Как произвести рефакторинг большого legacy-проекта. Как это аргументировать/продать PM'у, заказчику? 28. Чем отличается Dependency Injection от Service Locator? 29. Расскажите об истоках памяти в PHP. Приведите примеры. Как боролись? 30. Как работает Garbage Collector? Когда есть смысл вызвать? 31. По какому принципу будете выбирать архитектуру своей будущей программы? 32. С какими видами архитектуры приложений сталкивались? 33. Структуры данных. Какие знаете, какие использовали на практике? 34. С какими еще видами API сталкивались? Какие были проблемы? Как решали? 35. Как вы понимаете Exception flow в контексте PHP. 36. Расскажите об автоматических анализаторах кода PHP (Roundcube и т.п.). 37. Расскажите о Performance & профилировании PHP-кода (Xdebug, XHprof и т.д.). 38. Расскажите, как бы вы реализовали систему, когда есть много источников данных, возвращающих в разных форматах данные о пользователе. Есть получатели данных, которые выбирают из каких источников они хотят принимать данные API. 39. Расскажите о проекте, которым по-настоящему гордитесь. Какие технологически необычные решения вы применили для его успешной реализации? 40. Как вы организуете тестирование кода? Когда покрытие тестами нерационально? Были ли у вас такие проекты? Git 41. Как изменить только сообщение последнего комита? 42. git rebase -i HEAD~3 что делает эта команда и какие могут возникнуть проблемы при ее применении? 43. Зачем команда git bundle? 44. Какой командой можно влить комит в текущую ветвь? 45. Как выполнить склеивание комитов? Базы данных 46. Какие структуры данных поддерживает Redis? 47. Что подразумевается под понятием «триггер» в SQL? 48. Какая разница между реляционными и нереляционными СУБД? 49. Какие NoSQL СУБД знаете? 50. Что такое ACID Compliance? 51. Что такое Views? Какие преимущества и недостатки? 52. Что такое уровни изоляции транзакций? 53. Что такое concurrent query? 54. Что такое кластерные индексы? 55. Как построить социальную сеть, которая выдержит нагрузку в 100 тысяч посетителей в онлайне. И сможет предлагать пользователям, например из Нью-Йорка, в друзья людей, живущих в этом городе. Данных много, работать система быстро. Как все хранить? По какому принципу строить запросы?
Апр 092017
 

В PHP CURL POST руководство, Мы будем объяснять как использовать HTTP GET / POST запросы с PHP CURL library.

В данной статье ниже мы приводим примеры работы с данным протоколом

1) Отправить HTTP GET Запрос с CURL

2) Отправить HTTP POST Запрос с CURL

3) Отправить Random User-Agent в Запросе

4) Обработка перенаправление redirects ( HTTP 301, 302 )

5) Ошибки обработки ( Handle Errors ).

Почему мы используем PHP CURL ?

Отправить HTTP GET запрос, простой способ использовать метод file_get_contents().

file_get_contents('http://it.w-develop.com')

Но для использования POST запроса и использовать Обработчик ошибок не так просто в месте с командой file_get_contents().

Отправить HTTP запрос очень просто с PHP CURL. Вам надо выполнить четыре шага для отправки запроса

Шаг 1). Инициализация CURL сессии
Шаг 2). Заполняем options для CURL сессии
curl_setopt( $ch, CURLOPT_URL, "http://it.w-develop.com" );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
//curl_setopt( $ch, CURLOPT_HEADER, true ); // Если вы хотите использовать заголовки

CURLOPT_URL -> URL для загружки
CURLOPT_HEADER -> добавляем header/not
CURLOPT_RETURNTRANSFER -> если true, информация вернется как строка, а не выводит ее.

Полный список опций, смотри в документации PHP Documentation.

Шаг 3). Загружаем CURL сессию.
$output=curl_exec($ch);
Шаг 4). Зарываем сессию
curl_close($ch);
Note: Вы можете проверить, включен CURL enabled/not со следующим кодом.
if( is_callable( 'curl_init' ) ){
   echo "Enabled";
} else {
   echo "Not enabled";
}

1.PHP CURL GET Пример
You can use the below code to send GET request.

function httpGet( $url ) {

    $ch = curl_init();  
 
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
//  curl_setopt( $ch, CURLOPT_HEADER, false ); 
 
    $output=curl_exec( $ch );
 
    curl_close( $ch );

    return $output;

}
 
echo httpGet("http://it.w-develop.com");

2.PHP CURL POST Пример
You can use the below code to submit form using PHP CURL.

function httpPost( $url, $params ) {

   $postData = '';
   //create name value pairs seperated by &
   foreach( $params as $k => $v ) {
      $postData .= $k . '='.$v.'&';
   }
   $postData = rtrim( $postData, '&' );
 
   $ch = curl_init();
 
   curl_setopt( $ch, CURLOPT_URL,$url );
   curl_setopt( $ch, CURLOPT_RETURNTRANSFER,true );
   curl_setopt( $ch, CURLOPT_HEADER, false );
   curl_setopt( $ch, CURLOPT_POST, count($postData ) );
   curl_setopt( $ch, CURLOPT_POSTFIELDS, $postData );
 
   $output = curl_exec( $ch );
 
   curl_close( $ch );

   return $output;
 
}

How to use the function:

$params = array(
   "name" => "Ravishanker Kusuma",
   "age" => "32",
   "location" => "India"
);
 
echo httpPost( "http://it.w-develop.com/examples/php/curl-examples/post.php", $params );

3.SEND RANDOM USER-AGENT IN THE REQUESTS
You can use the below function to get Random User-Agent.

function getRandomUserAgent() {
    $userAgents=array(
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)",
        "Opera/9.20 (Windows NT 6.0; U; en)",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.50",
        "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.02 [en]",
        "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; fr; rv:1.7) Gecko/20040624 Firefox/0.9",
        "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/48 (like Gecko) Safari/48"       
    );
    $random = rand(0,count($userAgents)-1);
 
    return $userAgents[$random];

}

Используется CURLOPT_USERAGENT, Вы можете установить User-Agent string.

curl_setopt( $ch, CURLOPT_USERAGENT, getRandomUserAgent()) ;

4. HANDLE REDIRECTS (HTTP 301,302)
Обрабатывать URL redirects, set CURLOPT_FOLLOWLOCATION to TRUE.Максимальное количество переадресаций можно контролировать, используя CURLOPT_MAXREDIRS.

curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
curl_setopt($ch,CURLOPT_MAXREDIRS,2);//only 2 redirects

5. КАК ОБРАТИТЬ ОШИБКИ CURL
мы можем использовать методы curl_errno(), curl_error(), Чтобы получить последние ошибки для текущего сеанса.
curl_error( $ch ) -> returns error as string
curl_errno( $ch ) -> returns error number

Вы можете использовать приведенный ниже код для обработки ошибок.

function httpGetWithErros( $url ) {

    $ch = curl_init();  
 
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
 
    $output=curl_exec( $ch );
 
    if ( $output === false ) {

        echo "Error Number:" . curl_errno( $ch ) . "
"; echo "Error String:" . curl_error( $ch ); } curl_close($ch); return $output; }

Вывод полного списока ошибок, refer CURL errors

Авг 282013
 

Безопасность в PHP. Проверяем типы переменных.

Известно, что PHP относится к слабо типизированным языкам программирования. Что же это значит? Мы можем проводить различные операции между переменными разного типа, и получать «что-то» на выходе. С одной стороны, это удобно. Строка превращается в целое число, целое число может стать объектом, а объект плавно перейти в массив. Но любой программист при создании сайтов на языке php рано или поздно сталкивается с тем, что во многих случаях типы переменных следует приводить (или, как минимум, проверять перед началом использования).

Примечание: такое строгое отношение к переменным связано с тем, что большинство скриптов на php подвержено нездоровому вниманию злоумышленников с целью подстановки параметров различного типа в строке запроса сайта. Это может привести от генерации ошибки с раскрытием пути, по которому находится файл, вплоть до обхода некоторых ограничений. Например: повышения прав пользователя в ранних версиях WordPress путём передачи имени пользователя как массива, а не строки, в скрипт аутентификации в admin панели, или же подстановки в строку запроса вместо целых чисел (например, id новости) – специально сформированных запросов sql с целью несанкционированного доступа, создание на сайте так называемых sql инъекций.

Так что, по возможности, проверяйте типы переменных перед их использованием или явно приводите их во время программирования на PHP.

Приведём функции, которые будут нам полезны с целью контроля безопасности входных данных:

(string) trim($str) – Принимаемые параметры: $var – строка для удаления пробельных символов и символов разрыва строки. Обрезает символы конца строки и пробельные символы вначале и конце строки, возвращает переменную строкового типа.
(bool) is_string($var) — Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var строкой? Возвращает: true: если является, false: если не является.
(bool) is_numeric($var) – Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var набором цифр ? Возвращает: true: если является, false: если не является.
(bool) is_float($var) — Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var вещественным числом? Возвращает: true: если является, false: если не является.
(bool) is_array($var) — Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var массивом? Возвращает: true: если является, false: если не является.
(bool) is_int($var) — Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var целым числом? Возвращает: true: если является, false: если не является.
(bool) isset($var) – Принимаемые параметры: $var – переменная для проверки. Проверяет, существует ли переменная $var (любой тип данных), если существует, возвращает true, иначе возвращает false.
(bool) is_resource($var) – Принимаемые параметры: $var – переменная для проверки. Является ли переменная $var ресурсом? Возвращает: true: если является, false: если не является.
(bool) empty($var) — Принимаемые параметры: $var – переменная для проверки. Проверяет, пуста ли существующая переменная или нет, возвращаемые значения: true для значений («», 0, 0.0, «0», NULL,FALSE,array()), false в остальных случаях
Пример использования при программировании в PHP скриптах:

Передаем в форму через пост запрос массив данных $user, полученный при регистрации пользователя:

<?php
        $user               = $_POST["user"];
        $sizeof             = sizeof($user);
        $username           = "";
        $password           = "";
        $user_id            = 0;
if(is_array($user) && $sizeof && isset($user["username"]) && isset($user["password"];)){
        $username           = trim($user["username"]);
        $password           = trim($user["password"]);
        $password           = is_int($user["user_id"]) ? $user["user_id"]: 0;
}
?>

Еще один пример использования в PHP скриптах:

Зададим вопрос к базе данных:

<?php
        $query              = "SELECT `news_text` FROM `news` WHERE `news_id`=5";
        $p                  = mysql_query($query);
        if($p && is_resource($p)){
            list($news_text)= mysql_fetch_row($p);
        }
?>

Замечание: дело в том, что очень полезно проверять, является ли параметр ресурсом, перед передачей функции, заведомо требующей параметр типа ресурс. Например, в случае sql запросов такой подход может подсказать об ошибке, которая произошла в запросе, или попросту о том, что сервер базы данных (или текущее подсоединение) занято.

Авг 282013
 

Безопасность в PHP. Явное приведение типов.

Операторы прямого приведения данных.

Совет: там, где от этого зависит безопасность, или результат может быть неоднозначным, приводите явно тип данных, проверяйте входящие переменные со стороны клиента на существование, пусты ли они, и к какому типу относятся. Аккуратность написания скриптов избавит от чрезмерной отладки в дальнейшем и сделает Ваш сайт менее чувствительным к действиям недоброжелателей,и более стабильным в работе.

Приведём несколько операндов, которые позволяют сделать это легко и без особых усилий при программировании на языке PHP, а так же поговорим о функциях приведения типов.

Примечание автора: операторы не изменяют тип переменной, но делает попытку приведения переменной и возвращает значение соответствующего типа.

$var = (int)$some_var, (integer)$some_var – явное приведение переменной $some_var к целочисленному типу
$var = (float)$some_var, (real)$some_var, (double)$some_var – явное приведение переменной $some_var к вещественному типу
$var = (array)$some_var – явное приведение переменной $some_var к массиву
$var = (string)$some_var – явное приведение переменной $some_var к массиву
$var = (bool)$some_var, (boolean)$some_var – явное приведение переменной $some_var логическому значению (true,false)
$var = (object)$some_var – явное приведение переменной $some_var к объекту
Новшества PHP 5:

(unset)$some_var – присвоение типа NULL, уничтожение переменной, освобождение памяти.
Новшества PHP 5.2.1:

(binary) $some_var – приведение переменной к бинарному представлению.
Примеры использования:

Рассмотрим передачу id статьи через массив GET news.php?id=23

Вариант подготовки параметра для безопасной передачи в запрос к базе данных:

?
1
$news_id = (int)$_GET[«id»];
Еще одной интересной функцией является abs, которую советую применять при фильтрации входных данных для заведомо неотрицательных величин, например уникального идентификатора статьи, который является по умолчанию числом уникальным, положительным, с auto increment:

abs($var) – Принимаемые параметры: $var – переменная целого (или вещественного) типа. Возвращает абсолютное по модулю число: для всех отрицательных величин возвращается положительное, для всех положительных возвращается просто значение переменной

Рассмотрим предыдущий пример в новом ракурсе:

Так как integer может быть как положительным, так и отрицательным целым числом, перепишем предыдущий пример с использованием функции abs:

Вариант подготовки параметра для безопасной передачи в запрос к базе данных:

?
1
$news_id = abs((int)$_GET[«id»]);
Функции явного приведения данных.

(int) intval($var,[$base = 10]) — Принимаемые параметры: $var – переменная для приведения типов. Приводит переменную к целочисленному типу. Возвращает переменную, приведенную к целочисленному типу, в случае с массивом 0 если массив пуст, 1 – если есть элементы, в случае со строкой: если удаётся преобразовать к целому числу – то целое число, или 0 в обратном случае.

$base = основание, десятичная система исчисления по умолчанию.

(float) floatval($var) — Принимаемые параметры: $var – переменная для приведения типов. Приводит переменную к вещественному типу. Возвращает переменную, приведенную к вещественному типу, в случае неудачи возвращает 0.
(bool) settype(&$var, string $type ) — Принимаемые параметры: $var – переменная для приведения типов, $type – к какому типу привести переменную:

«boolean»,»bool» – приведение типа переменной к логическому значению (true, false),
«integer»,»int» – приведение типа переменной к целому значению,
«float»,»double» – приведение типа переменной к вещественному значению,
«string» – приведение типа переменной к строковому значению,
«array» – приведение к массиву,
«object» – приведение типа переменной к объекту,
«null» – приведение типа переменной к типу NULL (освобождение занимаемой памяти).
Производит прямое приведение переменной к значению указанного типа. В случае удачи возвращает true, иначе – false.

Общирный пример практического использования вышеописанных функций при программировании на языке PHP:

Приведём пример безопасного запроса к базе данных с получением id новости из строки запроса:

<?php
$id             = isset($_GET["id"]) ? abs(intval($_GET["id"])) : 0;
If(!empty($id)){
    $q          = "SELECT `news_text` FROM `news` WHERE `news_id`=".$id;
    $p          = mysql_query($q);
    if($p && is_resource($p)){
    list($text) = mysql_fetch_row($p);
    echo $text;
}
}
?>
Авг 282013
 

Выделенный сервер представляет собой хостинг- услугу, заказывая которую клиент получает в пользование весь физический сервер, настроенный квалифицированными специалистами.

Аренда сервера является лучшей альтернативой для тех, кому необходим большое количество ресурсов и вычислительных мощностей для проекта (проектов), однако не желает покупать дорогостоящее оборудование, нанимать или обучать специализированный персонал и тратится на другие сопутствующие расходы.

При заказе данной услуги, клиенту предоставляется полный контроль над выделенным сервером, что дает возможность вносить любые изменения в его настройки, инсталлировать любое программное обеспечение и, даже, операционную систему. Выделенный сервер является лучшим решением для проектов, которым не достаточно ресурсов виртуального хостинга или VPS/VDS.

К преимуществам данной услуги можно отнести то, что клиенту для работы предоставляется полнофункциональный компьютер со всеми правами администратора. Заказчик может осуществлять полный контроль над всеми процессами, файлами и пользователями в системе. У вас будет выделенный IP-адрес (некоторые хостеры предлагают насколько выделенных IP).

Заказав выделенный сервер клиент получает гарантированную безопасность и изолированность. В стоимость, также, входит техническая поддержка постоянный мониторинг, что обеспечивает круглосуточную, бесперебойную работу компьютера. Данный вид хостинга также предполагает резервное копирование данных сервера, так что при необходимости их можно восстановить.

Выбрав аренду сервера в качестве хостинг площадки вы получаете возможность размещать неограниченное количество сайтов и доменов. При заказе этой услуги вы получаете отдельный компьютер выбранной конфигурации, а соответственно вы становитесь обладателем собственным дисковым пространством, оперативной памятью, процессами, отдельным подключением к сети и другими ресурсами.
Недостатком выделенного сервера является его высокая стоимость. Поэтому для вашего проекта не требуются высокие вычислительные мощности, то лучше обратить свое внимание на более дешевые альтернативы, например виртуальный сервер VPS/VDS. Также, аренда сервера требует наличие опыта администрирования. Многие хостинг-провайдеры предлагаю свои услуги по администрированию, однако это будет стоить дополнительных денег, но все же дешевле, чем нанимать штатного сотрудника.