Что значит избежать строки?


Я читал Нужно ли экранировать $_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 Я мог бы продолжать но я уверен, что вы понимаете, в чем дело. Это не лень.

Author: Community, 2012-05-18

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.

 108
Author: Sampson, 2012-05-18 03:19:46

Некоторые символы имеют особое значение для используемой вами базы данных SQL. Когда эти символы используются в запросе, они могут вызвать неожиданное и/или непреднамеренное поведение, в том числе позволить злоумышленнику скомпрометировать вашу базу данных. Чтобы эти символы не влияли на запрос таким образом, их необходимо экранировать или, говоря по-другому, базе данных необходимо указать, чтобы она не рассматривала их как специальные символы в этом запросе.

В случае mysql_real_escape_string() он ускользает \x00, \n, \r,\, ', " и \x1a поскольку они, если не экранированы, могут вызвать ранее упомянутые проблемы, которые включают инъекции SQL с базой данных MySQL.

 16
Author: John Conde, 2012-05-18 03:00:59