Статьи

Еще 7 ошибок, обычно совершаемых разработчиками PHP

Еще в конце июня TopTal, внештатная торговая площадка, опубликовала статью о 10 самых распространенных ошибках, которые делают PHP-программисты . Список не был исчерпывающим, но он был хорошо написан и указал на некоторые очень интересные подводные камни, о которых следует опасаться — даже если бы я лично не назвал ошибки как очень распространенные.

Я призываю вас внимательно прочитать его — он содержит действительно ценную информацию, о которой вам следует знать, особенно первые восемь пунктов. Пару дней назад Анна Филина пополнила список семью новыми записями. Хотя она менее конкретна и распространена, ее очки все же имеют вес и должны учитываться при развитии.

Еще 7 ошибок часто делают PHP-разработчики

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

1. Использование расширения mysql

Эта новость довольно старая, но количество разработчиков, не замечающих этого факта, вызывает беспокойство. При использовании баз данных SQL, в частности MySQL, слишком много разработчиков по-прежнему выбирают расширение mysql. Расширение mysql официально устарело . Это небезопасно, ненадежно, не поддерживает SSL и отсутствует некоторые современные функции MySQL. Он также генерирует уведомления об устаревании, которые не нарушают ваше приложение, они просто появляются в верхней части вашего приложения. Весело, что это означает, что также возможно просто Google для всех различных сайтов, которые используют эту небезопасную настройку, просто ища это . Мир вреда, которому подвергаются эти приложения из-за этого беспорядка, ошеломляет.

Вместо использования mysql, выберите одну из альтернатив: MySQLi или PDO. Например, использовать MySQLi вместо этого почти так же просто, как добавить букву «i» в конце вызовов API:

$c = mysql_connect ( "host" ,   "user" ,   "pass" ); mysql_select_db ( "database" ); $result = mysql_query ( "SELECT * FROM posts LIMIT 1" ); $row = mysql_fetch_assoc ( $result ); 

против

 $mysqli =   new  mysqli ( "host" ,   "user" ,   "pass" ,   "database" ); $result =  $mysqli -> query ( "SELECT * FROM posts LIMIT 1" ); $row =  $result -> fetch_assoc (); 

Это все, что нужно, чтобы сделать установку неизмеримо более безопасной.

Вы должны выбрать PDO, хотя. Подробнее об этом в пункте 2.

2. Не использовать PDO

Не поймите меня неправильно, mysqli (буквально) на несколько поколений впереди древнего расширения mysql. Это обновлено, безопасно, надежно и быстро. Тем не менее, это специфично для mysql. Вместо этого использование PDO позволит вам использовать удивительно практичный объектно-ориентированный синтаксис и подготовит вас к танго с другими базами данных SQL, такими как PostgreSQL, MS SQL и другими. Более того, PDO позволит вам использовать именованные параметры , такую ​​полезную функцию, что мало кто может представить, что может пойти на что-то еще после того, как правильно им воспользуется. И последнее, но не менее важное: вот что вы можете вставить извлеченные данные непосредственно в новый объект, что позволяет сэкономить время в больших проектах.

3. Не переписывать URL

Еще одна обычно игнорируемая и легко решаемая проблема. Такие URL, как myapp.com/index.php?p=34&g=24 , просто недопустимы в myapp.com/index.php?p=34&g=24 время. Из-за того, что было невероятно сложно написать хорошее руководство по перезаписи URL, которое охватывало бы каждый сервер и инфраструктуру, почти в каждой среде есть руководство по настройке чистых URL ( Laravel , Phalcon , Symfony , Zend ) и любые, которые не Это просто не стоит использовать — они, очевидно, не заботятся о современных методах.

4. Подавление ошибок

Я писал об этом в предыдущей статье, но стоит упомянуть еще раз. Каждый раз, когда вы обнаружите, что используете оператор @, пересмотрите и подойдите к проблеме под другим углом. Поверьте мне на слово, когда я скажу, что 20 строк стандартного кода cURL вокруг функциональности приложения лучше, чем одна строка с оператором @ перед ним.

Благодаря личным экспериментам я обнаружил, что хороший подход — это тот, который я отстаиваю в оригинальном посте — превращать все ваши уведомления в фатальные ошибки. Убедиться, что в журналы ошибок ничего не записывается, потому что буквально ничего не регистрируется , лучше, чем притворяться, что какашки не бьют по вентилятору, держа @ перед вашими глазами.

