Как вы защищаете свой сайт от локального включения файлов и SQL-инъекций в PHP? - PullRequest
3 голосов
/ 16 января 2009

Как вы защищаете свой сайт от локального включения файлов и SQL-инъекции (PHP)?

Ответы [ 7 ]

3 голосов
/ 16 января 2009

Есть множество мер, которые необходимо принять. Обязательно очистите все входные данные перед сохранением в базе данных. Я предлагаю использовать mysql_real_escape_string () для всех данных, которые будут сохранены. Ограничьте ввод символов разумной длиной и убедитесь, что вы получаете ТИП данных, ожидаемых для этого поля. Блокировка нескольких попыток отправки определенных областей данных. Просматривать содержимое загруженных файлов в поисках вредоносных шаблонов.

В Wikibooks есть глава по SQL-инъекциям;

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

2 голосов
/ 17 января 2009

Подготовленные операторы для SQL (см. PDO::prepare()) или правильное экранирование (PDO::quote()).

Для локальных путей вам нужно тщательно санировать ввод (жестокий, но безопасный: preg_replace('/[^a-z]/','',$str)) или избегать использования ненадежных данных в путях вообще (используйте идентификаторы, предопределенные строки и т.

1 голос
/ 26 мая 2009

Под "включением локального файла" вы имеете в виду случай, когда вы вызываете include() или что-то подобное на пути, построенном из пользовательского ввода, например, в очень простой файловой CMS или аналогичной? Если так, то ответ в основном такой же, как и для SQL-инъекции - вам нужно санировать ввод.

Очистка путей к файлам требует, чтобы вы установили некоторые основные правила относительно того, откуда файлы могут быть включены, и безжалостно отклонили любой ввод, который не соответствует. Например, если вы просто включаете файлы по имени в подкаталог, вы можете применить следующий базовый алгоритм:

  1. Отклонить имена файлов, которые содержат ., .. или / (или \ под Windows)
  2. Ограничить имена файлов до основных буквенно-цифровых символов
  3. Добавить имя включаемого каталога и добавить соответствующее расширение

В документации PHP содержится дополнительная информация о безопасности файловой системы . Вы также можете настроить open_basedir, чтобы ограничить доступ к файлам внутри определенного дерева каталогов, но это является частью «безопасного режима» PHP, который устарел (и будет удален в PHP 6.0), поскольку на самом деле он не очень сейф.

1 голос
/ 17 января 2009

для защиты от SQL-инъекций, я бы порекомендовал использовать PDO (http://us3.php.net/pdo).. Вам нужны расширения и т. Д., Которые могут блокировать принятие, но это хорошая вещь.

Лично я использую домашний слой доступа к БД, через который проходят все мои запросы, который реализует кучу полезных элементов, включая mysql_real_escape_string()

1 голос
/ 16 января 2009
0 голосов
/ 25 августа 2012

, чтобы избежать SQL-инъекции, зашифруйте свой пароль перед отправкой

0 голосов
/ 17 января 2009

Как уже говорили другие, mysql\_real\_escape\_string() - самый безопасный метод предотвращения внедрения SQL. Я использую пользовательский класс интерфейса БД для всего своего SQL, который передает все необходимые переменные через функцию sanitize(). Вот та функция очистки, которая была удалена из класса на случай, если вы захотите взглянуть на нее.

/**
* Sanitize variable for querying
*
* @param mixed $var         The variable to sanitize
* @param bool $deep         Will inspect the string deeper, converting 'null' to NULL and adding '' around strings
* @param mixed $numstrings  Whether or not to treat numbers as strings (ie add quotes)
* @return $var
*/
function sanitize($var, $deep = true, $numstrings = false) {
    if (is_array($var)) {   //run each array item through this function (by reference)
        foreach ($var as $key=>$val) {
        $var[$key] = sanitize($val, $deep, $numstrings);
        }
    }
    else if (is_null($var) || ( $deep && preg_match('/^null$/i', $var) > 0 ) ) {   //convert null variables to SQL NULL
        $var = "NULL";
    }
    else if (is_bool($var)) {   //convert boolean variables to binary boolean
        $var = ($var) ? 1 : 0;
    }
    else if ($numstrings && is_string($var)) {
        $var = mysql_real_escape_string($var);
        if ($quotes) {
        $var = "'". $var ."'";
        }
    }
    else if (!is_numeric($var)) { //clean strings
        $var = mysql_real_escape_string($var);
        if ($deep) {
        $var = "'". $var ."'";
        }
    }
    return $var;
}

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

Если это всего лишь файл или я не хочу, чтобы мир его видел, я просто добавляю «.ht» к имени файла. Apache по умолчанию запрещает доступ к файлам, начинающимся с '.ht'. Просто убедитесь, что ваши файлы не совпадают с именами конфигурационных файлов Apache (.htaccess, .htpasswd и т. Д.).

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

#this is all you need in the file
Order Allow , Deny
Deny from all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...