Мой ответ несколько отличается в подходе, но включает в себя многие ответы, представленные здесь. Я бы порекомендовал многоплановый подход:
- .htaccess и ограничения Apache наверняка
defined('_SOMECONSTANT') or die('Hackers! Be gone!');
ОДНАКО Подход defined or die
имеет ряд недостатков. Во-первых, это реальная боль в предположениях, с которыми нужно тестировать и отлаживать. Во-вторых, если вы передумаете, это будет ужасающе, ошеломляюще скучным рефакторингом. "Найти и заменить!" ты говоришь. Да, но насколько вы уверены, что везде написано одно и то же, хммм? Теперь умножьте это на тысячи файлов ... o.O
А потом есть .htaccess. Что произойдет, если ваш код распространяется на сайты, где администратор не так скрупулезен? Если вы полагаетесь только на .htaccess для защиты своих файлов, вам также понадобятся: а) резервная копия, б) ящик для салфеток, чтобы высушить ваши слезы, в) огнетушитель для тушения пламени во всей ненависти от людей используя ваш код.
Так что я знаю, что вопрос требует «самого простого», но я думаю, что это требует более «защитного кодирования».
Я предлагаю следующее:
- Перед любым из ваших сценариев
require('ifyoulieyougonnadie.php');
( не include()
и в качестве замены defined or die
)
В ifyoulieyougonnadie.php
выполните некоторые логические операции - проверьте различные константы, вызовите скрипт, тестируйте локальный хост и т. Д., А затем реализуйте die(), throw new Exception, 403
и т. Д.
Я создаю свой собственный фреймворк с двумя возможными точками входа - основной index.php (фреймворк Joomla) и ajaxrouter.php (мой фреймворк) - поэтому в зависимости от точки входа я проверяю разные вещи. Если запрос на ifyoulieyougonnadie.php
не приходит из одного из этих двух файлов, я знаю, что махинации предпринимаются!
Но что, если я добавлю новую точку входа? Не волнуйтесь. Я просто изменяю ifyoulieyougonnadie.php
, и я отсортирован, плюс нет «найти и заменить». Ура!
Что, если я решил переместить некоторые из моих сценариев для создания другой среды, которая не имеет одинаковых констант defined()
? ... Ура! ^ _ ^
Я обнаружил, что эта стратегия делает разработку намного веселее и намного меньше:
/**
* Hmmm... why is my netbeans debugger only showing a blank white page
* for this script (that is being tested outside the framework)?
* Later... I just don't understand why my code is not working...
* Much later... There are no error messages or anything!
* Why is it not working!?!
* I HATE PHP!!!
*
* Scroll back to the top of my 100s of lines of code...
* U_U
*
* Sorry PHP. I didn't mean what I said. I was just upset.
*/
// defined('_JEXEC') or die();
class perfectlyWorkingCode {}
perfectlyWorkingCode::nowDoingStuffBecauseIRememberedToCommentOutTheDie();