$ Var_to_use_in_app = mysql_escape_string (($ _GET ['variableNameX']) Döşeme);
Bu genellikle yapmak için yanlış bir şey. Uygulamanızda dahili kullanılan dize her zaman düz metin sürümü olmalıdır. Sonra da dize manipülasyon hiçbiri kıracak daha emin olabilirsiniz, ve sayfaya yanlış bir şey çıktısı olmayacaktır.
Örneğin, sunulan dize olsaydı:
O'Reilly
mysql_escape_string bunu kaçacak:
O\'Reilly
hangi HTML sayfası için bu dizeyi çıktı zaman, aptal olmazdı. Sonra tekrar gönderilen bir form alanı için outputted Ve eğer tekrar düzenlenmiş ise dört, sekiz dönüşecekti iki blackslashes, dönüşecekti ki, another ters eğik olsun ... ve istiyorum değil uzun tersbölülerden yüzlerce oluşan dizeleri var. Bu kötü magic_quotes açık özelliği ile kötü yazılmış CMSS ve sunucularda yaygın olarak görülen bir sorundur.
Eğer bir veritabanı sorgu koymak için adının ilk iki harfini almak istedim, altdizesine snip ediyorum:
O\
ve daha sonra sorgu içine birleştirmek:
SELECT * FROM users WHERE namefirst2='O\';
hoppala, sözdizimi hatası, bu dize şimdi sonlandırılmamıştır olduğunu. Önceden kaçtı dizeleri dize işleme Türevleri gibi kolaylıkla güvenlik sıkıntı içine alabilirsiniz.
Bu yaklaşım yerine, size SQL veya HTML bir sınırlanmış değişmez bunları birleştirmek son çıkış aşaması hariç her yerde uygulamanızda basit çıkmamış metin dizeleri olarak dizeleri tutmak. SQL için:
"SELECT * FROM users WHERE name='".mysql_real_escape_string($name)."';"
Genel olarak her zaman 'gerçek' bir sürümünü kullanmanız gerekir böylece düz eski mysql_escape_string, ANSI SQL_MODE seti ile Doğu Asya karakter setleri ve bağlantıları / veritabanları gibi bazı köşe durumlarda başarısız - 'gerçek' işlev adını not edin.
Sen mysql_real_escape_string gibi aynı ama bu biraz daha az çirkin yapmak için kısa bir ad (örn. m ()) olan bir fonksiyon tanımlayabilirsiniz. Ya da, daha iyi, mysqli yıllardan parameterised queries bakmak.
HTML, öncelemeli htmlspecialchars () işlevi kullanılarak yapılmalıdır:
<div id="greeting">
Hello, Mr. <?php echo htmlspecialchars($name); ?>!
</div>
Sen echo (htmlspecialchars ()) yok ama bu biraz daha az çirkin yapmak için kısa bir ad (örn. h ()) olan bir fonksiyon tanımlayabilirsiniz.
Htmlspecialchars çağrısı cevapsız varsa, o zaman tarayıcı sitenizin XSS karşı savunmasız olduğunu söylüyorum kesinlikle doğrudur. Ama hemen hemen her PHP programcısı aynı hatayı yapar, çok kötü hissetmiyorum.
mysql_ [real_] escape_string '"', HTML metin patlak karakterler, çünkü burada hiç size yardımcı '&', '<' ve, nitelikleri de değil. Bunların hiçbiri özeldir SQL dizesi değişmezleri, yani mysql_escape_string tüm bunları değmeyecek bir kötü niyetli.:
<script>alert("I'm stealing your cookies! "+document.cookie);</script>
: Sadece kaçtı alır
<script>alert("I\'m stealing your cookies! "+document.cookie);</script>
Hangi kadar güvenlik söz konusu olduğunda, hiçbir yardımcı olmaktır.