Вопрос по php, mysql – Что значит убежать от строки?

65

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

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

PS Я мог бы просто спросить друга и не сделать из себя дурака, но я думал, что многие люди, такие как я, задаются вопросом, что же это за вещь, о которой все говорят. Brett

Ваш Ответ

2   ответа
18

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

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

@ спасибо Джону, это был хороший стартовый ответ. Я действительно рад, что кто-то отметил это, потому что это был также правильный ответ. Brett
114

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

"Hello World."

Но что если в моей строке есть двойные кавычки?

"Hello "World.""

Теперь у меня есть двусмысленность - переводчик не знает, где заканчивается моя строка. Если я хочу сохранить свои двойные кавычки, у меня есть пара вариантов. Я мог бы использовать одинарные кавычки вокруг моей строки:

'Hello "World."'

Или я могу избежать моих цитат:

"Hello \"World.\""

Любая цитата, которой предшествует косая черта,escapedи понимается как часть значения строки.

Что касается запросов, 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.

Спасибо @Jonathan очень ценится. Brett
Следует отметить, что выполнение экранирования строк для борьбы с проблемами SQL-инъекций считается плохой практикой и может легко привести к проблемам с безопасностью, если не выполняется должным образом (особенно при работе с определенными типами атак с искаженными многобайтовыми символами). Пожалуйста, никогда по этой причине не экранируйте строки и не используйте параметризованные SQL-запросы или хранимые процедуры.
Вы сказали, что многое из этого может быть обработано для вас, просто передав ваши значения через & quot; mysql_real_escape_string () & apos; Можете ли вы расширить свой ответ, чтобы сообщить нам, что может или это большой вопрос? Brett
@ Бретт: Не проблема, я добавил еще немного в конец ответа.

Похожие вопросы