Является ли 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.