Екраниращи знаци в Php. Екраниране на специални знаци в регулярни изрази

В справочника за регулярни изрази има раздел, наречен "Мета символи (избрани)". Именно за тези мета символи (те се наричат ​​още специални символи) ще говорим в тази статия.

Специални символи са онези знаци, които не са букви или цифри. Тоест това са всички символи, с изключение на букви и цифри.

Специалните знаци включват символи като точка, звездичка, плюс, въпросителен знак, решетка и други.

Както знаем от предишни статии, някои специални символи имат специална роля в регулярните изрази. Тоест, всеки специален символ има някакъв вид представяне.

Например, точка означава абсолютно всеки символ. Звездицата е квантор за повторение от нула до безкрайност. Плюс също е квантификатор на повторенията от едно до безкрайност. Въображаемият символ ^ означава началото на реда, а знакът за долар ($) означава края на реда. Между другото, символът на долара също е въображаем символ. Знаем също, че символът ^ има друга роля, ако го поставим в квадратни скоби. Говорихме за всички тези значения в предишни статии.

В тази статия ще отговоря на въпроса "Как да използваме специални символи в регулярен израз."

За да отмените тази специална роля на специален знак в регулярен израз, е необходимо да го екранирате. По този начин този специален символ ще представлява точно характера, който е. Тоест екранирана точка означава точка, а не някакъв знак. Екранирана звездичка означава звездичка, а не квантор за повторение.

Екранирането се извършва с обратна наклонена черта. Тоест, за да избегнете специален знак, трябва да го предшествате с обратна наклонена черта.

Да кажем, че имаме следната задача: "Проверете дали точката е в края на реда." Така че, за да може тази точка в регулярен израз да бъде точка, а не друг знак, е необходимо да я екранирате.

Var str = "Той е герой."; var reg = /.*\.$/; предупреждение(reg.test(str));// вярно

Както виждаме, резултатът от проверката на низ спрямо регулярен израз е верен. Ако премахнем точката от края на реда, резултатът ще бъде false.

Други специални знаци се екранират по същия начин.

Var str = "x+y=.n*m=/,co\\la"; var reg = /x\+y=\.n\*m=\/,co\\\la/; предупреждение(reg.test(str));// вярно

Тук сме премахнали знаците плюс (\+), точка (\.), звездичка (\*), наклонена черта (\/) и наклонена черта (\\\). Моля, обърнете внимание, че обратна наклонена черта в ред се записва с две обратни наклонени черти. И се екранира в регулярен израз, като също се използват две обратни наклонени черти.

Ако използваме alert за извеждане на низ от променливата str, тогава вместо две обратни наклонени черти ще видим само една.

Всички символи, които са изброени в директорията в раздела за мета-символи, се екранират по подобен начин.

И това е може би всичко. От тази малка статия вече знаете как да избягвате специални символи и как да ги използвате при съставянето на регулярни изрази.

