2016-03-22 2 views
4

Я знаю, что mysqli_real_escape_string Функция может использоваться для предотвращения инъекций SQL. (Однако mysql_real_escape_string() не будет защищать вас от некоторых инъекций)Когда я должен использовать PHP mysqli_real_escape_string()?

Мой вопрос в том, когда следует использовать функцию mysqli_real_escape_string()?

Ситуация 01

У меня есть регистрационная форма с 4 полей под названием Имя, Фамилия, электронная почта, пароль.

Должен ли я использовать mysqli_real_escape_string() для вставки запроса? Все четыре поля?

Или его достаточно использовать в форме входа?

Ситуация 02

У меня есть страница профиля как profile.php? User_name = damith

я использовал $ _GET [ 'user_name'] во многих функциях на этой странице.

Должен ли я использовать mysqli_real_escape_string() во всех этих функциях?

+0

Я бы рекомендовал просто всегда использовать параметризованные запросы. Когда вы забудете использовать эту функцию в каком-то запросе, вы, возможно, сделали огромную ошибку, которая ставит под угрозу все данные. С параметризованным вы должны написать запрос, чтобы быть восприимчивым. http://php.net/manual/en/mysqli.quickstart.prepared-statements.php – chris85

ответ

3

mysqli_real_escape_string() - это не лучший способ гарантировать, что данные, которые вы сохраняете в своей базе данных, безопасны. Вместо этого вы должны использовать подготовленные заявления: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

Что касается вашего вопроса: каждый раз, когда вы помещаете данные, которые вы не уверены (особенно если эти данные поступают из неизвестных источников, таких как веб-форма), в вашу базу данных вы должны делать убедитесь, что он правильно отформатирован для вашей базы данных. mysqli_real_escape_string() может делать это только для строковых литералов, поэтому подготовленные утверждения - лучший подход. Каждый раз, когда вы выполняете запрос, который использует данные, предоставленные пользователем, вы должны использовать подготовленные операторы.

Когда выходные данные для отображения пользователю, вам не нужно использовать mysqli_real_escape_string(), но вместо этого следует избежать в Интернете с помощью htmlspecialchars() (http://php.net/htmlspecialchars)

ситуации 1 - ДА ТОЧНО, и даже лучше было бы использовать подготовленные заявления.

ситуация 2 - Если вы показываете данные пользователю на веб-странице, вам не нужно использовать mysqli_real_escape_string(), но вместо этого следует использовать htmlspecialchars(), чтобы уменьшить риск XSS и других инъекций кода.

Несколько примеров:

<?php 
// Prepared statement. Save the user's first name to the database: 
$stmt = $mysqli->prepare("INSERT INTO users(first_name) VALUES (?)"); 
$stmt->bind_param("s", $first_name); 
$stmt->execute(); 

// Echo the user's first name back to them 
echo "Saved your first name: " . 
     htmlspecialchars($first_name) . " to the database."; 

Для получения дополнительной информации о предотвращении инъекции SQL, см это отличный ответ: How can I prevent SQL injection in PHP?

+1

Но, пожалуйста, имейте в виду использовать real_escape_string _only_ в строковых литералах, http://dev.mysql.com/doc/refman/5.7/en/string-literals.html. Это единственная функция, для которой предназначена функция. http://dev.mysql.com/doc/refman/5.7/en/mysql-real-escape-string.html: 'Эта функция создает законную строку SQL для использования в SQL-заявлении'. Ни больше ни меньше. – VolkerK

+1

И [подготовленные, параметризованные утверждения] (http://docs.php.net/manual/en/mysqli.quickstart.prepared-statements.php), например. требуется больше сетевых обращений. ИМО это все еще лучший рецепт поваренной книги по умолчанию, чтобы предложить. Если вы когда-нибудь столкнетесь с его ограничением ... вы узнаете ;-) – VolkerK

+0

Спасибо @VolkerK - Я обновил свой ответ, чтобы попытаться сделать это более понятным. –

2

Вы должны использовать real_escape_string на любой параметр, который вы смешиваете как string literal в инструкции sql. И только по этим строковым буквальным значениям.

Поэтому описание Situation 01 и Situation 02 не является достаточным для ответа на эти конкретные вопросы. Вероятно, это yes.

+0

Спасибо. Это означает, что я должен использовать mysqli_real_escape_string почти где угодно? – Sasa1234

+1

Нет, это совсем не значит, что ;-) Но ... часто. Вы не должны использовать real_ecape_string для литералов чисел, например, например. 'WHERE ID> 5'; вы не будете обрабатывать '5' с помощью escape_string, но убедитесь, что это действительно числовой литерал. И вы не будете обрабатывать идентификаторы с помощью real_ecape_string, например. имена таблиц/полей. Но если вы поместите его в одиночные кавычки, такие как 'WHERE id = '5'', вы должны использовать mysql_real_escape_string; (почти полностью), независимо от источника параметра, и независимо от того, думаете ли вы, что строковый литерал будет содержать только цифры. Строка literal-> real_escape, нет обсуждения. – VolkerK

Смежные вопросы