Я читал ли нужно, чтобы $ _SESSION ['username'] был экранирован перед тем, как войти в SQL-запрос? и он сказал: «Вам нужно избегать каждой строки, которую вы передаете в sql-запрос, независимо от его происхождения». Теперь я знаю, что это действительно так. Поиск Google показал более 20 000 результатов. Только у Stackoverflow было 20 страниц результатов, но никто на самом деле не объяснил, что такое экранирование или как это сделать. Это просто предполагается. Вы можете мне помочь? Я хочу учиться, потому что, как всегда, я делаю веб-приложение на PHP.
Я посмотрел: Вставка символов Escape , Что все escape-символы в Java? , Cant избежать строки с addcslashes () , символ Escape , что действительно делает mysql_real_escape_string ()? , Как я могу избежать двойных кавычек из строки в php? , MySQL_real_escape_string не добавляет косые черты? , удалите escape-последовательности из строки в php, я могу продолжить, но я уверен, что вы поняли суть. Это не лень.
Экранирование строки означает уменьшение двусмысленности в кавычках (и других символах), используемых в этой строке. Например, когда вы определяете строку, вы обычно окружаете ее в двойных кавычках или одинарных кавычках:
"Hello World."
Но что, если моя строка содержит в себе двойные кавычки?
"Hello "World.""
Теперь у меня есть двусмысленность – интерпретатор не знает, где заканчивается моя строка. Если я хочу сохранить свои двойные кавычки, у меня есть пара вариантов. Я мог бы использовать одинарные кавычки вокруг моей строки:
'Hello "World."'
Или я могу избежать моих котировок:
"Hello \"World.\""
Любая цитата, которой предшествует косая черта, сбрасывается и понимается как часть значения строки.
Когда дело доходит до запросов, у MySQL есть определенные ключевые слова, которые он наблюдает за тем, что мы не можем использовать в наших запросах, не вызывая некоторую путаницу. Предположим, что у нас есть таблица значений, где столбец был назван «Выбрать», и мы хотели бы выбрать это:
SELECT select FROM myTable
Мы теперь внесли в наш запрос некоторую двусмысленность. В рамках нашего запроса мы можем уменьшить эту двусмысленность, используя обратные тики:
SELECT `select` FROM myTable
Это устраняет путаницу, которую мы ввели, используя плохое суждение при выборе полей.
Многие из них могут быть обработаны для вас простым mysql_real_escape_string()
ваших значений через 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
предпочитают mysql_real_escape_string
или pg_escape_string
(в контексте PostgreSQL.
Некоторые символы имеют особое значение для базы данных SQL, которую вы используете. Когда эти символы используются в запросе, они могут вызвать непредвиденное и / или непреднамеренное поведение, в том числе позволяя злоумышленнику скомпрометировать вашу базу данных. Чтобы эти символы не влияли на запрос таким образом, они должны быть экранированы или, скажем, по-другому, в базе данных должно быть сказано не рассматривать их как специальные символы в этом запросе.
В случае с mysql_real_escape_string()
он mysql_real_escape_string()
\x00
, \n
, \r
, \
, '
, "
и \x1a
поскольку они, когда не экранируются, могут вызывать вышеупомянутые проблемы, которые включают SQL-инъекции с базой данных MySQL.