Я читал, нужно ли экранировать $ _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 Я мог бы продолжать, но я уверен , что вы получите точку. Это не лень.
Ответы:
Экранирование строки означает уменьшение двусмысленности в кавычках (и других символах), используемых в этой строке. Например, когда вы определяете строку, вы обычно заключаете ее в двойные или одинарные кавычки:
"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.источник
Некоторые символы имеют особое значение для используемой вами базы данных SQL. Когда эти символы используются в запросе, они могут вызвать неожиданное и / или непреднамеренное поведение, в том числе позволить злоумышленнику скомпрометировать вашу базу данных. Чтобы эти символы не влияли на запрос таким образом, их нужно экранировать, или, говоря иначе, нужно указать базе данных не рассматривать их как специальные символы в этом запросе.
В случае
mysql_real_escape_string()
оно ускользает\x00
,\n
,\r
,\
,'
,"
и так\x1a
как они, когда не удалось избежать, может привести к ранее упомянутым проблемам , которые включают SQL инъекции с базой данных MySQL.источник
Для простоты вы можете представить обратную косую черту «\» как команду интерпретатору во время выполнения.
Например, при интерпретации этого утверждения:
$txt = "Hello world!";
во время фазы лексического анализа (или когда раскалывается заявления на отдельные лексемы) они будут определены маркеры
$
,txt
,=
,"
,Hello world!
,"
, и;
Однако обратная косая черта в строке вызовет дополнительный набор токенов и интерпретируется как команда, чтобы что-то сделать с символом, который следует сразу за ним: например,
$txt = "this \" is escaped";
Результаты в следующих лексем:
$
,txt
,=
,"
,this
,\
,"
,is escaped
,"
, и;
интерпретатор уже знает (или имеет предустановленные маршруты, которые он может предпринять), что делать в зависимости от символа, следующего за
\
токеном. Таким образом, в этом случае"
он обрабатывается как символ, а не как команда конца строки.источник