Является ли mysqli_real_escape_string безопасным?
Я новичок в PHP, и я понял, что мое подключение к базе данных с использованием php-формы (с пользовательскими и текстовыми вводами) было абсолютно небезопасным:
Это работало, но было небезопасно:
<?php
$link=mysqli_connect('localhost','xx','xx','xx');
$sql=' SELECT * FROM usuarios
WHERE username="'.$_POST['usuario'].'"
AND pass="'.$_POST['usuario'].'"
';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>
Итак, я прочитал о mysqli_real_escape_string и решил попробовать:
<?php
$link=mysqli_connect('localhost','xx','xx','xx');
$usuario=mysqli_real_escape_string($link, $_POST["usuario"]);
$clave=mysqli_real_escape_string($link, $_POST["clave"]);
$sql=' SELECT * FROM usuarios
WHERE username="'.$usuario.'"
AND pass="'.$clave.'"
';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>
Это правильно? Это хороший пример того, как использовать mysqli_real_escape_string?
Ответы
Ответ 1
Это правильно?
Да.
Это хороший пример того, как использовать mysqli_real_escape_string?
НЕТ
Если когда-либо используется, эта функция должна быть инкапсулирована в некоторую внутреннюю обработку и никогда не должна быть вызвана прямо из кода приложения. Вместо этого следует использовать placeholder, чтобы представлять данные в вашем запросе:
$sql='SELECT * FROM usuarios WHERE username=? AND pass=?';
И затем, при обработке меток-заполнителей, эта функция может применяться (если применимо), но не сама по себе, а по всем правилам форматирования.
Ответ 2
Использование функций mysqli() должно быть зарезервировано только разработчикам фреймворка и другим, кто знает обо всех проблемах безопасности, которые он может принести. Для всех остальных PDO. Он так же прост в использовании, как и mysqli(), и гораздо безопаснее.
Ответ 3
Да, вы будете использовать его сейчас.
Самое приятное в использовании mysqli в том, что оно ориентировано на объекты.
Поэтому вы можете использовать его следующим образом:
<?php
$mysqli = new mysqli("host", "user", "password", "database");
$usuario = $mysqli->real_escape_string($_POST["usuario"]);
$clave = $mysqli->real_escape_string($_POST["clave"]);
$sql=' SELECT * FROM usuarios
WHERE username="'.$usuario.'"
AND pass="'.$clave.'"
';
$mysqli->query($sql);
$mysqli->close();
?>
Или вы можете использовать PDO.