Htmlentities 'UTF-8' belirledi zaman yüklenmiyor Görüntüler

1 Cevap

Ben diğer şeylerin yanı sıra, yüklemek için bir görüntü kabul eder ve veritabanında sopa, bir form var. Daha önce ben temelde POSTed verileri süzme bir işlevi vardı:

function processInput($stuff) {
    $formdata = $stuff;
    $formdata = htmlentities($formdata, ENT_QUOTES);
    return "'" . mysql_real_escape_string(stripslashes($formdata)) . "'";
}

Dönüştürülmüş elde olmayan bazı garip varlıkları düzeltmek için bir çaba düzgün ben işlevi değişti, (herşey değişti ben ekledi olduğunu Htmlentities içinde 'UTF-8' bit):

function processInput($stuff) {
        $formdata = $stuff;
        $formdata = htmlentities($formdata, ENT_QUOTES, 'UTF-8'); //added UTF-8
        return "'" . mysql_real_escape_string(stripslashes($formdata)) . "'";
    }

Ve şimdi görüntüleri yüklemek olmaz.

Bu neden olur? Basitçe 'UTF-8' bit kaldırarak görüntüler, kullanıcıların sisteme koymak MS Word bazı kurumları anlamsız olarak göstermek doğru ama sonra upload sağlar. Neler oluyor?

**EDIT: Since I cannot do much to change the code on this beast I was able to slap a bandaid on by using htmlspecialchars() rather than htmlentities() and that seems to at least leave the image data untouched while converting things like quotes, angle brackets, etc. bobince's advice is excellent but in this case I cannot now spend the time needed to fix the messy legacy code in this project. Most stuff I deal with is object oriented and framework based but now I see first hand what people mean when they talk about "spaghetti code" in PHP.

1 Cevap

function processInput($stuff) {
    $formdata = $stuff;
    $formdata = htmlentities($formdata, ENT_QUOTES);
    return "'" . mysql_real_escape_string(stripslashes($formdata)) . "'";
}

Bu fonksiyon string işlemlerinde temel bir yanlış anlama, PHP programcıları için ortak birini temsil etmektedir.

SQL-öncelemeli, HTML-kaçan ve giriş doğrulama senaryonun farklı aşamalarında kullanılmak üzere üç ayrı işlevleri vardır. Bu tek seferde hepsini yapmak için denemek için hiçbir mantıklı; Bu komut, sadece diğer bölgelerinde kullanıldığında karıştırılmış alma işlemlerinin herhangi birine "özel" karakterler neden olur. Sen app bir bölümünde bozma düzeltmek için denemek için bu fonksiyon ile tamircilik deneyebilirsiniz, ancak başka bir şey kıracak.

Resimler neden karıştırıldıysa ediliyor? Peki, bu yolu görüntü verileri veritabanına bir $_FILES geçici yükleme dosyası ne oluyor hemen üzerinden net değil. Bu fonksiyon olsa herhangi bir noktada söz konusu ise, bu tamamen bir görüntü dosyasının ikili içeriği mahvedecek. Ters eğik görüntü yok bu hayatta olabilir ... kaldırılır ve HTML-kaçtı.

  1. mysql_real_escape_string değişmez MySQL dize eklenmek için bazı metin kaçan içindir. Bu eklenen metin ile değişmez bir SQL dizesi yaparken her zaman-ve-sadece kullanılan ve not küresel girişine uygulanmalıdır. Giriş gelip bazı şeyler veritabanına hemen veya sadece gitmiyorum çünkü. Eğer echo HTML sayfasına giriş değerlerden biri, göreceksiniz eğer ' gibi karakterler içeriyorsa Örneğin, bunu istenmeyen tersbölülerden bir demet olsun. Bu kaçak tersbölülerden dolu sayfaları ile sonuna kadar nasıl olduğunu.

    (Hatta daha sonra, parameterised sorguları manuel dize hack ve mysql_real_escape_string. Onlar bunları tarafından karıştı alamadım böylece dize sizden kaçan ayrıntılarını gizlemek için genelde tercih edilir.)

  2. htmlentities, bir HTML sayfası eklenmesi için metin kaçan içindir. Bu PHP çıktı çiftleşmiş bit her zaman-ve-sadece kullanılmalıdır. Her şey bir HTML sayfası veya sadece bir HTML sayfası sonuna kadar gidiyor, ve büyük olasılıkla bu kesinlikle bir yük istemiyorum ilk nereye veritabanına gidecek çünkü tüm girişi üzerinde küresel çalıştırmak için uygun değildir ve < ve & çöp metin aramak için başarısız yapmak veya güvenilir substrine.

    (Hatta daha sonra, htmlspecialchars sadece gerçekten ihtiyacınız karakterleri kodlar olarak htmlentities gereksiz kaçışa katacak. Genellikle htmlentities tercih edilir, ve bunu söylemek sürece Doğru tüm ASCII olmayan karakterler aynı olacak aynı zamanda tamamen pisliği kodlayan. htmlentities kullanılmamalıdır neredeyse asla.)

  3. Gibi stripslashes ... iyi, sometimes aptalca magic_quotes_gpc seçeneği açık olduğunda giriş için bu uygulamak gerekir, ama. Sen kesinlikle magic_quotes_gpc üzerinde tespit sadece, o her zaman geçerli olmamalıdır. Uzun kalktı ve minnetle ölüyor, o yüzden açıldıktan tespit eğer bir hata mesajı ile bomba muhtemelen gibi iyi olmaz. Sonra uzakta tüm processInput şeyi ayna olabilir.

Özetlemek gerekirse:

  • Başlangıç ​​saatinde, no küresel giriş işleme yapmak. İstersen burada uygulamaya özgü doğrulama yapabilirsiniz, bir telefon numarasını kontrol gibi sadece sayılar, metin veya bir şey kontrol karakterleri kaldırarak, ama hiçbir Buradaki kaçış olmalıdır.

  • Içinde bir dize ile bir SQL sorgusu yaparken, kullanmak SQL kaçan bu dize gider olarak değer: $query= "SELECT * FROM t WHERE name='".mysql_real_escape_string($name)."'";. Bazı yazarak kaydetmek için kaçışa yapmak için kısa bir isimde bir fonksiyon tanımlayabilirsiniz. Ya da, daha okunabilecek, parametreleme.

  • Başka girişten dizeleri veya veritabanı veya HTML çıkış yaparken, HTML-kaçan, örneğin kullanın:. <p>Hello, <?php echo htmlspecialchars($name); ?>!</p>. Yine, yazarak kaydetmek için echo htmlspecialchars yapmak için kısa bir isimde bir fonksiyon tanımlayabilirsiniz.