Недавно мы рассмотрели некоторые дополнения Heroku для готовых приложений PHP, и одним из них был превосходный Papertrail — дополнение, которое позволяет перенести все ошибки вашего приложения на их серверную часть для упрощения поиска, группировки и устранения в дальнейшем; так что даже если некоторые ошибки действительно случаются, лучше позволить им регистрироваться и избавляться от них, исправляя ваш код, чем заглушать их и играть глупо перед вашими пользователями.

5. Назначение в условиях

Даже опытные разработчики иногда просто щелкают пальцем и пишут if ($condition = 'value') { вместо if ($condition == 'value') { . Наши руки соскользнут, наши клавиатуры не будут регистрировать нажатие клавиш, в итоге мы вставим из другой части кода, где фактически произошло присвоение — это происходит, и мы обычно узнаем только при запуске приложения.

Есть несколько способов полностью избежать этого:

  1. Используйте достойную IDE. Любая хорошая IDE (например, PhpStorm) предупредит вас о проблемах «назначение в состоянии», когда обнаружит их.
  2. Используйте «Условия Йоды» . Вы увидите это во многих популярных проектах, даже в больших фреймворках. Инвертируя сравнение (как, например, if ('value' = $condition) { ), более слабые IDE также заметят проблему. Некоторые считают, что синтаксис Yoda раздражает и бессмысленен, спасательный круг, где их не должно быть («будь осторожнее с твоим кодом, черт побери»), но каждому свое — если кому-то это поможет, я все за него. Если бы мы все были элитарными, WordPress и Zend Framework не существовали бы.
  3. Просто помня об этом, вы разовьете глазной рефлекс, чтобы проверять его каждый раз, когда пишете. Все, что нужно, это практика, но это случается даже с лучшими разработчиками, и здесь 1. и 2. пригодятся.

6. Быть слишком прозрачным

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

В этом твите информация о серьезной проблеме внедрения кода передается в общественное достояние. Это замечательно, если вы на работе и можете сразу же перейти на новую версию без проблем с devops и не подвести команду к началу, но для большинства людей и компаний, использующих Symfony, это не так. Несмотря на то, что Symfony может быть обновлен через Composer (как Райан упомянул в комментариях ниже), обычно требуется много времени для получения одобрения в больших командах с многоуровневой средой. Все веб-сайты, использующие этот подход к переводчикам, которые объявлены пользователями Symfony, были (или?) Были подвержены этой уязвимости до исправления.

Использование Symfony в приведенном выше примере было просто примером. Подобные ситуации возникали с бесчисленным количеством другого программного обеспечения на протяжении многих лет. Когда я все еще использовал Zend Framework в коммерческих целях, у нас тоже было такое, и из-за этого произошла атака. WordPress имеет свою долю брешей в безопасности, и мы знаем, какой процент сайтов он использует. Такие вещи случаются, и иногда открытый исходный код и прозрачность — не лучший подход при работе с приложениями, которые несут большую часть дохода компании.

7. Не удаляем настройки разработки

И последнее, но не менее важное, следует упомянуть удаление конфигурации разработки. Совсем недавно (и это честное совпадение, я снова упоминаю о Symfony), Cnet подвергся атаке из-за того, что не удалил свою конфигурацию разработки.

Cnet, один из крупнейших мировых технологических новостных сайтов, основан на Symfony. Как вы, возможно, знаете, Symfony имеет две точки входа в ваше приложение: app.php и app_dev.php . Указав свой браузер на один, вы получите производственную среду. Указав на тот, который _dev суффикс _dev , вы, очевидно, получите версию для разработки, которая включает в себя отладчик, конфиденциальные данные и многое другое. Хорошо это или плохо — предмет многих дискуссий (опять же, спасибо Райану за указание на это), но нельзя отрицать, что это приводит некоторых неуклюжих разработчиков к таким ошибкам, как те, от которых пострадала Cnet. Более того, любые другие URL-адреса, доступ к которым при использовании app_dev будут перенаправлены на другие URL-адреса app_dev . Другими словами, это не просто страница индекса, которая запускается в режиме разработки, это весь сайт — в случае Cnet, это большой доступ.

Если вы следите за обсуждением в Твиттере, это становится невероятно грустным очень быстро — и что еще более печально, это то, что этого можно было избежать в секунду:

  1. Разработчики могли удалить app_dev.php с рабочих серверов
  2. Разработчики могли бы иметь IP-адреса из белого списка, которым разрешен доступ к app_dev.php , как это работает по умолчанию, если вы не ослабите эти ограничения.

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

Вывод

Как вы относитесь к этому списку? Это охватывает общие аспекты или это слишком эзотерично? У вас есть более распространенные подводные камни, о которых три сообщения в целом не упоминались? Дайте мне знать в комментариях ниже, и мы обновим пост, если ваш совет обоснован!