Ben hazırlanmış tablolara htmlentitiesi () veya htmlspecialchars () ihtiyacım var?

4 Cevap php

Bir makalede http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html, bu şunlar diyor ki:

Orada uygulamalarda hazırlanmış deyimleri kullanarak sayısız avantajları hem security için, ve performans nedenleri.

Hazırlanan tablolar besleniyor verilerden SQL mantığı ayırarak güvenliğini artırmaya yardımcı olabilir. Mantık ve veri Bu ayrılık bir SQL enjeksiyon saldırısı denilen güvenlik açığının çok yaygın bir tür önlemeye yardımcı olabilir.

Bir ad hoc sorgu ile uğraşırken Normalde, kullanıcıdan alınan verileri ele alırken çok dikkatli olmak gerekir. This entails using functions that escape all of the necessary trouble characters, such as the single quote, double quote, and backslash characters.

This is unnecessary when dealing with prepared statements . Verilerin ayrılması MySQL otomatik olarak hesaba bu karakterleri almak için izin verir ve herhangi özel bir işlevi kullanarak kaçtı olması gerekmez.

Does this mean I don't need htmlentities() or htmlspecialchars()? But I assume I need to add strip_tags() to user input data? Am I right?

4 Cevap

htmlentities and htmlspecialchars are used to generate the HTML output bu tarayıcıya gönderilir.

Hazırlanan tablolar Database engine sorguları göndermek / oluşturmak için kullanılır.

Both allow escaping of data; but they don't escape for the same usage.
So, no, prepared statements (for SQL queries) don't prevent you from properly using htmlspecialchars/htmlentities (for HTML generation)

About strip_tags: it will remove tags from a string, where htmlspecialchars will transform them to HTML entities.
Those two functions don't do the same thing; you should choose which one to use depending on your needs / what you want to get.

Örneğin, bu kod parçası ile:

$str = 'this is a <strong>test</strong>';
var_dump(strip_tags($str));
var_dump(htmlspecialchars($str));

Siz çıktı bu tür alırsınız:

string 'this is a test' (length=14)
string 'this is a &lt;strong&gt;test&lt;/strong&gt;' (length=43)

Birinci durumda, hiçbir etiket; ikinci, düzgün olanları kaçtı.

Ve, bir HTML çıkış:

$str = 'this is a <strong>test</strong>';
echo strip_tags($str);
echo '<br />';
echo htmlspecialchars($str);

Alırsınız:

this is a test
this is a <strong>test</strong>

Eğer onlardan Hangisini istiyorsun? That önemli bir soru ;-) olduğunu

Bu HTML değil, SQL için çünkü hiçbir şey, htmlspecialchars() için değiştirir. Sen hala düzgün HTML kaçmak gerekir, ve bu aslında HTML oluşturmak oldukça zaman nasılsa veritabanına bağlayarak daha, bunu yapmak için en iyisidir.

Eğer hazır deyimleri kullandığınızda, o zaman (siz hazırlanan tablolarda raporlanan tutucuların sopa ve dize manipülasyon ile atlamak için günaha karşı varsayarak) artık mysql_[real_]escape_string() gerekmez.

Eğer htmlspecialchars() kurtulmak istiyorsanız, o zaman her şey el kaçan, örneğin, PHPTAL SQL hazırlanan tablolarda perinizi çalışmak ve ücretsiz HTML çiftleşmiş motorları vardır.

You don't need htmlentities() or htmlspecialchars() when inserting stuff in the database, nothing bad will happen, you will not be vulnerable to SQL injection if you're using prepared statements. The good thing is you'll now store the pristine user input in your database.

Sen çıkış yapmayı kaçmak gerekir ve bir müşteriye geri gönderme DO - Başka veritabanından şeyler çektiğinizde çapraz site betik saldırılarına karşı savunmasız olması ve diğer kötü şeyler olacak. Eğer html gibi, ihtiyaç çıkış biçimi için onları kaçmak gerekir, bu yüzden hala vb htmlentitiesi gerekir

Eğer veritabanına içine koymak gibi o nedenle sadece, bir şeyler kaçabilir değil ne zaman çıktı - Eğer kullanıcının özgün biçimlendirmeyi kaybedersiniz, ve eğer ödemek olmayabilir html kullanım için verileri kaçış olacak ancak Eğer farklı çıkış biçimlerde verileri kullanarak ediyoruz.

Hala HTML kodlamak için eğimli olacak. Bazı CMS form veya web uygulaması inşa ediyorsanız, bu gibi kodlanmış HTML depolamak ve daha sonra yeniden kodlamak gerekli olarak daha kolay.

HTML spec bir metin alanı içinde HTML izin vermez beri - TinyMCE tarafından değiştirilmiş bir TextArea içine bilgi getiren Örneğin, onlar HTML kodlanmış gerektiğini öneriyoruz.

Ben de strip_tags() yerden HTML kodunu istemiyorum olur.