Задачи
  • Да приемем, че трябва да проверим за последователност следния низ "Спечелих $400". Напишете регулярен израз, който проверява за наличието на символ за долар в края на низ. Проверете низа за последователност.
    • Превод
    • Урок

    SQL инжекции, фалшифициране на междусайтови заявки, повреден XML... Страшни, страшни неща, от които всички бихме искали да бъдем защитени, но просто искаме да знаем защо се случва всичко това. Тази статия обяснява основната концепция зад всичко това: низове и обработка на низове в низовете.

    Основният проблем Това е просто текст. Да, само текстът - това е основният проблем. Почти всичко в една компютърна система е представено от текст (който от своя страна е представен от байтове). Възможно ли е едни текстове да са предназначени за компютри, а други за хора. Но и двете си остават текст. За да разберете за какво говоря, ето малък пример:
    Homo Sapiens Да предположим, че има английски текст, който не искам да превеждам на руски
    Няма да повярвате: това е текст. Някои хора го наричат ​​XML, но това е просто текст. Може да не е подходящо за показване на учител по английски, но все пак е само текст. Можеш да го разпечаташ на плакат и да ходиш с него по митинги, можеш да го напишеш в писмо до майка си... текст е.

    Ние обаче искаме определени части от този текст да имат някакво значение за нашия компютър. Искаме компютърът да може да извлече автора на текста и самия текст отделно, за да можем да направим нещо с него. Например, преобразувайте горното в това:
    Да предположим, че има английски текст, който не искам да превеждам на руски от Хомо Сапиенс
    Как компютърът знае как да направи това? Е, защото много удобно опаковахме определени части от текста със специални думи в забавни скоби, като и. След като направихме това, можем да напишем програма, която търси тези специфични части, извлича текста и го използва за някакво наше собствено изобретение.

    С други думи, използвахме определени правила в нашия текст, за да посочим някакво специално значение, което някой друг, следвайки същите правила, може да използва.
    Добре, това не е толкова трудно за разбиране. Ами ако искаме да използваме тези смешни скоби, които имат някакво специално значение в нашия текст, но без да използваме точно това значение?.. Нещо подобно:
    Хомо сапиенс< n and y >
    Знаците "" не са нищо особено. Те могат законно да се използват навсякъде, във всеки текст, както в примера по-горе. Но какво да кажем за нашата идея за специални думи, като? Това означава ли, че това също е някаква ключова дума? В XML - може би да. Или може би не. Това е двусмислено. Тъй като компютрите не са много добри в справянето с неясноти, нещо може да доведе до неочакван резултат, ако сами не поставим точката на i и не разрешим неяснотите.
    Тази дилема може да бъде разрешена чрез замяна на двусмислени символи с нещо недвусмислено.
    Homo Sapiens Основната математика ни казва, че ако x< n and y >n, x не може да бъде по-голямо от y.
    Сега текстът трябва да стане напълно недвусмислен. "".
    Техническото определение на това е екраниране, избягваме специални знаци, когато не искаме те да имат собствено специално значение.
    бягство |iˈskāp| [няма обект ] освобождавам се [ с об. ] да не забелязвам / да не си спомням [...] [ с об. ] IT: причина да се тълкува различно [...]
    Ако определени знаци или поредица от знаци в даден текст имат специално значение, тогава трябва да има правила, които уточняват как да се справят със ситуации, при които тези знаци трябва да се използват, без да се извиква тяхното специално значение. Или, с други думи, бягството отговаря на въпроса: „Ако тези символи са толкова специални, как мога да ги използвам в моя текст?“.
    Както можете да видите в примера по-горе, амперсандът (&) също е специален знак. Но какво, ако искаме да напишем "


    Ако вашите потребители са добри и мили, те ще публикуват цитати от стари философи и съобщенията ще изглеждат по следния начин:

    Публикувано от Plato на 2 януари, 15:31

    Казват, че съм казал „Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.“


    Ако потребителите са умни, те вероятно ще говорят за математика и съобщенията ще бъдат така:

    Публикувано от Pascal на 23 ноември, 04:12

    Основната математика ни казва, че ако x< n and y >n, x не може да бъде по-голямо от y.


    Хм... Пак тия осквернители на нашите скоби. Е, от техническа гледна точка те може да са двусмислени, но браузърът ще ни прости това, нали?


    Добре, СПРИ, какво по дяволите? Някой майтапчия е въвел javascript тагове във вашия форум? Всеки, който гледа това съобщение на вашия сайт, сега изтегля и изпълнява скриптове в контекста на вашия сайт, които могат да правят кой знае какво. И това не е добре.

    Да не се приема буквално В горните случаи искаме по някакъв начин да кажем на нашата база данни или браузър, че това е просто текст, не правете нищо с него! С други думи, ние искаме да "премахнем" специалните значения на всички специални символи и ключови думи от всяка информация, предоставена от потребителя, защото му нямаме доверие. Какво да правя?

    Какво? Какво казваш, момче? О, казвате "екраниране"? И си напълно прав, вземи бисквитка!
    Ако приложим екраниране към потребителските данни, преди да ги обединим със заявката, тогава проблемът е решен. За нашите заявки към базата данни ще бъде нещо като:
    $name = $_POST["име"]; $name = mysql_real_escape_string($name); $query = "SELECT phone_number FROM потребители WHERE name = "$name""; $резултат = mysql_query($заявка);
    Само един ред код, но вече никой не може да "хакне" нашата база данни. Нека да видим отново как ще изглеждат SQL заявките в зависимост от въвеждането на потребителя:
    Алекс
    ИЗБЕРЕТЕ phone_number FROM потребители WHERE име = "Алекс"
    Мак донълдс
    ИЗБЕРЕТЕ phone_number FROM потребители WHERE име = "Mc\"Donalds"
    Джо"; потребители на DROP TABLE; --
    ИЗБЕРЕТЕ phone_number FROM потребители WHERE name = "Joe\"; DROP TABLE потребители; --"
    mysql_real_escape_string безразборно поставя наклонена черта пред всичко, което може да има някакво специално значение.


    Ние прилагаме функцията htmlspecialchars към всички потребителски данни, преди да ги изведем. Сега съобщението на вредителя изглежда така:

    Публикувано от JackTR на 18 юли, 12:56


    Имайте предвид, че стойностите, получени от потребителите, всъщност не са "повредени". Всеки браузър ще анализира това като HTML и ще покаже всичко на екрана в правилната форма.

    Което ни връща към... Всичко по-горе демонстрира проблем, общ за много системи: текстът в текста трябва да бъде екраниран, ако не се предполага, че има специални знаци. Когато поставяте текстови стойности в SQL, те трябва да бъдат екранирани според правилата на SQL. Когато поставяте текстови стойности в HTML, те трябва да бъдат екранирани според правилата на HTML. Когато поставяте текстови стойности в (име на технология), те трябва да бъдат екранирани съгласно правилата (име на технология). Това е всичко. За изчерпателност има, разбира се, други начини за справяне с въведеното от потребителя, което може или не може да съдържа специални знаци:
    • Валидиране
      Можете да проверите дали въведеното от потребителя отговаря на дадена спецификация. Ако искате да се въведе число и потребителят въведе нещо друго, програмата трябва да информира потребителя и да отмени въвеждането. Ако всичко това е организирано правилно, тогава няма риск от улавяне на „DROP TABLE потребители“, където потребителят е трябвало да въведе „42“. Това не е много практично за избягване на HTML/SQL инжекции, защото... Често трябва да приемете текст в свободен формат, който може да съдържа трикове. Обикновено валидирането се използва в допълнение към други мерки.
    • Саниране
      Можете също така „тихо“ да премахнете всички символи, които смятате за опасни. Например, просто премахнете всичко, което изглежда като HTML таг, за да избегнете добавянето към вашия форум. Проблемът е, че можете да премахнете напълно законни части от текста.
      Подготвени SQL оператори
      Има специални функции, които правят това, което искахме: карат базата данни да разбере разликите между самата SQL заявка и информацията, предоставена от потребителите. В PHP те изглеждат по следния начин:
      $stmt = $pdo->prepare("ИЗБЕРЕТЕ phone_number FROM потребители WHERE име =?"); $stmt->изпълни($_POST["име"]);
      В този случай изпращането се извършва на два етапа, като се прави ясно разграничение между заявката и променливите. Базата данни има способността първо да разбере структурата на заявката и след това да я попълни със стойности.

    • В реалния свят всички те се използват заедно за различни нива на защита. Винаги трябва да използвате проверка, за да сте сигурни, че потребителят въвежда правилните данни. След това можете (но не сте длъжни) да сканирате въведените данни. Ако потребител очевидно се опитва да ви продаде някакъв скрипт, можете просто да го изтриете. След това винаги, винаги трябва да избягвате потребителските данни, преди да ги поставите в SQL заявка (същото важи и за HTML).

    3.1 Премахване на специални знаци

    Преди да предадете стойностите на променливите на формата в SQL заявки, трябва специално да избегнете някои знаци в тях (по-специално апостроф), например, да поставите обратна наклонена черта пред тях. Функцията за вмъкване е:

    mysql_escape_string()

    низ mysql_escape_string(низ $str)

    Функцията е подобна на другата функция addslashes(), но добавя наклонени черти преди по-пълен набор от специални знаци. Практиката показва, че за текстови данни можете да използвате функцията addslashes() вместо mysql_escape_string(). Това се прави в много скриптове.

    Съгласно стандарта MySQL символите, които са написани в PHP, както следва: "\x00", "\n", "\r", "\\", """, "" и "\x1A" се екранират.

    Това число включва знак с ASCII код нула и следователно mysql_escape_string() може да се използва не само за текст, но и за двоични данни. Можете например да прочетете GIF изображение в променлива (функция file_get_contents()) и след това да го вмъкнете в базата данни, като преди това сте екранирали всички специални знаци. Когато бъде извлечено, изображението ще се появи в същата форма, в която е било първоначално.

    Ескейпирането на знаци е просто начин за писане на правилни SQL изрази, нищо повече. Нищо не се случва с данните и те се съхраняват в базата данни без допълнителни наклонени черти - точно както изглеждаше първоначално, дори преди бягството.

    Използвайки mysql_escape_string(), предишният код на заявката изглежда така:

    "ИЗТРИВАНЕ ОТ таблица WHERE name="".mysql_escape_string($name).""");

    Той е дълъг, тромав и грозен.


    3.2 Шаблони за заявки и контейнери

    Нека разгледаме друго решение.

    Вместо изрично екраниране и вмъкване на променливи в заявката, на тяхно място се поставят специални маркери (заместители), обикновено изглеждащи като ?.

    Същите стойности, които ще бъдат заменени вместо това, се предават отделно като допълнителни параметри.

    Използвайки хипотетичната функция mysql_qwo, чийто код ще бъде представен по-долу, предишната заявка може да бъде пренаписана, както следва:

    mysql_qw("ИЗТРИВАНЕ ОТ таблица WHERE име=?", $име);

    Заявката стана по-кратка и по-добре защитена: сега, когато пишем код, няма да можем случайно да пропуснем извикване на функцията mysql_escape_string() и по този начин да се попаднем на трик на хакер. Всички трансформации се извършват автоматично, вътре във функцията.

    Списъкът lib_mysql_qw.php съдържа най-простата реализация на функцията mysql_qw() (qw означава обвивка на заявка).

    Има и библиотека lib/Placeholder.php, която предоставя много по-мощна поддръжка за езика на контейнерите: http://dklab.ru/chicken/30.html.

    В повечето ситуации възможностите, предоставени от функцията mysql_qw(), са достатъчни.

    Списък на lib_mysql_qw.php



    Свързани публикации