Что значит экранировать строку?
Я читал, нужно ли экранировать $_SESSION['username'] перед тем, как попасть в SQL-запрос? и он сказал:"вам нужно экранировать каждую строку, которую вы передаете в sql-запрос, независимо от ее происхождения". Теперь я знаю, что что-то вроде этого действительно основное. Поиск в Google показал более 20 000 результатов. Только у Stackoverflow было 20 страниц результатов, но никто на самом деле не объясняет, что такое экранирование строки или как это сделать. Это просто предположение. Вы можете мне помочь? Я хочу учиться, потому что, как всегда, я создание веб-приложения на PHP.
Я посмотрел на: Вставка Escape-символов, каковы все escape-символы в Java?, Не удается избежать строки с addcslashes(), Экранирующий символ, что на самом деле делает mysql_real_escape_string ()?, Как я могу избежать двойных кавычек из строки в php?, MySQL_real_escape_string не добавляет косые черты?, удалить escape-последовательности из строки в php я мог бы продолжить, но я уверен, что вы поняли смысл. Это не лень.
2 ответа:
экранирование строки означает уменьшение неоднозначности в кавычках (и других символах), используемых в этой строке. Например, при определении строки ее обычно заключают в двойные или одинарные кавычки:
"Hello World."
но что, если в моей строке были двойные кавычки?
"Hello "World.""
теперь у меня есть двусмысленность - интерпретатор не знает, где заканчивается моя строка. Если я хочу сохранить свои двойные кавычки, у меня есть несколько вариантов. Я мог бы использовать одинарные кавычки вокруг моей строки:
'Hello "World."'
или я могу избежать моих цитат:
"Hello \"World.\""
любая цитата, которой предшествует косая черта бежал, и понимается как часть значения строки.
когда дело доходит до запросов, MySQL имеет определенные ключевые слова, которые он наблюдает за тем, что мы не можем использовать в наших запросах, не вызывая некоторой путаницы. Предположим, у нас есть таблица значений, в которой столбец называется "Select", и мы хотим выбрать что:
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.