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