Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
11
Cevap
2665
Tıklama
0
Öne Çıkarma
Textarea'dan Kod Girişini Engellemek
U
20 yıl
Binbaşı
Konu Sahibi

Sevgili Dostlar;
Hazırladığım web sayfasında kullanıcıların <textarea> veya <text> alanlarından girecekleri muhtemel HTML etiketlerini nasıl etkisiz hale getirip PHP tarafından düz yazı olarak algılanmalarını sağlayabilirim? Bunun kolay bir yolu var mı, yoksa gönderilen değeri kendim inceleyip '<' ve '>' karakterleri için önlem mi almalıyım?
İkinci bir sorum da şu: Kullanıcıya bir textarea veriyorum ve oraya yazdığı yorumları mysql veritabanıma gönderiyorum. Daha sonra bu bilgileri php kullanarak bastırıyorum. Ancak kullanıcının girmiş olduğu enter(newline) karakterleri kaybolmuş oluyor. Bunu nasıl engellerim?
Yardımlarınız için şimdiden teşekkür ederim.

[Değiştir]
Şu aşağıdaki kodları yazdım. Sizce bunlar ilk sorumu tamamen çözümler mi, gözümden kaçan birşey var mı?
 
$yorum_metni = str_ireplace("&", "& amp;", $yorum_metni);
$yorum_metni = str_ireplace("<", "& lt;", $yorum_metni);
$yorum_metni = str_ireplace(">", "& gt;", $yorum_metni);

Not: &'lerden sonra birer boşluk bıraktım çünkü donanımhaber onları da çeviriyordu. Asıl kodda o boşluklar yok.

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil





< Bu mesaj bu kişi tarafından değiştirildi un.real -- 4 Şubat 2006 18:43:02 >

U
20 yıl
Binbaşı
Konu Sahibi

Birinci sorum için şöyle birşeyler buldum:

htmlentities() - Kullanınca Türkçe karakter sorunu çıkıyor, 'ı', 'ş' gibi harfler değişiyor. Uygun charset parametresini bulamadım bu fonksiyon için. UTF-8 tutmadı, ISO-8859-9 yazdım çalışmadı.

html_entity_decode()

htmlspecialchars()

htmlspecialchars_decode() - Elimdeki PHP versiyonu tarafından desteklenmiyor.

Yukarıdaki fonksiyonları kullanınca ortak olarak karşılaştığım sorun şu: tek tırnak ve çift tırnak işaretlerinin yanını bir kaçış karakteri ('\') konuluyor. Her ne kadar ENT_NOQUOTES parametresini kullanmış olsam da işe yaramadı.
Lütfen yardım edin.


Bu mesaja 2 cevap geldi.
U
20 yıl
Binbaşı
Konu Sahibi

İlk soruyu şu şekilde çözdüm: gönderdiğim veriyi önce htmlspecialchars() ile işliyorum. Veritabanına kaydettikten sonra (Veriyi gösterime sokarken) stripslashes() fonksiyonu ile tırnak işaretlerinin etrafındaki kaçış karakterlerini siliyorum.

 
$text = htmlspecialchars($text); //HTML karakterleri uçuyor :)
mysql_query("INSERT INTO my_table (text_buraya) VALUES ('$text')");//Veritabanına gönderiyorum.
$text = stripslashes($text);//tırnak işaretlerinin etrafındaki kaçış karakterlerini ('\') siliyorum.


Not: sanırım ikinci mesajımda belirttiğim hata, sistemimde "magic quotes" özelliği açık olduğu için oluyor. Ancak şimdi onu kapatmak işime gelmiyor. Çünkü sanırım DB query'lerim için gerekli imiş.

İkinci sorum hakkında araştırmalarım sürüyor :) Yardımcı olacaklara şimdiden teşekkürler.





< Bu mesaj bu kişi tarafından değiştirildi un.real -- 4 Şubat 2006 20:06:04 >

A
20 yıl
Yüzbaşı

