Что значит экранировать строку?

84

Я читал, нужно ли экранировать $ _SESSION ['username'] перед тем, как перейти к SQL-запросу? и он сказал: «Вам нужно экранировать каждую строку, которую вы передаете в запрос sql, независимо от ее происхождения». Теперь я знаю, что что-то вроде этого действительно простое. Поиск в Google дал более 20 000 результатов. Один только Stackoverflow имел 20 страниц результатов, но никто на самом деле не объясняет, что такое экранирование строки и как это сделать. Это просто предположение. Вы можете мне помочь? Я хочу учиться, потому что, как всегда, делаю веб-приложение на PHP.

Я просмотрел: Вставка escape-символов , что такое escape-символы в Java? , Невозможно экранировать строку с помощью addcslashes () , Escape-символ , что действительно делает mysql_real_escape_string ()? , Как избежать двойных кавычек в строке в php? , MySQL_real_escape_string не добавляет косую черту? , Удалить управляющие последовательности из строки в PHP Я мог бы продолжать, но я уверен , что вы получите точку. Это не лень.

Бретт
источник
10
PS Я мог бы просто спросить друга и не выставлять себя дураком, но я подумал, что будет много таких же людей, как я, задающихся вопросом, что это за штука, о которой все говорят.
Бретт

Ответы:

135

Экранирование строки означает уменьшение двусмысленности в кавычках (и других символах), используемых в этой строке. Например, когда вы определяете строку, вы обычно заключаете ее в двойные или одинарные кавычки:

"Hello World."

Но что, если бы в моей строке были двойные кавычки?

"Hello "World.""

Теперь у меня двусмысленность - интерпретатор не знает, где заканчивается моя строка. Если я хочу сохранить двойные кавычки, у меня есть несколько вариантов. Я мог бы заключить строку в одинарные кавычки:

'Hello "World."'

Или я могу избежать цитат:

"Hello \"World.\""

Любая кавычка, которой предшествует косая черта, экранируется и считается частью значения строки.

Когда дело доходит до запросов, MySQL имеет определенные ключевые слова, которые он отслеживает, которые мы не можем использовать в наших запросах, не вызывая некоторой путаницы. Предположим, у нас есть таблица значений, в которой столбец назван «Выбрать», и мы хотим его выбрать:

SELECT select FROM myTable

Мы внесли некоторую двусмысленность в наш запрос. В нашем запросе мы можем уменьшить эту двусмысленность, используя обратные тики:

SELECT `select` FROM myTable

Это устраняет путаницу, которую мы ввели из-за неправильного выбора имен полей.

Со многими из них можно справиться, просто передав свои ценности mysql_real_escape_string(). В приведенном ниже примере вы можете видеть, что мы передаем данные, отправленные пользователем, через эту функцию, чтобы гарантировать, что это не вызовет никаких проблем для нашего запроса:

// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));

Существуют и другие методы для обработки строк, таких , как add_slashes, addcslashes, quotemetaи многое другое, хотя вы обнаружите , что , когда цель состоит в том, чтобы запустить безопасный запрос, по большому счету разработчики предпочитают mysql_real_escape_stringили pg_escape_string(в контексте PostgreSQL.

Sampson
источник
6
Следует отметить, что выполнение экранирования строк для борьбы с проблемами SQL-инъекции считается плохой практикой и может легко привести к проблемам безопасности, если не выполняется должным образом (особенно при работе с некоторыми типами атак с искаженными многобайтовыми символами). По этой причине никогда не используйте экранирование строки и используйте вместо этого параметризованные запросы sql или хранимые процедуры.
Cheekysoft
22

Некоторые символы имеют особое значение для используемой вами базы данных SQL. Когда эти символы используются в запросе, они могут вызвать неожиданное и / или непреднамеренное поведение, в том числе позволить злоумышленнику скомпрометировать вашу базу данных. Чтобы эти символы не влияли на запрос таким образом, их нужно экранировать, или, говоря иначе, нужно указать базе данных не рассматривать их как специальные символы в этом запросе.

В случае mysql_real_escape_string()оно ускользает \x00, \n, \r, \, ', "и так \x1aкак они, когда не удалось избежать, может привести к ранее упомянутым проблемам , которые включают SQL инъекции с базой данных MySQL.

Джон Конде
источник
1

Для простоты вы можете представить обратную косую черту «\» как команду интерпретатору во время выполнения.

Например, при интерпретации этого утверждения:

$txt = "Hello world!";

во время фазы лексического анализа (или когда раскалывается заявления на отдельные лексемы) они будут определены маркеры $, txt, =, ", Hello world!, ", и;

Однако обратная косая черта в строке вызовет дополнительный набор токенов и интерпретируется как команда, чтобы что-то сделать с символом, который следует сразу за ним: например,

$txt = "this \" is escaped";

Результаты в следующих лексем: $, txt, =, ", this, \, ", is escaped, ", и;

интерпретатор уже знает (или имеет предустановленные маршруты, которые он может предпринять), что делать в зависимости от символа, следующего за \токеном. Таким образом, в этом случае "он обрабатывается как символ, а не как команда конца строки.

супи
источник