Нужно ли мне экранировать строку при использовании preg_match? - PullRequest
0 голосов
/ 25 мая 2020

Я использую простую веб-форму HTML, которая собирает имя пользователя и пароль. Я использую preg_match, чтобы разрешить использование только символов AZ, 0-9 для имени пользователя. Я использую следующий код:

if (preg_match('/[^A-Za-z0-9]/', $_POST["username"]))  {
    echo '<script>alert("Usernames can only contain A-Z, 0-9")</script>';
}

Нужно ли мне использовать mysqli_real_escape_string, чтобы избежать этой строки? Если да, будет ли он работать во всех случаях? Если нет, то каким рискам безопасности я подвергаюсь и как их предотвратить?

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

1 Ответ

1 голос
/ 25 мая 2020

Никогда не используйте mysqli_real_escape_string. Просто забудьте, что эта функция даже существует.

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

Чтобы предотвратить внедрение SQL (которое, как я полагаю, является вашей целью), вы должны использовать заполнители и привязку параметров. В mysqli это выглядит примерно так:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$mysqli->set_charset('utf8mb4'); // always set the charset

$username = $_POST["username"];
$password = password_hash($_POST["password"], PASSWORD_DEFAULT);

$stmt = $mysqli->prepare('INSERT INTO users(username, passwordHash) VALUES(?,?)');
$stmt->bind_param('ss', $username, $password);
$stmt->execute();

Я рекомендую перейти с mysqli на PDO. Он предлагает больше и проще в использовании. В PDO тот же пример будет выглядеть так:

$dsn = "mysql:host=localhost;dbname=db;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false
]);

$username = $_POST["username"];
$password = password_hash($_POST["password"], PASSWORD_DEFAULT);

$stmt = $pdo->prepare('INSERT INTO users(username, passwordHash) VALUES(?,?)');
$stmt->execute([$username, $password]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...