internet pencereler Android
Genişletmek

Karakterlerin taranması. Düzenli ifadelerde hangi özel karakterlerden korunmalı? HTML'de koruma nedir

Genellikle programlama dilleri, metin komutu arayüzleri, metin işaretleme dilleri (HTML, Tex, Wiki-Markup), bazı karakterlerin (ve kombinasyonlarının) kullanıldığı yapılandırılmış metinle ele alınır. yönetici, metnin kontrol yapısı dahil. Böyle bir sembolün "geleneksel bir dil sembolü" olarak kullanmanın gerekli olduğu bir durumda koruyucu.

Koşulsal olarak koruyucu üç türe ayrılabilir:

  • tek sembol koruma
  • "Koruyucu Koruyucu" sembol sekansını kullanarak bir grup karakteri tarama, "Bitiş Koruyucu"
  • korumalı metnin başlangıcına ayarlanan "Koruyucu Koruyucu" komut dizisini ve "Koruyucu Kalkanın Sonu" sembolünü kullanarak.

Güvenlik açığının nedeni olarak koruyucu eksikliği

Sembol Ekranlama, yapısal metin otomatik olarak üretildiğinde özel dikkat çeker. Keyfi dize verilerinin dahil edilmesi, içindeki kontrol karakterlerinin zorunlu korumasını içerir. Aynı zamanda, çok sık, bu tür karakterlerin gerçek çizgileri, programcının bu işlemi hiç atlamasını ve "herhangi bir makul" dize verileri ile doğru şekilde çalıştırılan basit bir programı almasını sağlar. Bununla birlikte, böyle basitleştirilmiş bir kodun gizli bir güvenlik açığı vardır, çünkü üçüncü taraf bir kişi (string verilerinin yazarı) yetkisiz bir etki olasılığını alır. yapı Oluşturulan metin. Oluşturulan metin birinin programı ise, güvenlik açığı ciddi hale gelir. Geleneksel olarak, bu tür problemler SQL dillerine (bkz. SQL-Injection) ve HTML'ye tabidir (bkz. SCRS sitesi komut dosyası).

Örnek

Tek sembol koruma

  • SI programlama dilinde, çizgilerin içinde, karakterlerin taranması "" Korumalı sembolden önce yerleştirilmiş "" sembolü kullanılarak gerçekleştirilir. (Aynı zamanda, "\\" sembolü, bir Bexlesh'i çıkarmak için bir kombinasyonun kendisini koruyabilir, yani bir Bexlesh'i çıkarmak için kullanılır), aynı sembol, UNIX komut isteminde karakterleri korumak için aynı sembol kullanılır.
  • Microsoft Windows komut isteminde, karakterlerin karakter kısmının taranması, korumalı sembolün önüne yerleştirilmiş "^" sembolü kullanılarak gerçekleştirilir.

