Php qaçış simvolları. Normal ifadələrdə xüsusi simvollardan qaçmaq

Normal ifadə arayış kitabında "Meta simvollar (qaçan)" adlı bölmə var. Bu məqalədə danışacağımız bu meta simvollardır (onlara xüsusi simvollar da deyilir).

Xüsusi simvollar hərf və ya rəqəm olmayan simvollardır. Yəni bunlar hərf və rəqəmlərdən başqa bütün simvollardır.

Xüsusi simvollara nöqtə, ulduz, üstəgəl, sual işarəsi, hash işarəsi və başqaları kimi simvollar daxildir.

Əvvəlki məqalələrdən bildiyimiz kimi, müntəzəm ifadələrdə bəzi xüsusi simvolların xüsusi rolu var. Yəni hər bir xüsusi xarakterin bir növ təmsili var.

Məsələn, nöqtə tamamilə hər hansı bir simvol deməkdir. Ulduz işarəsi sıfırdan sonsuzluğa qədər təkrarlanan kəmiyyət göstəricisidir. Plus eyni zamanda birdən sonsuzluğa qədər təkrarların kəmiyyət göstəricisidir. Xəyali ^ simvolu xəttin başlanğıcını, dollar işarəsi ($) isə xəttin sonunu bildirir. Yeri gəlmişkən, dollar simvolu da xəyali simvoldur. Biz onu da bilirik ki, ^ simvolunu kvadrat mötərizədə qoysaq, başqa bir rolu var. Bütün bu mənalar haqqında əvvəlki yazılarımızda danışdıq.

Bu yazıda “Normal ifadədə xüsusi simvollardan necə istifadə etmək olar” sualına cavab verəcəyəm.

Normal ifadədə xüsusi simvolun bu xüsusi rolunu ləğv etmək üçün ondan qaçmaq lazımdır. Beləliklə, bu xüsusi xarakter tam olaraq olan xarakteri təmsil edəcəkdir. Yəni qaçan nöqtə nöqtə deməkdir, hər hansı bir simvol deyil. Qaçan ulduz işarəsi təkrar kəmiyyət göstəricisi deyil, ulduz işarəsi deməkdir.

Qaçma tərs kəsişmə ilə həyata keçirilir. Yəni, xüsusi xarakterdən qaçmaq üçün ondan əvvəl tərs xətt çəkmək lazımdır.

Tutaq ki, qarşımızda aşağıdakı tapşırıq var: "Nöqtənin xəttin sonunda olub-olmadığını yoxlayın." Deməli, nizamlı ifadədəki bu nöqtənin başqa hər hansı bir simvol deyil, nöqtə olması üçün ondan qaçmaq lazımdır.

Var str = "O, qəhrəmandır."; var reg = /.*\.$/; alert(reg.test(str));// doğru

Gördüyümüz kimi, sətirin nizamlı ifadə ilə yoxlanmasının nəticəsi doğrudur. Sətirin sonundan nöqtəni çıxarsaq, nəticə yalan olacaq.

Digər xüsusi simvollar eyni şəkildə qaçır.

Var str = "x+y=.n*m=/,co\\la"; var reg = /x\+y=\.n\*m=\/,co\\\la/; alert(reg.test(str));// doğru

Burada artı (\+), nöqtə (\.), ulduz (\*), irəli slash (\/) və tərs kəsik (\\\) simvollarından qaçdıq. Diqqət yetirin ki, sətirdəki tərs kəsik iki əks kəsiklə yazılır. Və o, müntəzəm ifadədə qaçır, həmçinin iki əks xətt istifadə edir.

Əgər str dəyişənindən sətir çıxarmaq üçün alert istifadə etsək, onda iki əks kəsik əvəzinə yalnız birini görəcəyik.

Kataloqda meta-simvollar bölməsində qeyd olunan bütün simvollar oxşar şəkildə qaçır.

Və yəqin ki, hamısı budur. Bu kiçik məqalədən siz artıq xüsusi simvollardan necə qaçacağınızı və onlardan müntəzəm ifadələr tərtib edərkən necə istifadə edəcəyinizi bilirsiniz.

