HTML çıktısı için şifre çözme mysql_real_escape_string ()

6 Cevap php

SQL Enjeksiyon ve kullanıyorum kendimi korumaya çalışıyorum:

mysql_real_escape_string($string);

HTML gönderme zaman bu gibi bir şey görünüyor:

<span class="\&quot;className\&quot;">
<p class="\&quot;pClass\&quot;" id="\&quot;pId\&quot;"></p>
</span>

Ben real_escape_string diğer varyasyonları yani nasıl ... sadece bir kaç yerini ve diğerlerini kaçırmak istemiyorum ekler kaç emin değilim ben "dal" Bu geri gibi bir şey ile düzgün biçimlendirilmiş HTML, içine:

html_entity_decode(stripslashes($string));

6 Cevap

mysql_real_escape_string() manuel sayfası size karakterler kurtuldu hangi söyler:

mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.

Sen başarıyla çıkmamış bir yapıya sahip kaçtı karakterleri değiştirerek kaçışa ters olabilir.

mysql_real_escape_string() olsa HTML sterilize etmek için kullanılan olmamalıdır ... web sayfası, veri çıkışı önce kullanmak için hiçbir neden yok. Bu sadece veritabanına koymak üzereyiz verilere kullanılmalıdır. Sizin sanitization süreci bu gibi görünmelidir:

Input

  1. Bir form veya HTTP isteğinin kullanıcı girişi kabul
  2. Kullanarak veritabanı sorgu oluşturma mysql_real_escape_string()

Output

  1. Veritabanından veri alıp
  2. Yazdırmadan önce htmlspecialchars() üzerinden herhangi bir kullanıcı tanımlı veri çalıştırmak

Böyle MySQLi gibi farklı bir veritabanı sürücüsünü veya PDO sizin için en girdiler kaçan özen hazırlanmış deyimleri, kullanmanızı sağlayacak. Eğer anahtarı veya bu yararlanmak olamaz Ancak, o zaman kesinlikle mysql_real_escape_string() ... sadece sadece veri takmadan önce kullanmaz.

mysql_real_escape_string veritabanına kullanıcı sağlanan veri depolamak, SQL enjeksiyonu önlemek için kullanılan, ancak daha iyi bir yöntem PDO (örneğin) kullanarak veri bağlama kullanmak olacaktır. Ben her zaman yerine kullanarak kaçan karıştırmasını tavsiye.

Eğer veri "çıkmamış" olmak gerek kalmadan tam ve geçerli olup bunu aldığınızda verilerin depolandığı sonra - ki daha sonra görüntülemek için nasıl soru ile ilgili, söyleniyor. Kendi kaçan dizileri eklenen sürece, böylece yapmayın lütfen.

You messed everything up.
mysql_real_escape_string don't need any decoding.
and it must be done to data that goes to the query. this operation bound to the query, not to user input. Nothing else must be done between escaping and query building. So, it must be like this:

$html=mysql_real_escape_string($html);

nothing here

$query="INSERT INTO table SET html='$html'";

Ama muhtemelen htmlspecialchars'dan gibi bazı fonksiyonlar ekledi ediyoruz, bu nedenle böyle bir karmaşa ile sonuna kadar.

Yani, sorunu çözmek için:

  1. Hiçbir şey Decode.
  2. Encode sadece those şeyler kodlanmış gerektiğini ve when bu kodlanmış gerekir.

Olduğu gibi HTML çıktı gidiş varsa - kişiler ile herhangi bir tırnak yerine geçmez.

Bunu ancak html form görebilirsiniz emin olarak ne biçimlendirme ile oluyor değil

<span class="\&quot;className\&quot;">
<p class="\&quot;pClass\&quot;" id="\&quot;pId\&quot;"></p>
</span>

sadece olmalıdır;

<span class="className">
<p class="pClass" id="pId"></p>
</span>

Eğer () bir sql enjeksiyon krizi olmaz emin olmak için mysql_real_escape_string kullanarak kaçmak veritabanına koymak önce, geri döndüğümde.

Dolayısıyla metin sonraki gidiyor yer için değerler hazır kaçan.

(Veya html olarak kullanıcılara bunun HERHANGİ görüntülemek) veritabanından almak o zaman bunu yerleştirmek o için tekrar hazır kaçmak XSS saldırılarına karşı kullanıcıları korumak için Htmlentities (vb) ile (html) yanında gidiyor.

Bu mantra FIEO EO parçası, sen göz kapaklarınızın iç Dövme hangi, Input Filter Çıktı Escape oluşturur.

Bu rutin bir ekli dekoder rutin yok, neden diye merak ediyordum. Onun muhtemelen MySQL ile o kaçmış değil sanki aynı şekilde yorumlanır. Yapmanız zaman un-kaçtı sonuçlar elde bir $row=mysql_fetch_array($res, MYSQL_ASSOC)';

Ben diğer cevaplar bir dizi bariz sorunu cevapsız düşünüyorum ...

(Eğer hazırlanmış deyimleri kullanarak olmamalı sanki) Eğer girilen içeriğe mysql_real_escape_string kullanıyor.

Sorununuz çıkışı ile.

Geçerli sorun, html_entity_decode çağırıyor olmasıdır. Sadece stripslashes Eğer orijinal metni geri ihtiyaç vardır. html_entity_decode onları değişiyor gibi ne, vs, tırnak karışıklık olduğunu. Aslında çıkış (siz HTML_ENTITIES kullanımı ne zaman olduğu, vb) html değil, sadece düz metin istiyorum. Sen kodlanmış istediğim bir şey çözme vardır.

Sadece metin sürümü göstermek istiyorsanız, varlıkları kullanabilirsiniz. Eğer kötü etiketleri hakkında endişeleriniz varsa, striptags kullanın ve (örneğin, b gibi, i, vb) yalnızca istediğiniz etiketleri izin.

Son olarak, doğru sırayla kodlamak ve kodunu çözmek için hatırlıyorum. Eğer mysql_real_escape_string (htmlentities ($ str)) koştu eğer, o zaman (stripslashes ($ str)) html_entity_decode çalıştırmak gerekir. Işlemleri konularda sırası.

GÜNCELLEME: Ben html_entity_decode de eğik şeritler olduğunu fark etmedi. Açıkça bu sayfada belgelenmiş değildi ve sadece onu yakaladı asla. Ben istiyorum sunmak en html varlıklar olarak sol olarak ben hala otomatik olarak o olsa, çalışacak, ve ben bile yok, ben vaka bazında bir durumda, benim db sınıfın dışında bu kararı yapmayı tercih. Bu şekilde, ben bölü gitti biliyorum.

Bu (TinyMCE onun için yapıyormuş gibi, ya da onun giriş programı) özgün poster htmlentitiesi çalışıyor, ve o içeriği geri çevirmek istediği görülüyor. Yani, html_entity_decode ($ Str) tüm gerekli olduğunu olmalıdır.