Що означає уникнути рядка?


84

Я читав Чи потрібно уникати $ _SESSION ['ім'я користувача'], перш ніж потрапляти в запит SQL? і там було сказано "Вам потрібно уникнути кожного рядка, який ви передаєте запиту sql, незалежно від його походження". Тепер я знаю, що щось подібне насправді є базовим. Пошук Google виявив понад 20 000 результатів. Лише Stackoverflow мав 20 сторінок результатів, але насправді ніхто не пояснює, що таке рятувальний рядок або як це зробити. Це лише передбачається. Можеш мені допомогти? Я хочу навчитися, тому що як завжди роблю веб-програму на PHP.

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


10
PS Я міг просто попросити друга і не дурити себе, але я думав, що багато таких людей, як я, дивуються, що це за річ, про яку всі говорять.
Бретт,

Відповіді:


136

Втеча з рядка означає зменшення двозначності в лапках (та інших символах), що використовуються в цьому рядку. Наприклад, коли ви визначаєте рядок, ви зазвичай оточуєте його або подвійними лапками, або одинарними лапками:

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


6
Слід зазначити, що виконання екранного ряду для боротьби з проблемами SQL Injection вважається поганою практикою і може призвести до проблем із безпекою, якщо не виконується належним чином (особливо при роботі з певними типами неправильно сформованих багатобайтових атак символів). Будь ласка, ніколи не рятуйтеся з цієї причини і використовуйте замість цього параметризовані запити sql або збережені процедури.
Cheekysoft,

22

Деякі символи мають особливе значення для бази даних SQL, яку ви використовуєте. Коли ці символи використовуються в запиті, вони можуть спричинити несподівану та / або ненавмисну ​​поведінку, включаючи можливість зловмисникові зламати вашу базу даних. Щоб ці символи не впливали на запит таким чином, їх потрібно уникнути або сказати по-іншому, базі даних потрібно сказати, щоб не розглядала їх як спеціальні символи в цьому запиті.

У разі mysql_real_escape_string()воно вислизає \x00, \n, \r, \, ', "і так \x1aяк вони, коли не вдалося уникнути, може призвести до раніше згаданих проблем , які включають SQL ін'єкції з базою даних MySQL.


1

Для простоти ви можете собі уявити зворотну косу риску "\" як команду інтерпретатору під час роботи.

Наприклад, під час інтерпретації цього твердження:

$txt = "Hello world!";

під час фази лексичного аналізу (або коли розколюється заяви на окремі лексеми) вони будуть визначені маркери $, txt, =, ", Hello world!, ", і;

Однак зворотна коса риса всередині рядка спричинить додатковий набір токенів і інтерпретується як команда зробити щось із символом, який відразу ж слідує за ним: наприклад

$txt = "this \" is escaped";

Результати в наступних лексем: $, txt, =, ", this, \, ", is escaped, ", і;

перекладач вже знає (або має попередньо встановлені маршрути, які він може пройти), що робити, виходячи з символу, який переходить до \маркера. Тож у випадку з "цим він продовжує розглядати його як символ, а не як команду кінця рядка.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.