Gelen dizeleri TÜM önemsiz kaldırmak için rutin?

4 Cevap php

Bir kullanıcı bir giriş forma veri kopyalayıp yapıştırırken olduğunda bazen aşağıdaki gibi bir karakter:

son teklif, vb başlayan tırnak ve â € œ â için € € ™ t, didnâ ...

(Ben bir süre önce yazmış ama aynı zamanda iyileştirmeler için arıyorum) web formları en çok girdiyi bu rutin kullanımı:

function fnSanitizePost($data) //escapes,strips and trims all members of the post array
{
    if(is_array($data))
    {
    $areturn = array();
    foreach($data as $skey=>$svalue)
    {
      $areturn[$skey] = fnSanitizePost($svalue);
    }
    return $areturn;
  }
  else
    {
      if(!is_numeric($data))
    	{
    		//with magic quotes on, the input gets escaped twice, which means that we have to strip those slashes. leaving data in your database with slashes in them, is a bad idea
    		if(get_magic_quotes_gpc()) //gets current configuration setting of magic quotes
      {
        $data = stripslahes($data);
      }
        $data = pg_escape_string($data); //escapes a string for insertion into the database
        $data = strip_tags($data);  //strips HTML and PHP tags from a string
      }
    	$data = trim($data);  //trims whitespace from beginning and end of a string
      return $data;
    }
}

Ben gerçekten hiç veritabanında saklanan alıyorum yukarıda bahsettiğimiz gibi karakterleri önlemek istiyorsanız, benim sanitasyon rutin bazı regex yedek eklemeniz gerekiyor?

Teşekkürler,

- Nicholas

4 Cevap

I finally bu karakterleri değiştirmek için bir rutin ile geldi. Bir seferde sorunlu dizeleri bir karakter bazı ayrıştırma ve her karakterin sekizlik değer döndüren aldı. Bunu yaparken akıllı alıntı karakterler 3 sekizlik değerler bütünü olarak geri geldiğini öğrendim. İşte dizesini ayrıştırmak için kullanılan rutin:

$str = "string_with_smart_quote_chars";

$ilen = strlen($str);
$sords = NULL;

echo "$str\n\n";

for($i=0; $i<$ilen; $i++)
{
    $sords .= ord(substr($str, $i, 1))."  ";
}

echo "$sords\n\n";

İşte str_replace () dizesini "düzeltmek" için çağırır şunlardır:

$str = str_replace(chr(226).chr(128).chr(156), '"', $str); // start quote
$str = str_replace(chr(226).chr(128).chr(157), '"', $str); // end quote
$str = str_replace(chr(226).chr(128).chr(153), "'", $str); // for single quote

Ben karakterlerin bu tür artan kullanımı ile büyümeye devam edecektir eminim bu arama / yedek bir dizi oluşturulmasına devam edeceğim.

Ben orada bazı konserve rutinleri, bu değiştirilmesi için ama benim komut üzerinde çalışan Solaris 10'da bunlardan herhangi biri ile hiçbir şans olduğunu biliyoruz.

- Nicholas

başlayan tırnak ve â sonu teklif için için € â œ € € ™ t, didnâ

Bu önemsiz değil, bu UTF-8 olarak kodlanmış sizin için kabul edilmiştir meşru "akıllı alıntı" karakterler, ancak yanlış okumak, ISO-8859-1.

Onlardan kurtulmak için deneyin ya da düz eski Latin-1 kullanarak utf_decode onları ayrıştırmak denemek, ancak bunu yaparsanız, bu gün ve yaş bir şey dışında ASCII, yazın izin vermeyeceğim bir uygulama olacak olabilir oldukça kötü bir gösteri.

Daha iyi tüm sayfalarınız tüm form gönderimler UTF-8 gibi geliyor, UTF-8 olarak görev yaptı ve tüm veritabanı içeriği UTF-8 olarak depolanır olmasıdır yönetebilirsiniz. İdeal olarak, uygulama tüm Unicode karakterleri ile içten çalışmak istiyorsunuz, ama ne yazık ki bir dil olarak PHP yerli Unicode dizeleri yok, bu yüzden genellikle UTF-8 olarak da tüm ipleri elinde tuttuğu ve zaman zaman kesilmesi riskini alarak bir durumda bir UTF-8 serisi ve alıyorum, sen Mbstring uğraşmak istemiyorsanız.

$ Data = pg_escape_string ($ veri); / / Veritabanına yerleştirilmesi için bir dize kaçar

$ Data = strip_tags ($ veri); / / Bir dizeden HTML ve PHP etiketlerini şeritler

Eğer uygulama haline gelen bir sanitisation tedbir olarak bunu yapmak istemiyorum. Sonra sadece bir Postregs sorgu için dışarı yolda () pg_escape_string, ellemeden için düz metin şeklinde tüm dizeleri tutmak ve htmlspecialchars () sadece bir HTML sayfası için dışarı yolda.

Aksi takdirde, SQL çıkış sayfasına düz komut dosyası üzerinden geçti değişkenler üzerinde görünen kaçar, ve kimse bir ova karakteri az-daha kullanmak mümkün olacak gibi garip şeyler alırsınız.

Eğer can yararlı bir sanitisation önlem olarak yapılacak tek şey (size makul isteyebileceğiniz, satırsonlarının dışında, \ n) dizeleri herhangi bir kontrol kodlarını kaldırmaktır.

$data= preg_replace('/[\x00-\x09\x0B-\x19\x7F]/', '', $data);

Sen PHP's utf_decode fonksiyonunu kontrol etmek istiyorum: tek bayt ISO-8859-1 UTF-8 ile kodlanmış ISO-8859-1 karakter içeren bir dize dönüştürür. Bu UTF karakter alıyoruz ve veritabanı bu işlemek mümkün değil gibi görünüyor.

Başka bir çözüm, mümkünse, veritabanının kodlama değiştirmektir.