Sembollerin korunma grubu

  • Python programlama dilinde, dizgedeki sembol grubunun taranması, R harfinin (İngilizce'den. RAW-RAW) dizenin önündeki harfi göstererek yapılır, yani karakterler diziler tarafından korunur. r "korumalı Metin "
  • Wiki-Markup Metin Ekranlaması, Pseudo'nun yardımıyla gerçekleştirilir. ve . PseudoTeg'i yazmanız gerekiyorsa , bu, ikamenin sembolleriyle yapılır ( ).

Final sembolü ile koruyucu metin

Metinde birçok kontrol karakteri olduğunda, birçok koruma işareti olacaktır, metin ağır olur. Bu gibi durumlarda, son metin ile alternatif bir ekranlama yöntemi kullanılır. Bu durumda, tüm kontrol karakterleri semboller olacaktır (kontrol fonksiyonunu taşımayın) ve derleyici derleyici bir dizi dizi tespit ettiğinde - metin sona erer.

Denemeler olmadan ne zaman ve ne kaçınacağınızı anlamak için, dizginin geçtiği bağlam zincirini doğru bir şekilde anlamanız gerekir. En uzun taraftan nihai varış noktasına bir dize belirleyeceksiniz, bu da normal ifade sözdizimsel analiz kodu tarafından işlenen hafıza.

Dizenin hafızada nasıl işlendiğini unutmayın: kodun içinde basit bir çizgi veya komut satırına girilen bir dize olabilir, ancak bir etkileşimli komut satırı veya kabuk komut dosyası dosyasında belirtilen bir komut satırı olabilir veya Kod tarafından belirtilen bellek değişkeninin içinde veya (string) bir başka değerlendirme ile veya herhangi bir kapsülleme ile dinamik olarak oluşturulan kodu içeren bir dize ...

Bu bağlamın her biri özel işlevselliğe sahip birkaç karakter atanır.

Sembolü, özel işlevini kullanmadan ifade etmek istiyorsanız (bağlam için yerel), daha sonra bu durumda, bir sonraki bağlam için korunmalısınız ..., ayrıca gerekli olabilecek diğer bazı kaçış karakterlerine ihtiyaç duyabilecek bazı kaçış karakterlerine ihtiyaç duyabilir. Önceki bağlam (OH). Buna ek olarak, sembol kodlaması gibi şeyler olabilir (en sinsi UTF-8, çünkü ortak semboller için ASCII'ye benziyor, ancak aynı zamanda ayarlarına bağlı olarak terminal tarafından bile yorumlanabilir, böylece farklı davranabilir, böylece HTML / XML kodlama özniteliği, işlemin doğru anlaşılması için gereklidir.

Örneğin, perl -npe ile başlayan komut satırında düzenli bir ifade, Dosyayı işleyen bir kanal olarak, bu Exec Sisteminin her biri ayrılmış bir argüman listesine sahip olan bir kanal olarak, Exec System Call Set'e aktarılmalıdır. (korumalı değil) boşluklar ve belki kanallar (|) ve yeniden yönlendirme (\u003e n\u003e n\u003e up), parantez, etkileşimli uzatma * ve? , $ (()) ... (Bütün bunlar, aşağıdaki bağlamda düzenli bir ekspresyon sembolüne müdahale etmek gibi görünen * SH tarafından kullanılan özel karakterlerdir, ancak sırayla tahmin edilirler: Komut satırından önce. Program tarafından Bash / SH / CSH / TCSH / ZSH olarak okuyun, esasen bir çift tırnak içine alınmış hücre veya tek bir teklif içinde, koruma daha kolaydır, ancak komut satırında komut satırında bir satır oluşturmaya gerek yoktur, çünkü çoğunlukla Boşluk, ters bir örgü özelliği ve teklifi ile başlamalı, gerek yoktur, karakterler için açıklamanın işlevselliğini bırakmalıdır * ve?, ancak aynı bağlamı tırnak içinde analiz eder. Ardından, komut satırını değerlendirirken, hafızada elde edilen normal ifade (Komut satırına kaydedildiği gibi değil) aynı işlemi kaynak dosyadaki gibi alır. Square Backets'te düzenli ifade için, bir sembol seti bağlamı var, normal bir perl ifadesi, alfa-sayısal olmayan bir karakter kümesine yerleştirilebilir. (Örneğin, m // il ve m: / daha iyi / için / yol: ...).

Karakterler hakkında, normal ifadenin nihai bağlamı için çok özel olan farklı bir yanıtta daha fazla ayrıntı var. Daha önce de belirttiğim gibi, RegeXP'nin, muhtemelen başka bir bağlamın, deneme hafızanızı yapılandıran başka bir karakter kümesine sahip olması nedeniyle, girişimlerde bulunduğundan, (genellikle ters eğik çizgi bu diğerlerinde kullanılan bir semboldür) işlevi yerine gerçek bir sembolü korumak için bağlam.).

Not: Sitenin adaptif versiyonu etkinleştirilir, bu da tarayıcınızın küçük boyutuna otomatik olarak ayarlanır ve okumak için bazı site ayrıntılarını gizler. Mutlu görüntüleme!

Sitelerin başarılı bir şekilde yaratılış ve tanıtımının tüm inceliklerine adanmış blog sayfalarındaki herkesi tekrar karşıladığıma memnun oldum - Site. ON! Günümüzün PHP dersinde, aşağıdaki gibi konulara dokunacağız.

Değişken çeşitleri

PHP'nin sekiz farklı türde değişken vardır.

4 Skaler Çeşitleri:

  • boolean (Boolean veya Mantık Tipi)
  • tamsayı (tamsayılar)
  • Şamandıra (kayan nokta numarası)
  • dize

2 karışık tip:

  • dizi (dizi)
  • nesne (nesne)

2 Özel tür:

  • kaynak

Her türün dikkate alınmasına devam etmeden önce, PHP'nin kesinlikle yazılı olmayan bir dil değil, dinamik yazarak bir dil olduğunu açıklığa kavuşturmaya değer. Bu, her değişkenin türünü bildirmek için önceden (oluştururken) ihtiyacımız olmadığı anlamına gelir. PHP, bu değişkene koyduğumuz gerçeğine dayanarak, hangi tür bir veya başka bir değişken olduğunu tahmin eder. Aynı zamanda, katı tiptasyonlara sahip dillerin aksine, değişkende sayıyı (tamsayısı) çekip diziyi (string) yapıp bir hata olmayacak şekilde ifade edilmesi anlamına gelir. Bu, daha önce programlama ile uğraşmayan insanlara (acemi) gibi olan PHP'nin özelliklerinden biridir. Kural olarak, sonunda, herkes eksi dili olduğu gerçeğine gelir ve artı değil.

Boolean (mantıksal) - En basit tip. Sadece 2 değer alabilir: doğru. veya yanlış (Sağ veya yanlış), bağımsız olarak kayıtlıdır (doğru, doğru vb.).). Görsel Örnek:

echo $ ismi "
", $ İsim2;?\u003e

Sonuç:

Gördüğünüz gibi, tarayıcı, PHP'nin aksine, bu yüzden türetmeye çalışırken, Boolean türünü anlamıyor. doğru. veya yanlış Numarayı gösterecek 1 veya boş dize.

Mantıksal türe dönüştürülürken, aşağıdaki değerler yanlış olarak ele alınır:

  • bütün 0 (sıfır)
  • kayan nokta 0.0 (sıfır)
  • boş dize ve string "0" veya "0"
  • boş dizi
  • Özel tip null (tanımlanamayan değişkenler dahil)

Diğer tüm değerler doğru muamele edilir.

// ondalık sayı $ int \u003d -5; // negatif bir sayı $ int \u003d 05; // oktal sayı $ int \u003d 0x1a; // hexadecimal sayı
// yüzen nokta numaraları (gerçek): $ Flt \u003d 1.4; $ Flt \u003d 1.2e3; $ FLT \u003d 7E-10; ?\u003e

Bununla birlikte, PHP'deki en yaygın kullanılan tip dikkate alınabilir dizeler (Dize). Satırlar, tek veya çift tırnaklarda kaydedilebilir, ancak bir PHP tercümanı "Puro" dize değişkenlerinin varlığı için bir PHP yorumlayıcısı "Puro" yaptığınız gibi, çift tırnak içine yazmanıza asla tavsiye edilmemiz, ancak hafifçe, ancak yavaş olsa da aşağı iş. Satırınızda değişkenleri kullanmak isteseniz bile - bu, tek tırnak + (bir veya daha fazla satırı birleştirerek) kullanılarak yapılabilir. Neden o zaman çift tırnak hiç gerekiyor? Örneğin, Specialimwills (\\ n, \\ r, vb.) Kullanmak istediğimizde, ancak bir süre sonra onlar hakkında.

Aynı zamanda bu kullanımın dikkatini çekmeye değer tek tırnaklar + birleştirme Kodu, her şeyin astarlanmasından çok daha okunabilir hale getirir. Ama yeterli ön teklif, şimdi her şeyi kendiniz görecek ve anlayacaksınız:

$ Number \u003d 2; // integer $ hand1 \u003d "İnsanlarda ellerin sayısı:"; // string + değişkenler için kişi yapmak $ HACT2 \u003d "İnsan eli:"; // string
// bu satırlara değişken bir $ numara ekleyin: $ HAP1 \u003d "İnsanlarda El Sayısı: $ Numarası ve Hala Metin ..."; // $ Hand2 \u003d "Bir kişide el sayısı) tavsiye etmiyorum:". $ Number. "Ve hala metin ..."; // önermek!
echo $ hand1, "
", $ Hand2;?\u003e

Sonuç:

Bir sonraki makalede birleştirme hakkında daha fazla konuşacağız.

  • sabit bir şekilde atandı BOŞ.
  • henüz hiçbir anlam ifade edilmedi.
  • kullanılarak kaldırıldı unsem ()

Bu aşamadaki kalan değişken türlerinin incelenmesi anlamsız olacaktır. Türlerin geri kalanıyla, onları daha derin bir PHP çalışmasıyla çarpışacağız ve ayırt edeceğiz.

PHP'de koruma.

Ve ne çizgimizdeki değişkenin değerini almak istememsek, ancak tam anlamıyla $ numara yazmak istiyor muyuz? İki seçenek düşünün:

$ HAP1 \u003d "İnsanlarda El Sayısı: \\ $ Numarası ve Hala Metin ..."; // $ Hand2 \u003d "İnsanlarda El Sayısı: $ Numarası ve Hala Metin ..."; // önermek!
echo $ hand1, "
", $ Hand2;?\u003e

Sonuç:

İlk versiyonda (çift tırnak işaretleriyle), doların özel bir sembolünün korunmasını kullandık, böylece bu uzman kendi özel amaçlı (değişkenlerin belirlenmesi) ve sıradan bir dolar işareti haline getirilmiştir.

İkinci varyantı (tek tırnaklarla) zaten bildiğiniz gibi - PHP tercümanı hatta değişkenleri bile bulmaya çalışmadı ve bu nedenle tarama gerekli değildi.

PHP'de özel fabrikalar.

Özellikle blog okuyucular için Site. ON! PHP programlama dilinde küçük bir özel karakter listesi hazırladım:

  • \\ N yeni satır
  • geri dönüş arabası
  • Yatay tablolama
  • \\\\ ters eğik eğri lanet olası (backlash)
  • \\ $ dolar işareti
  • \\ "Çift tırnak

Çeviriyi yeni bir satıra (enter olarak) yapan \\ n - \\ n - bir uzman örneğinde uzmanlaşmaların çalışmalarına bakalım, ancak tarayıcıların anlamadığı (ve görmezden gelmemesi gerekir), ancak çalışmalarının sonucu olabilir Sayfanın Kaynak sayfasında görüntülenebilir:

echo $ kural "
", $ kural2;?\u003e

Sonuç:

Kaynak kodu (CTRL + U):

Tarayıcıdaki ziyaretçiler için özel karıştırıcı hiçbir şekilde gösterilmezse, o zaman onun anlamı nedir?

İlk olarak, özel semboller ve \\ n, özellikle de sayfadaki kodu rahatça biçimlendirebilirsiniz (yukarıdaki örnekte olduğu gibi).

İkincisi, örneğin, aktarımı (enter) yapmak için bir dosyaya kaydederken ve yeni bir satıra kaydetmeye devam ederken kullanılabilir.

Bu biçimlendirmeye bir alternatiftir.

PHP'de Heredoc Sözdizimi

Sonuç:

Kaynak kodu (CTRL + U):

Sonuç, kendisi için konuşur, şimdi her şeyin nasıl düzenlendiğini görelim:

  • Dize üç köşe paranteziyle başlar<<<, далее следует имя идентификатора.
  • Hiçbir durumda açma tanımlayıcısına (etiket) olan bir dize, bir boşluk da dahil olmak üzere başka karakterlerden sonra içermemelidir. Yani, başka bir deyişle, etiketimizden hemen sonra, boşluksuz, hemen girmeliyiz!
  • Aktar
  • Öğretici

SQL Enjeksiyonu, Çapraz Hatlı Taleplerin Sahte, Hasarlı XML ... Korkunç, korkunç şeyler, hepimizin kendinizi korumaktan hoşlanacağımız, ama hepsinin neden olduğunu biliyoruz. Bu makalede, tüm bunların arkasındaki temel konsepti açıklar: satırların içinde satırlar ve satır işleme.

Asıl sorun

Bu sadece metin. Evet, sadece metin - işte asıl sorun. Bilgisayar sistemindeki hemen hemen her şey metin tarafından temsil edilir (sırayla baytlar tarafından temsil edilir). Bazı metinlerin bir bilgisayar için ve diğerleri için tasarlanmıştır. Ancak bunlar ve bunlar hala metin kalıyor. Ne hakkında konuştuğumu anlamak için küçük bir örnek vereceğim:
Homo sapiens. Sanırım Rusça'ya çevirmek istemiyorum İngilizce metin var.

İnanmıyorum: Bu metin. Bazı insanlar buna XML diyor, ancak bu sadece metin. Belki de İngilizce öğretmeni göstermek için uygun değildir, ancak hala sadece metin. Bir poster üzerine yazdırabilir ve onunla yürütebilirsiniz, annenizi harfe yazabilirsiniz ... bu metin.

Bununla birlikte, bu metnin belirli bölümlerinin bilgisayarımız için bir değere sahip olmasını istiyoruz. Bilgisayarın metnin yazarını ve metnin kendisini ayrı ayrı ayıklayabilmesini istiyoruz, böylece bir şey yapabilirsiniz. Örneğin, yukarıda belirtilenleri şunlara dönüştürün:
Diyelim ki, Homo Sapiens tarafından Rusça'ya çevirmek istemiyorum İngilizce metin var.
Bilgisayar nasıl yapacağını nereden biliyor? Peki, çünkü metnin belirli kısımlarını, örneğin, ve örneğin, ve gibi eğlenceli parantez içinde özel kelimelerle sarıldık. Bunu yaptığımızdan beri, bu belirli parçaları arayacak bir program yazabiliriz, metni kaldırdı ve kendi buluşumuz için kullanırlardı.

Başka bir deyişle, birisinin aynı kuralları gözlemleyebileceği bazı özel önemi tanımlamak için metnimizde belirli kuralları kullandık.
Tamam, anlaması çok zor değil. Ve ne yazık ki bu komik parantezleri metnimizde özel bir anlamı kullanmak istiyorsak, ama bu çok anlamı kullanmadan? .. Böyle bir şey:

Homo sapiens. < n and y >

Semboller "<" и ">"Özel değiller. Yasal olarak herhangi bir yerde, yukarıdaki örnekte olduğu gibi herhangi bir yerde kullanılabilirler. Ama özel kelimelerle ilgili fikrimiz nasıl? Bu demek ki, bir tür anahtar kelime nedir? XML'de? Evet. Ve belki de değil. Bu belirsizdir. Bilgisayarlar belirsizliklerle başa çıkmadığından, bunun sonucunda bir şeyin öngörülemeyen bir sonucu verebilir, eğer yukarıdaki tüm noktalara müdahale etmem ve belirsizliği ortadan kaldırmazsak, öngörülemeyen bir sonuç verebilir.
Bu ikilemi çözerek belirsiz bir şeyin belirsiz sembollerini değiştirebilirsiniz.
Homo sapiens. Temel Matematik bize x'i söyler.< n and y > N, x Y'dan büyük olamaz.

Şimdi, metin tamamen açık olmalıdır. "<" равносильно "<", а ">" - ">".
Bunun teknik tanımı - koruyucu Özel sembollerden kaçındığımızda özel sembollerden kaçınırız.
Kaçış | iskāp | [Obj yok. ] [Obj ile serbest bırak. ] Farketme / hatırlamayın [...] [Obj ile. ] Bu: farklı şekilde yorumlanmanın nedeni [...]
Metin içindeki karakterlerin belirli karakterleri veya dizileri özel bir önemliyse, bu karakterlerin özel önemini çekmeden kullanılması gerektiği durumların nasıl çözüleceğini belirleyen kurallar olmalıdır. Ya da başka bir deyişle, koruma soruyu cevaplar: "Bu karakterler çok özelse, sonra onları metninizde nasıl kullanmalıyım?".
Yukarıdaki örnekte farkın olabileceği için, Amper ve (&) aynı zamanda özel bir semboldür. Ama yazmak istiyorsak ne yapmalı "<", но без интерпретации этого как "<"? В XML, escape-последовательность для &, это - " & ", т.е. мы должны написать: " &< "

Diğer örnekler

XML, özel karakterlerden gelen "acı çeken" vakası değildir. Herhangi bir programlama dilinde herhangi bir kaynak kodu gösterebilir:
Var ad \u003d "homo sapiens"; Var içerikleri \u003d "varsayalım, Rusça'ya çevirmek istemiyorum İngilizce metin var";
Her şey basittir - normal metin açıkça "metin değil" çift alıntılardan ayrılmıştır. Aynı şekilde, matematiksel analiz kursundan metnim kullanılabilir:
Var ad \u003d "homo sapiens"; Var içerikleri \u003d "Temel Math bize x ise< n and y > N, x Y'dan büyük olamaz. ";
Güzel! Ve korumaya başvurmaya bile ihtiyacınız yok! Ama bekle ve ne birinden alıntı yapmak istersem?
Var ad \u003d "homo sapiens"; Var içerikleri \u003d "Plato'nun bir zamanlar" Lorem Ipsum Dolor'un Amet oturun "dedi.";
Hmm ... üzüntü, özlem. Bir kişi olarak, metnin nerede başladığını ve neyin bittiğini ve alıntının nerede olduğunu belirleyebilirsiniz. Ancak, herhangi bir bilgisayar için tekrar belirsiz hale geldi. Metinin sonu anlamına gelen, değişmez "ve" ile ayırt etmemize yardımcı olacak bir tür koruyucu kurallar bulmalıyız. Çoğu dil programlama kullanın eğik özellikler:
Var ad \u003d "homo sapiens"; Var içerikleri \u003d "Plato, bir zamanlar" Lorem Ipsum Dolor Sit Amet \\ "olduğunu söyledi.";
"\\" Özel olmadıktan sonra bir sembol yapar. Ama bu, yine, "\\" özel bir sembol olduğu anlamına geliyor. Bu sembolün metinde kesin olarak yazılması için, yazarak aynı sembolü eklemeniz gerekir: "\\\\". Komik, değil mi?

İfal!

Koruyucu için başvurmak zorunda kalırlarsa her şey o kadar kötü olurdu. Elbette suşları, ama bu kadar korkunç değil. Bazı programlar, diğer programlar için "okumak" için metin yazdığında sorunlar başlar. Ve hayır, bilim kurgu değil, sürekli olur. Örneğin, bu sitede, bir mesaj yayınlayın, bir mesaj yayınlayın, HTML biçiminde manuel olarak çevirmeyin ve yalnızca bunun sonucunda bu site tarafından HTML'de dönüştürüldüğü metni yazın, ardından tarayıcı zaten dönüştürülür. Oluşturulan "HTML tekrar okunabilir metinde.

Bir başka yaygın örnek ve birçok güvenlik probleminin kaynağı - SQL istekleri. SQL - Veritabanlarıyla iletişimi kolaylaştırmak için tasarlanmış dil:
Bu metinde, pratik olarak hiçbir özel karakter, çoğunlukla İngilizce kelime yoktur. Yine de, aslında, SQL'deki her kelime özel bir anlamı vardır. Örneğin, dünyadaki birçok programlama dilinde, örneğin:
$ query \u003d "Ad \u003d" Alex "" adlı kullanıcılardan telefon_number'i seçin; $ Sonuç \u003d mysql_query ($ sorgu);
Bu iki basit çizgi, ABD'den, gereksinimlerimizi karşılayan bir veritabanı programı için bir istek için çok karmaşık bir görevi özetleyecektir. "Elekler", muhtemelen bir istek yapmış programın güzel biçimlendirilmiş bir sonucunu geri döndürmek için muhtemelen bit ve bayt terabaytları. Cidden, tüm bu saçmalık basit bir anglo benzeri teklifle kapsüllenmektedir.

Yararlı hale getirmek için, bu tür talepler zorunlu değildir, ancak kullanıcı girişi temelinde inşa edilmiştir. Bu, farklı kullanıcılar kullanmayı amaçlayan teklif:
$ İsim \u003d $ _POST ["İsim"]; $ query \u003d "Ad \u003d" $ adı "" adlı kullanıcılardan telefon_number'i seçin; $ Sonuç \u003d mysql_query ($ sorgu);
Bu makaleyi izlerseniz: Bu bir anti-örnektir! Yapabileceğin en kötüsü bu! Bu bir güvenlik kabusu! Böyle bir şey yazdığınızda, bir masum yavru kedi ölecek! Ktulhu, ruhunu buna davet edecek!

Ve şimdi burada ne olacağını görelim. $ _POST ["İsim"] - Rastgele bir kullanıcının rastgele web sitenizde rastgele bir forma girdiği bir değer. Programınız, bu değeri, veritabanında bulmak istediğiniz kullanıcı adı olarak kullanan bir SQL sorgusu oluşturacaktır. Sonra bu SQL "teklif" doğrudan veritabanına gönderilir.

Görünüşe göre her şey çok korkunç değil, evet? Rastgele web sitenize girilebilecek birkaç rasgele değer girmeye çalışalım ve bunun için hangi istekleri ortaya çıkacak:

Alex.
Adı \u003d "Alex" adlı kullanıcılardan Phone_Number'i seçin.
MC "Donalds.
Adı \u003d "MC" Donalds "adlı kullanıcılardan Phone_Number'i seçin.
Joe "; damla tablo kullanıcıları; -
Adı \u003d "Joe" adlı kullanıcılardan Phone_Number'i seçin; Damla tablo kullanıcıları; - "
İlk istek korkutucu görünmüyor, ama oldukça güzel, değil mi? 2 numara, "biraz" belirgin olarak sözdizimimize zarar veriyor gibi görünüyor. "Lanet Almanca! 4 numara biraz aptal. Bunu kim yazacak? Bu mantıklı değil ...
Ancak veritabanı işleme talebi için değil ... Veritabanının bu talebin geldiği herhangi bir şey yok ve ne anlama gelmesi gerektiği. Gördüğü tek şey iki istek: Joe adlı bir kullanıcı numarasını bulun ve ardından Kullanıcılar tablosunu (bir yorumla birlikte eşlik eden ") silindir ve başarıyla yapılır.

Sizin için bu haber olmamalıdır. Öyleyse, o zaman, lütfen bu makaleyi tekrar okuyun, çünkü programlamada yeni gelenlersiniz ya da son 10 yıl bir mağarada yaşadınız. Bu örnek, tüm dünyada kullanılan SQL enjeksiyonlarının temellerini göstermektedir. Verileri silmek için veya basitçe elde edilmemesi veya hakları olmadıkça, giriş yapmaması için veri alın. Ve hepsi, çünkü veritabanı anglo benzeri "cümleyi" kelimenin tam anlamıyla algıladığı için.

Oooeeeee!

Bir sonraki adım: XSS saldırıları. Aynı şekilde hareket ederler, yalnızca HTML için geçerlidir.
Veritabanıyla ilgili sorunlara karar verdiniz, kullanıcıdan veri almanızı, veritabanına yazın ve kullanıcılara erişmek için web sitesine geri gönderin. Tipik bir forum, yorum sistemi vb. Yapan budur. Sitenizde bir yerde böyle bir şey var:

Tarafından gönderildi. Açık.


Kullanıcılarınız iyi ve nazikse, eski filozofların alıntılarını yerleştirirler ve mesajlar aşağıdaki türde olacaktır:

Posted by Plato 2 Ocak, 15:31

"Lorem Ipsum Dolor Sit Amet, ConserTaTur Adipising Elit, SED, Eiusmod Tapa Incididunt UT Labore et Dolore Magna Aliqua.


Kullanıcılar akıllıysa, muhtemelen matematik hakkında konuşacaklar ve bu tür mesajlar olacaktır:

Posted by Pascal 23 Kasım, 04:12

Temel Matematik bize x'i söyler.< n and y > N, x Y'dan büyük olamaz.


Hmm ... yine bu varsayılan parantezlerimiz. Teknik bir bakış açısıyla, belirsiz olabilirler, ancak tarayıcı bizi affedecek, değil mi?


Peki, dur, ne cehennem? Joker'in JavaScript etiketlerini forumunuza soktu? Bu mesajı sitenizde görünen herkes artık yükleniyor ve sitelendirme yapabilmesindeki site bağlamında komut dosyalarını yükler. Ve bu iyi değil.

Kelimenin tam anlamıyla anlamıyorum

Yukarıdaki durumlarda, bir şekilde veritabanımızı veya tarayıcımızı bilgilendirmek istiyoruz, bu sadece bir metin olduğunu, onunla hiçbir şey yapmazsın! Başka bir deyişle, tüm özel karakterlerin ve anahtar kelimelerin özel değerlerini, kullanıcının sağladığı herhangi bir bilgiyle "silmek" istiyoruz, çünkü ona güvenmiyoruz. Ne yapalım?

Ne? Ne diyorsun oğlum? Oh, "Koruyucu" diyorsun? Ve kesinlikle haklısın, çerezi al!
İsteğe göre birleştirmeden önce kullanıcı verilerine korumayı kullanırsak, sorun çözülür. Veritabanı taleplerimiz için şöyle bir şey olacak:
$ İsim \u003d $ _POST ["İsim"]; $ İsim \u003d mysql_real_escape_string ($ adı); $ query \u003d "Ad \u003d" $ adı "" adlı kullanıcılardan telefon_number'i seçin; $ Sonuç \u003d mysql_query ($ sorgu);
Sadece bir kod satırı, ama şimdi başka hiç kimse veritabanımızı "hack" yapamaz. Kullanıcı girişine bağlı olarak, SQL isteğinin nasıl görüneceğini tekrar görelim:
Alex.
Adı \u003d "Alex" adlı kullanıcılardan Phone_Number'i seçin.
MC "Donalds.
Ad \u003d "MC \\" Donalds "adlı kullanıcılardan Phone_Number'i seçin.
Joe "; damla tablo kullanıcıları; -
Adı \u003d "Joe \\" adlı kullanıcılardan Phone_Number'i seçin; Damla tablo kullanıcıları; - "
Mysql_real_escape_string ayrıştırma olmadan, her şeyin önünde eğik çizgi eğik çizgi, bir tür özel anlam olabilir.


Onları geri getirmeden önce HTMLSpecialchars özelliğini tüm kullanıcı verilerine kullanıyoruz. Şimdi haşere mesajı şöyle görünüyor:

Gönderen Jacktr, 18 Temmuz 12:56


Lütfen kullanıcılardan alınan değerlerin gerçekten "zarar görmediğini" unutmayın. Herhangi bir tarayıcı ayrıştırıcı bu HTML gibidir ve her şeyi doğru biçimde görüntüler.

Bizi geri getiren şey ...

Yukarıdakilerin tümü, birçok sistemin özelliğini gösterir. Metinsel değerleri SQL'ye yerleştirme, SQL kuralları ile korunmalıdır. Metinsel değerleri HTML'ye yerleştirme, HTML kuralları ile korunmalıdır. Metin değerlerini (teknoloji adı) yerleştirerek, kurallar tarafından korunmaları gerekir (teknoloji adı). Bu kadar.

Tam resim için

Elbette, kullanıcı mucitleri ile mücadele etmenin diğer yolları, özel karakterler içermesi veya içermemelidir:
  • Doğrulama.
    Kullanıcı girişinin belirli şartnamelere uygun olup olmadığını kontrol edebilirsiniz. Numaranın girişine ihtiyacınız varsa ve kullanıcı başka bir şeye girerse, program onu \u200b\u200bbilgilendirmeli ve girişi iptal etmelidir. Bütün bunlar doğru bir şekilde örgütleniyorsa, "tablo kullanıcılarını" bırakma riski yoktur, nerede, varsayılır, kullanıcı "42" tanıtacaktır. HTML / SQL enjeksiyonlarından kaçınmak için bu çok pratik değildir, çünkü Genellikle "zam" içerebilen ücretsiz bir format metnini benimsemek gerekir. Diğer önlemlerin yanı sıra genellikle doğrulama kullanılır.
  • Temizlik
    Tehlikeli olarak düşündüğünüz karakterleri kaldırmak için "nemli" de olabilirsiniz. Örneğin, forumunuza eklenmesini önleyen HTML etiketine benzer bir şeyi kaldırmanız yeterlidir. Sorun, metnin oldukça meşru bölümlerini silebileceğinizdir.
    Hazırlanan SQL ifadeleri
    Yaptığımız bir şeyi yapan özel işlevler var: Veritabanını, SQL istek ve kullanıcılar tarafından sağlanan bilgiler arasındaki farkları anlamak için zorlamak. RNR'de şöyle görünüyorlar:
    $ STMT \u003d $ PDO-\u003e Hazırlayın ("Name \u003d?")); $ STMT-\u003e Execute ($ _ Post ["İsim"]);
    Aynı zamanda, gönderim iki aşamada gerçekleşir, istek ve değişkenleri açıkça ayırt eder. Veritabanı, önce sorgu yapısını anlama yeteneğine sahiptir ve ardından değerleriyle doldurun.

  • Gerçek dünyada, tüm bunlar farklı koruma adımları için birlikte kullanılır. Kullanıcının doğru verileri girdiğinden emin olmak için her zaman doğrulama kontrolü (doğrulama) kullanmanız gerekir. Sonra girilen verileri tarayabilir (ancak zorunlu değil). Kullanıcı açıkça bir komut dosyasını "sürdürmeye" çalışıyorsa, basitçe silebilirsiniz. Ardından, her zaman özel verileri her zaman bir SQL sorgusuna yerleştirmeden önce koruymanız gerekir (aynı HTML için geçerlidir).

Düzenli ifadelerdeki dizinde, denilen böyle bir bölüm var " Meta-semboller (korumalı) ". Bu tam olarak bu meta sembolleri hakkında (aynı zamanda özel semboller de denir) ve bu makalede konuşacağız.

Özel semboller - Bunlar, harf veya sayı olmayan karakterlerdir. Yani, bunların tümü, harfler ve sayılar hariç tüm karakterlerdir.

Özel karakterler, bir nokta, yıldız işareti, artı, soru işareti, şebeke ve diğerleri gibi semboller olarak kabul edilir.

Önceki makalelerden bildiğimiz gibi, bazı özel karakterler düzenli ifadelerde özel bir rolü var. Yani, her özel sembolün bir tür performans var.

Örneğin, bir nokta kesinlikle herhangi bir karakter anlamına gelir. Yıldızlar sıfırdan sonsuzluğa kadar tekrarlanan bir rakamdır. Artı aynı zamanda birinden sonsuzluğa bir tekrarlama miktarıdır. Hayali sembol ^ çizginin başlangıcı anlamına gelir ve DOTLAR İMZA ($) dizenin sonu. Bu arada, dolar sembolü de hayali bir semboldür. Ayrıca, ^ sembolünün, eğer köşeli parantez içine koyarsak, başka bir rolü olduğunu da biliyoruz. Önceki makalelerdeki tüm bu değerlerden bahsettik.

Bu yazıda soruyu cevaplayacağım " Düzenli olarak özel karakterler nasıl kullanılır? ".

Bu özel rolü iptal etmek için, düzenli olarak özel bir sembol, gereklidir. kalkan. Böylece, bu özel karakter tam olarak bu sembolü temsil edecektir. Yani, korumalı nokta, herhangi bir karakter değil, nokta anlamına gelir. Korumalı yıldızlar, durak anlamına gelir ve tekrarların nicel değeri değildir.

Koruyucu Ters aptalca yapılır. Yani, bazı özel bir sembolü korumak için, önüne koymanız gerekir.

Diyelim ki böyle bir görevimiz var "Noktanın hattın sonunda ayarlanıp ayarlanmadığını kontrol edin." Öyleyse, bu nokta düzenli ifadelerde sırayla, tam olarak bir noktadır ve başka bir sembolden değil, onu korumak için gereklidir.

Var str \u003d "o bir kahramandır."; var reg \u003d /. *. $ /; Uyarısı (reg.test (str)); // true

Gördüğümüz gibi, düzenli ifadeye uygunluk için çizginin kontrolünün sonucu doğrudur. Hattın sonundaki noktayı kaldırırsak, sonuç zaten yanlış olacaktır.

Benzer şekilde, diğer özel karakterler de korumalıdır.

Var str \u003d "x + y \u003d .n * m \u003d /, co \\\\ la"; var reg \u003d / x \\ + y \u003d \\. n \\ * m \u003d \\ / co \\\\\\ la /; Uyarısı (reg.test (str)); // true

Burada korumalı semboller artı (\\ +), puan (\\.), Yıldız (\\ *), normal katman (/ /) ve ters katman (\\\\\\). Lütfen satırdaki ters katmanın iki ters vuruşla yazıldığını unutmayın. Ve normal ifadede, ayrıca iki ters katmanın yardımı ile korunur.

Uyarı kullanırsak, dizeyi STR değişkeninden çekin, ardından iki ters levha yerine sadece bir tane göreceğiz.

Benzer şekilde, dizinde belirtilen tüm karakterler Meta-Symbols bölümünde korumalıdır.

Ve bu konuda, belki de her şey. Bu küçük makaleden zaten biliyorsun Özel karakterleri nasıl korur? Ve onları normal ifadelerin hazırlanmasında nasıl kullanabilirsiniz.

Görevler

  1. Uyumluluğu kontrol etmemiz gerektiğini, böyle bir dize "400 dolar kazandım." Dizenin sonunda bir dolar sembolünün varlığını kontrol eden düzenli bir ifade yazın. Uyum için dizgiyi kontrol edin.