Tapşırıqlar
  • Tutaq ki, aşağıdakı "Mən $400 qazandım" sətirinin uyğunluğunu yoxlamaq lazımdır. Sətirin sonunda dollar simvolunun olub olmadığını yoxlayan müntəzəm ifadə yazın. Ardıcıllıq üçün simi yoxlayın.
    • Tərcümə
    • Dərslik

    SQL inyeksiyaları, saytlararası sorğu saxtakarlığı, pozulmuş XML... Qorunmaq istədiyimiz qorxulu, qorxulu şeylər, ancaq bunların niyə baş verdiyini bilmək istəyirik. Bu məqalə bütün bunların arxasında duran əsas konsepsiyanı izah edir: sətirlər və sətirlər içərisində sətirlərin idarə olunması.

    Əsas problem sadəcə mətndir. Bəli, sadəcə mətn - əsas problem budur. Kompüter sistemində demək olar ki, hər şey mətnlə təmsil olunur (bu da öz növbəsində baytlarla təmsil olunur). Ola bilərmi ki, bəzi mətnlər kompüterlər üçün, digərləri isə insanlar üçün nəzərdə tutulub. Lakin onların hər ikisi hələ də mətn olaraq qalır. Nə danışdığımı başa düşmək üçün kiçik bir nümunə:
    Homo Sapiens Tutaq ki, rus dilinə tərcümə etmək istəmədiyim ingilis mətni var.
    İnanmayacaqsınız: bu mətndir. Bəzi insanlar bunu XML adlandırırlar, lakin bu, sadəcə mətndir. İngilis dili müəlliminə göstərmək üçün uyğun olmaya bilər, amma yenə də sadəcə mətndir. Afişada çap edib onunla mitinqlərə çıxa bilərsən, anana məktubda yaza bilərsən... mətndir.

    Bununla belə, bu mətnin müəyyən hissələrinin kompüterimiz üçün müəyyən məna kəsb etməsini istəyirik. İstəyirik ki, kompüter mətnin müəllifini və mətnin özünü ayrıca çıxara bilsin ki, onunla nəsə edə bilək. Məsələn, yuxarıdakıları buna çevirin:
    Tutaq ki, Homo Sapiens tərəfindən rus dilinə tərcümə etmək istəmədiyim ingiliscə mətn var.
    Kompüter bunu necə edəcəyini necə bilir? Yaxşı, çünki mətnin müəyyən hissələrini və kimi komik mötərizədə xüsusi sözlərlə çox rahat şəkildə bükdük. Bunu etdikdən sonra biz bu xüsusi hissələri axtaran, mətni çıxaran və öz ixtiralarımız üçün istifadə edən proqram yaza bilərik.

    Başqa sözlə, biz mətnimizdə başqasının eyni qaydalara əməl edərək istifadə edə biləcəyi bəzi xüsusi mənaları göstərmək üçün müəyyən qaydalardan istifadə etdik.
    Yaxşı, bunu başa düşmək o qədər də çətin deyil. Mətnimizdə müəyyən məna kəsb edən, lakin bu mənadan istifadə etmədən bu gülməli mötərizələrdən istifadə etmək istəsək necə olar?.. Belə bir şey:
    Homo Sapiens< n and y >
    "" simvolları xüsusi bir şey deyil. Onlar qanuni olaraq yuxarıdakı nümunədə olduğu kimi istənilən yerdə, istənilən mətndə istifadə oluna bilər. Bəs bizim xüsusi sözlər haqqında fikrimiz necədir? Bu o deməkdirmi ki, o da bir növ açar sözdür? XML-də - bəlkə də bəli. Və ya bəlkə də yox. Bu birmənalı deyil. Kompüterlər qeyri-müəyyənliklərin öhdəsindən gəlməkdə çox yaxşı olmadığından, əgər biz özümüz i-yə nöqtə qoymasaq və qeyri-müəyyənlikləri həll etməsək, nəsə gözlənilməz nəticə verə bilər.
    Bu dilemmanı birmənalı olmayan simvolları birmənalı olmayan bir şeylə əvəz etməklə həll etmək olar.
    Homo Sapiens Əsas riyaziyyat bizə deyir ki, əgər x< n and y >n, x y-dən böyük ola bilməz.
    İndi mətn tamamilə birmənalı olmalıdır. "".
    Bunun texniki tərifi belədir qoruyucu, biz xüsusi simvolların öz xüsusi mənalarının olmasını istəmədiyimiz zaman qaçırıq.
    escape |iˈskāp| [obj yoxdur. ] azad [obj ilə. ] fərq etməmək / xatırlamamaq [...] [ obj ilə. ] İT: fərqli şərh edilmək üçün bir səbəb [...]
    Əgər mətndə müəyyən simvollar və ya simvol ardıcıllığı xüsusi məna daşıyırsa, o zaman həmin simvolların xüsusi mənasına istinad etmədən istifadə edilməli olduğu vəziyyətlərin necə idarə olunacağını müəyyən edən qaydalar olmalıdır. Və ya başqa sözlə, qaçmaq suala cavab verir: "Əgər bu simvollar çox xüsusidirsə, mən onları mətnimdə necə istifadə edə bilərəm?".
    Yuxarıdakı nümunədə gördüyünüz kimi, ampersand (&) də xüsusi simvoldur. Bəs yazmaq istəsək nə olacaq”


    İstifadəçiləriniz yaxşı və mehribandırsa, köhnə filosoflardan sitatlar göndərəcəklər və mesajlar belə görünəcək:

    Platon tərəfindən 2 yanvar, 15:31-də göndərildi

    Mən dedim ki, "Əlbəttə, adipisicing elit, sed do eiusmod tempor incididunt ut worke and doore magna aliqua. Bu, ən azı, ən azı, heç bir işin yerinə yetirilməməsidir."


    İstifadəçilər ağıllıdırsa, yəqin ki, riyaziyyatdan danışacaqlar və mesajlar belə olacaq:

    Paskal tərəfindən 23 noyabr, 04:12-də yazıldı

    Əsas riyaziyyat bizə deyir ki, əgər x< n and y >n, x y-dən böyük ola bilməz.


    Hmm... Yenə bu mötərizəmizi ləkələyənlər. Yaxşı, texniki baxımdan onlar qeyri-müəyyən ola bilər, amma brauzer bunun üçün bizi bağışlayacaq, elə deyilmi?


    Yaxşı, STOP, nə cəhənnəm? Bəzi prankster forumunuza javascript teqlərini təqdim etdi? Saytınızda bu mesaja baxan hər kəs indi saytınızın kontekstində kimin nə edə biləcəyini bilən skriptləri yükləyir və icra edir. Və bu yaxşı deyil.

    Hərfi mənada qəbul edilməməlidir. Yuxarıdakı hallarda biz birtəhər DB və ya brauzerimizə bunun sadəcə mətn olduğunu bildirmək istəyirik, onunla heç nə etməyin! Başqa sözlə, biz ona etibar etmədiyimiz üçün istifadəçinin təqdim etdiyi hər hansı məlumatdan bütün xüsusi simvolların və açar sözlərin xüsusi mənalarını “çıxarmaq” istəyirik. Nə etməli?

    Nə? Nə deyirsən, oğlan? Oh, "qoruyucu" deyirsən? Və tamamilə haqlısınız, bir peçenye götürün!
    Əgər istifadəçi məlumatlarını sorğu ilə birləşdirməzdən əvvəl ona qaçış tətbiq etsək, problem həll olunur. Verilənlər bazası sorğularımız üçün belə bir şey olardı:
    $name = $_POST["ad"]; $name = mysql_real_escape_string($name); $query = "İstifadəçilərdən telefon_nömrəsini SEÇİN HARADA ad = "$name""; $nəticə = mysql_query($query);
    Sadəcə bir kod sətri, amma indi heç kim bizim verilənlər bazamızı "sındıra" bilməz. İstifadəçi girişindən asılı olaraq SQL sorğularının necə görünəcəyinə bir daha baxaq:
    Alex
    İSTİFADƏÇİLƏRDƏN telefon_nömrəsini SEÇİN HARADA ad = "Alex"
    Mc Donalds
    İSTİFADƏÇİLƏRDƏN telefon_nömrəsini SEÇİN HARADA adı = "Mc\"Donalds"
    Joe"; DROP TABLE istifadəçiləri; --
    İstifadəçilərdən telefon_nömrəsini SEÇİN HERADƏ adı = "Joe\"; DROP TABLE istifadəçiləri; --"
    mysql_real_escape_string fərq qoymadan hansısa xüsusi mənası ola biləcək hər hansı bir şeyin önünə slash işarəsi qoyur.


    Biz htmlspecialchars funksiyasını çıxarmazdan əvvəl bütün istifadəçi məlumatlarına tətbiq edirik. İndi zərərvericinin mesajı belə görünür:

    18 iyul, 12:56-da JackTR tərəfindən göndərildi


    Qeyd edək ki, istifadəçilərdən alınan dəyərlər əslində "pozulmayıb". İstənilən brauzer bunu HTML kimi təhlil edəcək və ekranda hər şeyi düzgün formada göstərəcək.

    Bu bizi geri gətirir... Yuxarıda göstərilənlərin hamısı bir çox sistemlər üçün ümumi olan problemi nümayiş etdirir: mətndə xüsusi simvolların olması lazım deyilsə, mətndən qaçmaq lazımdır. SQL-də mətn dəyərləri yerləşdirərkən, SQL qaydalarına uyğun olaraq onlardan qaçmaq lazımdır. HTML-də mətn dəyərləri yerləşdirərkən, HTML qaydalarına uyğun olaraq onlardan qaçmaq lazımdır. Mətn dəyərlərini (texnologiya adı) yerləşdirərkən (texnologiya adı) qaydalara uyğun olaraq onlardan qaçmaq lazımdır. Tamlıq üçün, əlbəttə ki, xüsusi simvollar ehtiva edən və ya olmayan istifadəçi girişi ilə məşğul olmağın başqa yolları da var:
    • Doğrulama
      İstifadəçi daxiletməsinin müəyyən bir spesifikasiyaya uyğun olub olmadığını yoxlaya bilərsiniz. Əgər nömrənin daxil edilməsini tələb etsəniz və istifadəçi başqa bir şey daxil edərsə, proqram istifadəçiyə məlumat verməli və daxiletməni ləğv etməlidir. Bütün bunlar düzgün təşkil olunarsa, o zaman istifadəçinin "42" daxil etməli olduğu yerdə "DROP TABLE istifadəçilərini" tutmaq riski yoxdur. Bu HTML/SQL inyeksiyalarından qaçmaq üçün çox praktik deyil, çünki... Çox vaxt hiylələr ola bilən sərbəst formatlı mətni qəbul etməlisiniz. Tipik olaraq, təsdiqləmə digər tədbirlərə əlavə olaraq istifadə olunur.
    • Sanitarizasiya
      Siz həmçinin təhlükəli hesab etdiyiniz simvolları “sakitcə” silə bilərsiniz. Məsələn, forumunuza əlavə olunmamaq üçün sadəcə olaraq HTML etiketinə bənzəyən hər şeyi silin. Problem ondadır ki, mətnin mükəmməl qanuni hissələrini silə bilərsiniz.
      Hazırlanmış SQL ifadələri
      İstədiyimizi yerinə yetirən xüsusi funksiyalar var: verilənlər bazasına SQL sorğusunun özü ilə istifadəçilərin təqdim etdiyi məlumatlar arasındakı fərqləri başa düşməsini təmin edin. PHP-də onlar belə görünür:
      $stmt = $pdo->hazırlamaq("İstifadəçilərdən telefon_nömrəsini SEÇİN HARADA adı =?"); $stmt->execute($_POST["ad"]);
      Bu halda göndərmə sorğu və dəyişənlər arasında aydın şəkildə fərqləndirilməklə iki mərhələdə baş verir. Verilənlər bazası əvvəlcə sorğunun strukturunu başa düşmək və sonra onu dəyərlərlə doldurmaq qabiliyyətinə malikdir.

    • Real dünyada bunların hamısı müxtəlif səviyyəli qorunma üçün birlikdə istifadə olunur. İstifadəçinin düzgün məlumatları daxil etdiyinə əmin olmaq üçün həmişə doğrulamadan istifadə etməlisiniz. Daha sonra daxil edilmiş məlumatları skan edə bilərsiniz (lakin tələb olunmur). Əgər istifadəçi açıq şəkildə sizə hansısa skript satmağa çalışırsa, onu sadəcə silə bilərsiniz. Bundan sonra, siz həmişə istifadəçi məlumatlarını SQL sorğusuna qoymazdan əvvəl qaçmalısınız (eyni şey HTML üçün də gedir).

    3.1 Xüsusi simvollardan qaçmaq

    Forma dəyişənlərinin dəyərlərini SQL sorğularına ötürməzdən əvvəl, onlarda bəzi simvollardan (xüsusilə, apostrofdan) xüsusi olaraq qaçmaq lazımdır, məsələn, onların qarşısına tərs xətt qoymalısınız. Daxil etmək funksiyası belədir:

    mysql_escape_string()

    string mysql_escape_string(string $str)

    Funksiya digər addslashes() funksiyasına bənzəyir, lakin o, xüsusi simvolların daha tam dəstindən əvvəl kəsik işarələri əlavə edir. Təcrübə göstərir ki, mətn məlumatları üçün mysql_escape_string() əvəzinə addslashes() funksiyasından istifadə edə bilərsiniz. Bu, bir çox skriptdə edilir.

    MySQL standartına görə, PHP-də aşağıdakı kimi yazılan simvollar: "\x00", "\n", "\r", "\\", """, "" və "\x1A" qaçırılır.

    Bu nömrəyə ASCII kodu sıfır olan simvol daxildir və buna görə də mysql_escape_string() yalnız mətn üçün deyil, həm də ikili verilənlər üçün istifadə edilə bilər. Siz, məsələn, GIF şəklini dəyişənə (file_get_contents() funksiyası) oxuya və sonra bütün xüsusi simvollardan qaçaraq onu verilənlər bazasına daxil edə bilərsiniz. Çıxarılan zaman şəkil ilkin olduğu formada görünəcək.

    Simvollardan qaçmaq yalnız düzgün SQL ifadələrini yazmaq üçün bir yoldur, başqa heç nə yoxdur. Verilənlərə heç nə baş vermir və o, verilənlər bazasında əlavə kəsiklər olmadan saxlanılır - ilkin göründüyü kimi, hətta qaçmazdan əvvəl.

    mysql_escape_string() istifadə edərək əvvəlki sorğu kodu belə görünür:

    "DELETE FROM table FROM WHERE name="".mysql_escape_string($name).""");

    Uzun, səliqəsiz və çirkindir.


    3.2 Sorğu şablonları və yer tutucular

    Başqa bir həll yolu nəzərdən keçirək.

    Sorğuya açıq şəkildə qaçmaq və dəyişənləri daxil etmək əvəzinə, onların yerinə adətən ? kimi görünən xüsusi markerlər (yer tutucular) yerləşdirilir.

    Əvəz ediləcək eyni dəyərlər əlavə parametrlər kimi ayrıca ötürülür.

    Kodu aşağıda təqdim olunacaq hipotetik mysql_qwo funksiyasından istifadə edərək əvvəlki sorğu aşağıdakı kimi yenidən yazıla bilər:

    mysql_qw("Adı= HARADA Cədvəldən SİLİN?", $adı);

    Sorğu daha qısaldı və daha yaxşı qorundu: indi kod yazarkən biz təsadüfən mysql_escape_string() funksiyasına edilən zəngi qaçıra bilməyəcəyik və beləliklə, haker hiyləsinə düçar ola bilməyəcəyik. Bütün çevrilmələr avtomatik olaraq funksiya daxilində baş verir.

    lib_mysql_qw.php siyahısı mysql_qw() funksiyasının ən sadə icrasını ehtiva edir (qw sorğu paketi deməkdir).

    Yer tutucuların dili üçün daha güclü dəstək verən lib/Placeholder.php kitabxanası da var: http://dklab.ru/chicken/30.html.

    Əksər hallarda mysql_qw() funksiyasının təmin etdiyi imkanlar kifayətdir.

    lib_mysql_qw.php siyahısı



    Əlaqədar nəşrlər