Arkadaşım o tırnaklara kaçış karakteri koymazsa sql enjectiona neden olabilir.O nedenle koyması daha iyidir.

daha sonra yazdırırken

stripslashes($yazi);

gibi yazdırırsın.

Girerkende strip_tags kullan

strip_tags($yazi);

bütün tagları siler

strip_tags($yazi, '<br>');

<br> dışındakileri siler yani istediğin tagları yazabilirsin bu şekilde.


Bu mesaja 1 cevap geldi.
U
20 yıl
Binbaşı
Konu Sahibi

quote:

Orjinalden alıntı: acayip

Arkadaşım o tırnaklara kaçış karakteri koymazsa sql enjectiona neden olabilir.O nedenle koyması daha iyidir.

daha sonra yazdırırken

stripslashes($yazi);

gibi yazdırırsın.


quote:

Orjinalden alıntı: acayip

Girerkende strip_tags kullan

strip_tags($yazi);

bütün tagları siler

strip_tags($yazi, '<br>');

<br> dışındakileri siler yani istediğin tagları yazabilirsin bu şekilde.



Yaptığım şeyi biraz açıklığıa kavuşturayım: Ben bir blog sayfası hazırlıyorum ve bu sayfada okuyucuların yorum girmeleri için bir form hazırladım. kullanıcı eğer formda eksik alan bırakırsa, bir hata mesajı alıyor ve orayı doldurması isteniyor. Mesela emailini yazmamış ise buna göre uyarılıyor. Tabi bu arada sayfa reload edilmiş oluyor. Ben de herhangi bir hata oluştuğunda bütün bilgiler tekrar girilmek zorunda kalınmasın diye onları $_GET[] ile tekrar alıp eski yerlerine koyuyorum.
Şimdi benim istediğim şey şu: textarea'daki '\n' karakterlerini oldukları şekliyle veritabanına atınca, tekrar geri çekip yorumlar tablosunda gösterirken uygun şekilde göstermiyor. Sanki kullanıcı tek bir satırda yazmış gibi görünüyor. Bunu engellemek için ilk önce str_ireplace() kullanarak bütün '\n' karakterlerini '<br>' yaptım. Ancak böyle olunca da bir hata durumunda textarea'ya ekstradan <br> yazılmış oluyor. (Umarım anlatabilmişimdir.)
Gerçi bu durumdan kurtulmanın basit bir yolu var. str_ireplace()'i tekrar kullanarak, bu sefer '<br>'lerin yerine '\n' yazılabilir. Ancak bu işin daha otomatik bir yolu olduğunu sanıyordum ben. Eğer bulamazsam yine bu şekilde yapmayı deneyeceğim.
İlgin için teşekkür ederim.


Bu mesaja 2 cevap geldi.
Y
20 yıl
Yüzbaşı

ilk önce sayfayi geri çağı history.go(back) diye ozaman zaten şifreli bölüm haricindekiler geri gelecektir ?
bu olmazsa
geçici bir veri tabanı oluştur. oraya yazdır hata varsa ordan okutarak veri ata ?



U
20 yıl
Binbaşı
Konu Sahibi

Tamamdır o da :)
Veritabanına kaydetmeden önce "\n" -> "<br>" değişikliğini yapmıyorum.
Sadece gösterim sırasında yapıyorum bunu.


Bu mesaja 1 cevap geldi.
A
20 yıl
Yüzbaşı

senin işini nl2br($yazi) görür o zaman, bu fnksiyon \n leri <br> ye çevirir yazdırırken.

yalnız şunu söyleyim , eğer içinde \n geçen yerleri tek tırnak içinde yazdırıyorsan aynen yazar.Fakat çift tırnak içinde olursa php yorumlar ve boşluk atar. Yani

$text="Buraya isteğinizle ilgili açıklamayı\n\n\n yazabilirsiniz."

şeklinde olursa yazabilirsiniz üç satır altta çıkar textarea da

fakat

$text='Buraya isteğinizle ilgili açıklamayı\n\n\nyazabilirsiniz.';

ise aynen çıkar.

istediğin yolu kullan,bir de windows sunucularda \n yerine \r\n kullanman gerekir bazı yerlerde unutma

Birde benden tavsiye verileri GET ile tutacağına sessionda tut daha güzel olur, hem çirkin görünmez.Birde ilk doğrulama kısmını javascript ile yaparsan boşu boşuna geri dönmeye gerek kalmaz, tabii güvenlik için php ile de doğrulama yaparsın fakat kötü niyetli olmayan için zaten jscript uyarı verir.


Bu mesaja 1 cevap geldi.
U
20 yıl
Binbaşı
Konu Sahibi

quote:

Orjinalden alıntı: acayip

senin işini nl2br($yazi) görür o zaman, bu fnksiyon \n leri <br> ye çevirir yazdırırken.


Teşekkürler bu daha derli toplu durdu.[;')]

quote:

Orjinalden alıntı: acayip
yalnız şunu söyleyim , eğer içinde \n geçen yerleri tek tırnak içinde yazdırıyorsan aynen yazar.Fakat çift tırnak içinde olursa php yorumlar ve boşluk atar. Yani

$text="Buraya isteğinizle ilgili açıklamayı\n\n\n yazabilirsiniz."

şeklinde olursa yazabilirsiniz üç satır altta çıkar textarea da

fakat

$text='Buraya isteğinizle ilgili açıklamayı\n\n\nyazabilirsiniz.';

ise aynen çıkar.


Sanırım tam olarak anlamadım demek istediğin şeyi. Ben şu şekilde yapıyorum:
<?=$query_result_row[0]?>


quote:

Orjinalden alıntı: acayip

istediğin yolu kullan,bir de windows sunucularda \n yerine \r\n kullanman gerekir bazı yerlerde unutma

Birde benden tavsiye verileri GET ile tutacağına sessionda tut daha güzel olur, hem çirkin görünmez.Birde ilk doğrulama kısmını javascript ile yaparsan boşu boşuna geri dönmeye gerek kalmaz, tabii güvenlik için php ile de doğrulama yaparsın fakat kötü niyetli olmayan için zaten jscript uyarı verir.

GET demişim, POST olacak doğrusu.
Javascripti de ilerki safhalarda eklemeyi düşünüyorum. Ama herşeyi javascripte bırakmak uygun değil diye düşünüyorum.


Bu mesaja 1 cevap geldi.
U
20 yıl
Binbaşı
Konu Sahibi

Bir de gitmeden şunu sorayım. Diyelim bir adam yorum olarak 1000 tane 'h' karakteri girdi. ('h' karakterinin özel bir durumu olduğu için söylemiyorum herhangi bir karakter girdi diyelim, aralıksız, çok sayıda.)

bu durumda gösterime girildiği zaman yorumların altalta konulduğu tablo şişiyor. ben bu tablonun şişmesini istemiyorum. mümkünse "wrap" özelliği gibi birşey istiyorum. Bunun pek PHP ile alakası yok sanırım. ama yardımcı olabilirsen sevinirim.


Bu mesaja 1 cevap geldi.
A
20 yıl
Yüzbaşı

php de wordwrap var bunun için

$text=wordwrap($text, 20, '<br />',1);

$text değişkenini 20 karakterde bir verdiğin karakterle böler burada <br> ile bölüyoruz istersen onun yerine \n kullanabilirsin. Üçüncü değişken yani 1 true veya false değeridir, eğer yazı aralıksızsa da böler.Yani

$text='deneme birrrrrrrrrrrrrrrr iki üç'; olsun
$text=wordwrap($text, 20, '<br />');

deneme
<br>
birrrrrrrrrrrrrrrr iki üç

yazarken

$text=wordwrap($text, 20, '<br />',1);

deneme birrrrrrrrrrr
<br>
rrrrr iki üç

yapar


Bu mesaja 1 cevap geldi.
U
20 yıl
Binbaşı
Konu Sahibi

Harika!
Çok teşekkürler.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.