Mysql PDO - подключение через SSL [дубликат]

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

Вы будете спорить (и вы видите это в каждом сообщении, в котором пользовательские данные принимаются для использования в ваших системах), что мы должны очищать все пользовательские данные, и вы были бы правы для любую другую информацию, которую мы принимаем от наших пользователей. Пароли разные. Хэшированные пароли не могут предложить угрозу SQL-инъекции, потому что строка переводится в хеш до хранения в базе данных.

Актом хэширования пароля является принятие пароля для сохранения в вашей базе данных. Хэш-функция не имеет особого значения для каких-либо байтов, поэтому для обеспечения безопасности не требуется очистка ее ввода

Если вы следуете мантрам, позволяющим пользователям использовать пароли / фразы , и вы не ограничиваете пароли , позволяя любую длину, любое количество пробелов и хэширование любых специальных символов делают пароль / парольную фразу безопасной независимо от того, что содержится в пароле. На данный момент наиболее распространенный хеш (по умолчанию), PASSWORD_BCRYPT , превращает пароль в строку шириной 60 символов, содержащую случайную соль, вместе с информацией хешированного пароля и стоимостью (алгоритмическая стоимость создания хэша):

PASSWORD_BCRYPT используется для создания новых хэшей паролей с использованием алгоритма CRYPT_BLOWFISH. Это всегда будет приводить к хеш-файлу с использованием формата склепа «$ 2y $», который всегда имеет ширину 60 символов.

blockquote>

Требования к пространству для хранения хеша могут быть изменены как различные методы хэширования добавляются к функции, поэтому всегда лучше увеличить размер столбца для сохраненного хэша, например VARCHAR(255) или TEXT.

Вы можете использовать полный SQL-запрос в качестве пароля и он будет хэширован, делая его необработанным с помощью механизма SQL, например

SELECT * FROM `users`;

Может быть хэширован до $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G

. Посмотрим, как различные методы санитарии влияют на пароль -

Пароль - I'm a "dessert topping" & a ! (В конце пароля есть 5 пробелов, которые здесь не отображаются).

Когда мы применяем следующие методы обрезки, мы получаем некоторые дикие разные Результаты:

var_dump(trim($_POST['upassword']));
var_dump(htmlentities($_POST['upassword']));
var_dump(htmlspecialchars($_POST['upassword']));
var_dump(addslashes($_POST['upassword']));
var_dump(strip_tags($_POST['upassword']));

Результаты:

string(40) "I'm a "dessert topping" & a !" // spaces at the end are missing
string(65) "I'm a "dessert topping" & a <floor wax>!     " // double quotes, ampersand and braces have been changed
string(65) "I'm a "dessert topping" & a <floor wax>!     " // same here
string(48) "I\'m a \"dessert topping\" & a !     " // escape characters have been added
string(34) "I'm a "dessert topping" & a !     " // looks like we have something missing

Что происходит, когда мы отправляем их в password_hash()? Все они получают хеширование, как и запрос выше. Проблема возникает при попытке проверить пароль. Если мы используем один или несколько из этих методов, мы должны повторно использовать их до их сравнения с password_verify() . Не удалось выполнить следующее:

password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query

Вам нужно будет запустить опубликованный пароль с помощью метода очистки, который вы выбрали, прежде чем использовать результат проверки пароля. Это ненужный набор шагов и не сделает хэш лучше.


Использование версии PHP менее 5.5? Вы можете использовать пакет совместимости password_hash() .

Вам действительно не следует использовать хэш-коды MD5 .

12
задан Alexey Bulash 16 March 2012 в 16:05
поделиться

2 ответа

«К сожалению, я не могу использовать mysqli lib, потому что у меня слишком много рабочих адаптеров для pdo_mysql.»

Вы используете старое расширение MySQL («mysql_connect») который больше не разрабатывается ( только обслуживание ). Поскольку вы используете PHP 5, вы можете использовать MySQLi , улучшенное расширение MySQL . Среди прочего, он имеет объектно-ориентированный интерфейс, поддержку подготовленных / множественных операторов и расширенные возможности отладки. Подробнее об конвертации в MySQLi вы можете прочитать здесь ;

Вот пример кода, который может помочь вам начать:

<?php
ini_set ('error_reporting', E_ALL);
ini_set ('display_errors', '1');
error_reporting (E_ALL|E_STRICT);

$db = mysqli_init();
mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);

$db->ssl_set('/etc/mysql/ssl/client-key.pem', '/etc/mysql/ssl/client-cert.pem', '/etc/mysql/ssl/ca-cert.pem', NULL, NULL);
$link = mysqli_real_connect ($db, 'ip', 'user', 'pass', 'db', 3306, NULL, MYSQLI_CLIENT_SSL);
if (!$link)
{
    die ('Connect error (' . mysqli_connect_errno() . '): ' . mysqli_connect_error() . "\n");
} else {
    $res = $db->query('SHOW TABLES;');
    print_r ($res);
    $db->close();
}
?>

Если PDO_MYSQL / g4] действительно то, что вы хотите, тогда вам нужно сделать что-то вроде этого:

<?php
$pdo = new PDO('mysql:host=ip;dbname=db', 'user', 'pass', array(
    PDO::MYSQL_ATTR_SSL_KEY    =>'/etc/mysql/ssl/client-key.pem',
    PDO::MYSQL_ATTR_SSL_CERT=>'/etc/mysql/ssl/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_CA    =>'/etc/mysql/ssl/ca-cert.pem'
    )
);
$statement = $pdo->query("SHOW TABLES;");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);
?>

Однако только последние версии PHP поддерживают SSL для PDO, а параметры SSL молча игнорируются (в наименьшая) версия 5.3.8: см. отчет об ошибке .

Удачи!

32
ответ дан Norbert 22 August 2018 в 01:09
поделиться

Измените заголовок [client] на [mysqld]. Вам нужно настроить сертификаты на стороне сервера там, а не на стороне клиента.

См. Полный пример из документации MySQL.

Также см. Этот похожий вопрос: Связи с PHP для MySQL SSL

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

Сертификаты клиента позволяют сервер для аутентификации клиента.

В вашем случае вам нужны сертификаты сервера. Вы хотите установить сертификаты на сервере (MySQL), а клиент (PHP) сможет аутентифицировать сервер и использовать открытый ключ сертификата для настройки шифрования. Сертификаты клиентов довольно редки.

Если вы хотите использовать клиентские сертификаты, вы должны использовать mysqli или PDO .

0
ответ дан Community 22 August 2018 в 01:09
поделиться
  • 1
    Спасибо, Маркус, но это конфигурация клиентской стороны. После добавления этих параметров я могу подключиться к серверу без добавления параметров -ssl -.... – Alexey Bulash 16 March 2012 в 16:34
  • 2
    @AlexeyBulash, я обновил свой ответ, чтобы еще больше объяснить разницу между сертификатами клиентов и серверов. – Marcus Adams 16 March 2012 в 17:35
  • 3
    @MarcusAdams, ваша ссылка сейчас сломана. – Henno 24 December 2015 в 11:45
Другие вопросы по тегам:

Похожие вопросы: