Вы никогда не должны избегать, обрезать или использовать любой другой механизм очистки паролей, которые вы будете хешировать с помощью 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 .
«К сожалению, я не могу использовать 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: см. отчет об ошибке
.Удачи!
Измените заголовок [client]
на [mysqld]
. Вам нужно настроить сертификаты на стороне сервера там, а не на стороне клиента.
См. Полный пример из документации MySQL.
Также см. Этот похожий вопрос: Связи с PHP для MySQL SSL
Сертификаты сервера позволяют серверу отвечать на запросы SSL, и они не требуют, чтобы клиент имел сертификат. Каждый раз, когда вы подключаетесь к веб-сайту через HTTPS, вы используете сертификаты сервера, чтобы убедиться, что вы подключаетесь к правильному серверу, и используете открытый ключ сертификата для шифрования.
Сертификаты клиента позволяют сервер для аутентификации клиента.
В вашем случае вам нужны сертификаты сервера. Вы хотите установить сертификаты на сервере (MySQL), а клиент (PHP) сможет аутентифицировать сервер и использовать открытый ключ сертификата для настройки шифрования. Сертификаты клиентов довольно редки.
Если вы хотите использовать клиентские сертификаты, вы должны использовать mysqli или PDO .