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


Я читал, нужно ли экранировать $_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 59

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.