Я читал о различных безопасных способах подключения к базам данных и хотел пропустить эту идею, прежде чем связать себя узами с моими реальными базами данных, если у нее нет преимуществ для безопасности или упрощения переключения между базами данных.
Я думал, что это обеспечит уничтожение переменных db_ * после использования функции и установления соединения с соответствующей базой данных:
<?php
function dbconn($db_hostname='localhost',
$db_username='',
$db_password='',
$db_database='database1'
$db_object='connection') {
if($db_username=='' && $db_password=='') {
switch ($db_database) {
case 'database1':
$db_username='user1';
$db_password='pass1';
break;
case 'database2':
$db_username='user2';
$db_password='pass2';
break;
default:
echo "No database defined to connect to";
break;
}
}
else if($db_password=='') {
switch ($db_username) {
case 'root':
$db_password='rootpass';
break;
case 'user':
$db_password='userpass';
break;
default:
echo "No password known for this user";
break;
}
}
$db_object= new mysqli($db_hostname, $db_username, $db_password, $db_database);
if ($db_object->connect_error) die($db_object->connect_error);
}
?>
Мне неясно, что вы пытаетесь сделать из кода, который вы предоставили. Однако я Можно ответь на свой вопрос: «Что такое безопасный способ подключения к базе данных?»
С PHP, работающим как CGI-подобный язык, главная задача безопасного соединения состоит в том, что ваш файл конфигурации может быть открыт. Есть два возможных решения этого:
Это, вероятно, самый распространенный подход, и особенно часто используемый в распространяемых программах. Сделав ваш «файл конфигурации» файлом PHP, который просто устанавливает переменные и включается в другие страницы, интерпретатор PHP будет анализировать этот файл, а не возвращать его содержимое. Расположение файла на самом деле не имеет значения — если оно где-то, где могут быть выполнены файлы PHP. В типичном приложении это где-нибудь в корне документа Кроме для uploads
каталог.
Пример файла конфигурации (db_config.php
):
<?php
$db_host = "localhost";
$db_user = "username";
$db_pass = "password";
$db_database = "database_name";
Вы бы просто require('db_config.php');
в вашей инициализации / заголовке / и т.д. код.
Вы должны использовать только файл конфигурации для настройка соединение, не для изготовление Это. Таким образом, в дальнейшем вы легко сможете изменить код подключения без необходимости изменять файл конфигурации на каждом сервере, на котором работает ваше приложение.
Кроме того, вы можете использовать что-то вроде JSON или YAML для создания файла конфигурации. Основным преимуществом является то, что вы можете использовать один и тот же файл конфигурации для любых вспомогательных сценариев или приложений, которые должны подключаться к одной и той же базе данных, но не написаны на PHP.
Тем не менее, вы должны никогда поместите этот файл в корень вашего документа. Что касается вашего веб-сервера, файл JSON или YAML является «просматриваемым» файлом, и он с радостью покажет его любому, у кого есть URL.
Правильный способ использования JSON / YAML / и т. Д. файл в качестве файла конфигурации, чтобы убедиться, что он находится вне корня документа, так что веб-сервер не может предоставить его пользователю. Попытка дать ему «неузнаваемое» имя не достаточно.
Вы мог также использовать что-то вроде .htaccess
, но это не рекомендуется так как это усложнит переход на другие веб-серверы, а неправильная конфигурация веб-сервера может раскрыть детали вашего соединения с базой данных. Используйте это только как абсолют Крайнее средство.
Есть три других основных момента, которые я хочу затронуть здесь.
В исходном коде похоже, что вы пытаетесь добавить функцию, в которой вы можете выбрать базу данных, которую хотите выбрать. На самом деле это почти никогда не то, что вы хотите. Каждый сервер / установка должна иметь только свои собственные учетные данные базы данных.
Если вы будете следовать рекомендациям, которые я дал для хранения ваших данных конфигурации, тогда будет очень легко иметь отдельный файл конфигурации в каждой системе без необходимости когда-либо изменять его. Если вы используете Git или другую систему контроля версий, которая позволяет игнорировать файлы, вы можете безопасно (и должны) заставить ее игнорировать файл конфигурации. У вас просто будет свой файл конфигурации на каждом сервере.
Конечно, вы должны убедиться, что ваша общая безопасность находится в надлежащем рабочем состоянии. Если у вас есть уязвимость LFI или кто-то может загрузить оболочку на ваш сервер, то никакие операции по размещению файлов вне корня документа не защитят ваши учетные данные базы данных. OWASP является достойным ресурсом по общей (веб) безопасности приложений.
mysqli_
?Судя по вашему фрагменту кода, вы используете mysqli_
, Хотя это Можно быть правильным выбором, если вы используете параметризацию / подготовленные запросы правильно, я бы не рекомендовал использовать его. PDO является независимой от базы данных библиотекой SQL, которая в большей степени ориентирована на параметризованные запросы. Он включен по умолчанию в более или менее каждую последнюю установку PHP, и в качестве бонуса он позволит вам переключаться между различными серверами SQL.
Использование параметризованных («подготовленных») операторов абсолютно критично — это единственный надежный способ для предотвращения SQL-инъекций, что, по-видимому, является наиболее важной проблемой, от которой вы хотите защитить себя. Хорошее вводное руководство можно найти Вот.
Других решений пока нет …