Использование параметров для mysql_query

где-то во время учебы я узнал что-то интересное .. Он говорит что-то вроде:

$query = sprintf("SELECT firstname, lastname, address, age FROM friends WHERE firstname='%s' AND lastname='%s'",mysql_real_escape_string($firstname), mysql_real_escape_string($lastname)); 

используя этот запрос, а не

 $query="select firstname, lastname, address, age FROM friends WHERE firstname='".$_RETURN['name1']."', lastname='".$_RETURN['name2']."'"; 

это кажется разумным .. у вас пробовал эту кодировку когда-либо .. и как она помогает предотвратить любые вредоносные атаки ..

Solutions Collecting From Web of "Использование параметров для mysql_query"

Во-первых, это называется SQL-Injection . В основном это просто возможность изменять запросы к базе данных с помощью ввода пользователем.

Давайте посмотрим на пример:

Запрос:

 SELECT temp1 FROM temp WHERE temp2 = 'VAR1'; 

Теперь мы назначим VAR1 значение: '; DROP TABLE *; -- '; DROP TABLE *; -- '; DROP TABLE *; -- И мы получим:

 SELECT temp1 FROM temp WHERE temp2 = ''; DROP TABLE *; --'; 

С mysql_real_escape_string он будет выглядеть так:

 SELECT temp1 FROM temp WHERE temp2 = '\'; DROP TABLE *; --' 

mysql_real_escape_string 'защищает' строку для использования в запросе.

Но, в конце концов, вы должны полностью прекратить использование mysql_* . Они устарели и считаются небезопасными, когда дело доходит до предотвращения внедрения SQL или других способов закалки с запросами.

Вы должны просто прекратить объединять запросы вместе так и начинать с использования подготовленных операторов , которые не только проще в использовании, но и предотвращают внедрение SQL по умолчанию, но также могут улучшить скорость вашего приложения.

Для PHP существуют два расширения, которые предназначены для закрытия всего mysql_* :

  • MySQLi
  • PDO

И я говорю это снова: прекратите использование mysql_* !

Насколько мне известно, mysql_real_escape_string является одним из лучших способов предотвратить внедрение SQL , не mysql_real_escape_string подготовленных операторов с mysqli или PDO .

Использование форматирующих функций, таких как sprintf является чисто вопросом вкуса; большим преимуществом в первом примере является то, что функция mysql_real_escape_string предотвращает все инъекции SQL (объясняется в одном из других ответов); в отличие от некоторой функции iffy magic_quotes_gpc в PHP, на которую многие полагаются.

magic_quotes_gpc автоматически избегает вещей, которые вы получаете в запросах от клиентов … но не может обнаружить так называемые инъекции второго уровня:

  1. Вы получаете злонамеренный запрос от клиента и сохраняете его содержимое в базе данных. magic_quotes_gpc предотвращает SQL-инъекцию; злонамеренная строка сохраняется правильно.
  2. Позже вы извлекаете эту строку из базы данных и включаете ее в другой запрос. Теперь строка не вышла из запроса, поэтому magic_quotes_gpc не magic_quotes_gpc строку. Voilà, SQL-инъекция; ваши данные теперь, вероятно, исчезли.

Используя некоторые способы ускользнуть от себя, либо что-то вроде mysql_real_escape_string либо уровень абстракции базы данных с построителем запросов (например, Adodb), безусловно, превосходит просто надежду на лучшее.