Intereting Posts

Как защитить свой сайт от локального включения файлов и внедрения SQL в PHP?

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

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

В Wikibooks есть глава по SQL Injection;

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

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

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

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

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

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

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

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

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

Как и другие, mysql\_real\_escape\_string() является самым безопасным методом предотвращения инъекции SQL. Я использую собственный интерфейс интерфейса DB для всего моего 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 

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