Как безопасно использовать MySQLi?

Поэтому я недавно перешел на использование MySQLi. И у меня есть несколько вопросов по этому поводу.

Мой текущий код для получения данных

$current = "SELECT * FROM hi where username='me'";
$result = $connect->query($current) or die($mysqli->error.__LINE__);
$row = $result->fetch_assoc();

и мое выполнение запроса

$current = "SELECT * FROM hi, где username='me'"; $result = $connect->query($current) или die ($ mysqli-> error.LINE);

Первый вопрос, это правильный путь?

И как это более безопасно, чем метод mysql_? (Я слышал, что это предотвращает инъекции или что-то)

И наконец, кроме использования MySQLi, что еще мне делать? Достаточно ли защищен мой код?

Ранее я использовал mysql_real_escape_string(htmlspecialchars($string)) для любых данных, которые будут использоваться в запросе mysql, мне все еще нужно их использовать? Поскольку я сейчас использую MySQLi.

Какие еще вещи я должен принять к сведению, чтобы сделать мой сайт безопасным? htmlspecialchars какие-либо пользовательские входы?

Спасибо!

1 ответ

Решение

о тебе mysqli_query использовать:

И как это более безопасно, чем метод mysql_? (Я слышал, что это предотвращает инъекции или что-то)

Здесь у вас нет проблемы с инъекцией, так как вы не используете какой-либо пользовательский ввод. Так что MySQL или mysqli_ кажется эквивалентным.

по вопросам инъекций:

Тем не менее, если вы должны использовать пользовательский ввод (например, $_POST или же $_GET переменные) лучше использовать подготовленные высказывания. Их синтаксис такой:

$query = SELECT * FROM mytable WHERE col1=? AND col2=?;
$stmt = $db->prepare($query);
$stmt->bind_param('ss',$_POST['col1'],$_POST['col2']);//I put 2 s because I want 2 params. s stands for strings, i for integer. For that part PHP and mysqli extension offers you two alternative syntaxes. They give the same result but it depends on what you understand the best.
  • во-первых: с помощью bind_result, Эта функция должна быть вызвана перед выполнением. Он свяжет ваш результат с переменными, указанными вами в параметрах. Первый столбец заполнит первую переменную, второй столбец - второй параметр... Основная проблема заключается в том, что он отсекает вас от всего API-интерфейса mysqli_result, который имеет fetch_all, fetch_assoc или же fectch_object,

    $stmt->bindResult($array['col1'], $array['col2'], $array['col3']);
    $stmt->execute();
    while($stmt->fetch_assoc()){
       var_dump($array);
    }
    
  • второе: использование get_result, Это позволяет вам использовать mysqli_result API, который вы уже используете, когда используете $db->query(), Он доступен только тогда, когда вы используете mysqlnd в качестве драйвера. Если вы используете php 5.3+, то это драйвер по умолчанию, но с php 5.1 или 5.2 (в основном, хостер 1&1 меньше 5.2), это не всегда так.

    $stmt->execute();
    $result = $stmt->get_result()->fetch_all();
    foreach($result as $row){
       //handle your rows
    }
    

о побеге:

mysql_real_escape_string (htmlspecialchars ($ строка))

В MySQL, вы можете использовать mysqli_real_escape_string, htmlspecialchars Функция бесполезна, когда речь заходит о базе данных. Это только для отображения.

Другие вопросы по тегам