Следующим по списку стоит взлом через уязвимости сайта. К примеру, SQL инъекция. От неё можно защититься только грамотной обработкой входящих данных. Которые включают в себя не только GET и POST, но и COOKIE (и др.способы хранения, которые используются сайтом).
Помимо этого существует целый класс атак через загрузку файла на сервер. Но в отличии от предыдущих способов, от него есть довольно простая защита. Её можно сделать через файл .htaccess, о котором пойдёт речь далее.
Отключение PHP в папке через .htaccess
Суть атаки через загружаемый файл заключается в следующем. Все исполняемые файлы на хостинге имеют расширение .PHP. Если запросить такой файл, то скрипт выполнится. Следовательно, загрузив произвольный скрипт на сайт и обратившись к нему, можно выполнить любой код.Загрузка PHP файлов на сервер происходит через формы, где есть возможность добавить файл. К примеру, в разделе управления личными данными пользователей можно загрузить аватар пользователя. Но если обычный пользователь загружает картинки с расширением JPEG, PNG, GIF и т.п., то атакующий будет пытаться загрузить файл .PHP, который содержим вредоносный код. Этот код может делать всё, что угодно. К примеру, полностью удалять сайт.
Первый уровень безопасности должен заключаться в проверке расширения загружаемых файлов. На PHP он может быть реализован таким кодом:
$allowedExts = array("jpg", "jpeg");
$extension = end(explode(".", $_FILES["file"]["name"]));
if(!in_array(strtolower($extension), $allowedExts)) {
// ошибка загрузки файла - неправильное расширение
die("File type error");
}else{
// сохранение файла
}
Этот код будет пропускать на сохранение только файлы, у которых в конце имени файла стоит или "jpg", "jpeg". Но иногда бывает, что загрузка файлов реализована внутри CMS, и отсутствует возможность изменить код загрузчика (потому что при следующем обновлении CMS он затрётся). При этом хочется обезопасить сайт. Тогда выход один - запретить исполнение файлов в папке, куда загружаются файлы. Делается это путём добавления в неё файла .htaccess, содержащего специальные директивы, отключающие обработку PHP скриптов в папке. Чтобы скрипты при их вызове открывались как текстовые файлы, а не исполнялись.
Приведём пример содержания файла .htaccess. Этот файл находится в папке "upload", куда загружаются файлы от пользователей. Сайт работает на виртуальном хостинге с PHP версии 7:
<IfModule mod_mime.c>
<Files ~ \.(php|php3|php4|php5|php6|php7|phtml|pl|asp|aspx|cgi|dll|exe|shtm|shtml|fcg|fcgi|fpl|asmx|pht|py|psp|rb|var|phar)>
SetHandler text/plain
ForceType text/plain
</Files>
</IfModule>
<IfModule mod_php7.c>
php_flag engine off
</IfModule>
Первая часть с "mod_mime.c" заставляет Apache открывать файлы как обычные текстовые. Вторая часть с "mod_php7.c" блокирует работу PHP в папке. Получается двойная защита. А лишняя ли она или нет - это решать владельцу сайта.