Giriş metin ve özel karakterler ve MySQL

4 Cevap php

I have a simple textbox in a form and I want to safely store special characters in the database after POST or GET and I use the code below. $text=mysql_real_escape_string(htmlspecialchars_decode(stripslashes(trim($_GET["text"])),ENT_QUOTES));

Ben veritabanından metin okuma ve metin değeri koyduğunuzda ben yukarıdaki kodu kullanabilirsiniz.

$text=htmlspecialchars($text_from_DB,ENT_QUOTES,'UTF-8',false);
<input type="text" value="<?=$text?>" />

Ben ('I "veritabanı alanında yazmak istemiyorum yani ya) özel karakterler veritabanına kaydetmek için çalışıyorum

Aslında metin yok htmlspecialchars_decode veritabanına yazarken.

Metin yok htmlspecialchars form metin kutusuna yazarken.

Bu veritabanına özel karakter yazma için güvenli iyi bir yaklaşım mı?

4 Cevap

Çiğ olarak veritabanında metin tutmanın doğru fikri var. Tüm HTML varlık şeyler için ne olduğundan emin değil; Eğer bir veritabanı ekleme için yapıyor olması gerekmez.

Eğer form gönderme girdi &#352; gibi karakter başvuruları alıyorsanız bulursanız [ben veritabanı için varlık-decode gelen girişine deneyebilirsiniz neden aklınıza tek nedeni olacaktır. Bu oluyor eğer kullanıcı formu ile sayfa tarafından kullanılan kodlama yoktur karakterleri girmek, bunun nedeni bu. Kodlamanın Bu form daha sonra kullanıcı yazarak Š ve tam anlamıyla yazarak ayırt edemez çünkü tamamen sahte olduğunu &#352;! Mümkün olan her karakter bu kodlama uyuyor gibi, tüm sayfalar ve içerik için UTF-8 kodlamasını kullanarak bu kaçınmalısınız.]

Lütfen komut dizeleri hep hayır kaçması ile ham metin olmalıdır. Yani düz metin olmayan bir bağlam içine onları çıkış zamana kadar onlara bir şey yapmıyoruz demektir. SQL dize içine koyarak Yani:

$category= trim($_POST['category']);
mysql_query("SELECT * FROM things WHERE category='".mysql_real_escape_string($category)."'");

(Veya elle kaçmak zorunda kalmamak için Parametrelenmiş sorguları kullanın.) HTML içine içerik koyarak zaman:

<input type="text" name="category" value="<?php echo htmlspecialchars($category); ?>" />

(Eğer gibi kısa bir adla bir yardımcı işlevi tanımlayabilirsiniz function h($s) { echo htmlspecialchars($s, ENT_QUOTES); } Eğer şablonları yapmak zorunda yazarak miktarını azaltmak istiyorsanız.)

Ve ... bu oldukça fazla bulunuyor. Zaten ham dizeleri konum olarak, veritabanı çıkıp dizeleri işlemek gerekmez. Eğer yapmak istediğiniz herhangi bir uygulama-özel alan doğrulama dışındaki giriş dizeleri (*), işlemek gerekmez.

*: Iyi, magic_quotes_gpc Sen stripslashes() get / post / cookie kanattan gelen her şeyi, ya da benim tercih seçeneği, sadece gerek yok ya, bu durumda açıksa hariç hemen başarısız:

if (get_magic_quotes_gpc())
    die(
        'Magic quotes are turned on. They are utterly bogus and no-one should use them. '.
        'Turn them off, you idiot, or I refuse to run. So there!'
    );

Ben bir kaç şey işaret etmek istiyorum:

  1. ' ve ", bir veritabanında gibi karakterleri tasarrufu yanlış bir şey yok, SQL enjeksiyonu aslında SQL veya veritabanları ile ilgisi var, dize manipülasyon meselesi vardır - Sorun only sorgu dizesi inşa nasıl dayanır. Sadece güvenli dize oluşturmak için onları bir kez kaçış, ve veritabanı olarak kaydedin: Kendi sorguları yazmak istiyorsanız, her kesme işareti veya çift tırnak kodlamak zorunda değilsiniz (önerilmez). Daha iyi bir yaklaşım belirtildiği gibi PDO kullanarak, ya da izin veren mysqli extension kullanarak hazırlanan ifadelere sorgular

  2. Her şeyden önce bu yararsız, DB umursamıyor: değil en az iki nedenden dolayı bir veritabanında saklanır için kodlama veri, tarayıcı çıkış olarak veri gönderirken htmlentities() ve benzeri fonksiyonlar kullanılmalıdır html varlıklar hakkında, sadece verileri içerir; ikincisi sen always, potansiyel olarak güvensiz veritabanından gelen verileri tedavi gerekir, bu yüzden "ham" biçiminde kaydetmek ve kodlamalıdırlar when using it.

Eğer, db htmlentities but when you read back, use html_entity_decode işlevini kullanmaya yazarken.

Bazı güvenlik arıyorsanız, bir dipnot düşmek gibi, o dizeleri mysql_real_escape_string and for numbers use intval kullanmak için.

DB güvenli yazma için en iyi yaklaşım PDO soyutlama katmanı kullanmak ve hazırlanan tabloların kullanımını sağlamaktır.

http://www.php.net/manual/en/intro.pdo.php

İyi bir öğretici (Ben bu birinden öğrendim) olduğunu

http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html

Ancak, sadece bu uygulama için sitenizin sürü yeniden yazmak zorunda kalabilirsiniz. Ama bu hiç şüphesiz tüm bu fonksiyonları kullanarak yapmak yerine en şık yöntemdir. Ayrıca, hazırlanan tablolar şimdi de facto haline gelmektedir. Bunun bir başka yararı size (örneğin MySQL PostgreSQL gibi) farklı bir veritabanına geçiş eğer sorguları yazmak zorunda kalmamasıdır. Ama sitenizi büyütmek için planlıyorsanız, bu düşünün söyleyebilirim.