Подтвердить что ты не робот

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

Я читал Нужно ли избегать $_SESSION ['username'] перед тем, как войти в SQL-запрос? и он сказал: "Вам нужно избегать каждой строки, которую вы перейдите к запросу sql, независимо от его происхождения". Теперь я знаю, что это действительно так. Поиск Google показал более 20 000 результатов. Только у Stackoverflow было 20 страниц результатов, но никто на самом деле не объяснил, что такое экранирование или как это сделать. Это просто предполагается. Вы можете мне помочь? Я хочу учиться, потому что, как всегда, я делаю веб-приложение на PHP.

Я посмотрел: Вставка символов Escape, Что все escape-символы в Java?, Невозможно удалить строку с помощью addcslashes(), Escape character, что действительно делает mysql_real_escape_string()?, Как я могу избежать двойных кавычек из строки в php?, MySQL_real_escape_string не добавляет косые черты?, удалить escape-последовательности из строки в php Я мог бы продолжить, но я уверен, что вы поняли. Это не лень.

4b9b3361

Ответ 1

Сброс строки означает уменьшение двусмысленности в кавычках (и других символах), используемых в этой строке. Например, когда вы определяете строку, вы обычно окружаете ее в двойных кавычках или одинарных кавычках:

"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.

Ответ 2

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

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