Bu php kod güvenli mi?

6 Cevap php

Ben hazırlanan ifadenin kullanarak gerektiğini farkında değilim ama benim bir sonraki projesi hazırlanan ifadenin Ben sadece bu basit küçük uygulamayı bitirmek gerekir kullanarak olacaktır.

Yani benim soru:

Bu kod aşağıdaki kod parçasının güvenli midir?

Ben güvenli bir seçenek olduğunu düşündüm çünkü ben mysql_real_escape_string olarak htmlentities lutfen kullandık.

//Image 
$imageInput = $_POST['Image'];
$imageClean = htmlentities($imageInput, ENT_QUOTES, 'UTF-8');



//Inserts values into relevant field and creates a new row.
mysql_query("UPDATE ***** SET image='" . mysql_real_escape_string($imageClean) . "'     WHERE id=" . mysql_real_escape_string($idClean) . "");

$ idClean için kod eklemek için:

//Id to change
if(ctype_digit($_POST['testimonial']))
{
    $idInput = $_POST['testmonial'];
    $idClean = htmlentities($idInput, ENT_QUTOES, 'UTF-8');
}

Yardımlarınız için teşekkürler.

ps bu harika olurdu eklemek için bir şey önermek eğer.

6 Cevap

Sadece varlık çıkış noktasında kaçan geçerli olmalıdır - öncesinde veritabanı ekleme verileri kaçan hiçbir değeri yoktur. Yani mysql_real_escape_string açısından doğru olanı yapıyoruz, dedi.

Piskvor @ gibi, bunun dışında idClean değişkeni ile olası bir sorun olduğunu söylüyor. (Bu örnek için bir int cast ediliyor mu?)

Örneğin aşağıdaki kullanabilirsiniz:

mysql_real_escape_string(intval($idClean))

$ IdClean nereden geliyor?

Başka bir $ _POST? bir tamsayı olması gerekiyordu, öyle değil mi?

Yüklü üzerinde html sanitization yapmak, sadece $idClean = (int)$_POST['id']; ... 'güç' bir tamsayı olmak üzere, (demek sadece $ idCelan için) tüm olası xss / SQL enjeksiyon 'öldürme' olacak

Ve genel konuşma, hiç kimse best way girişleri sterilize etmek için vardır; Tüm bu stored olacak yerde, what the input should contain yaklaşık bağlıdır ve ne kadar ileride used olacaktır.

EDIT: middaparka cevaba Yorumlarınız sonra, i $ idClean bir form (muhtemelen bir gizli giriş) gelen varsayalım.

Eğer bu form bile maliciuos kullanımlarını engellemek istiyorsanız, ben size karma $ idclean ile başka bir gizli alan eklemek için önermek, ve birisi elle kimliği değişti eğer bunu yapmazsa o zaman karma için işlem sayfa kontrol (görmek için zaten)

Bu genellikle kullanıcı yönetimi bir yanlış tasarım, sizin davranış olup olmadığını bilmiyorum.

$ _POST ['Resim'] bir tanım olduğunu varsayarsak, hayır. Birisi javascript kullanarak bir URI gönderebilir: düzeni ve diğer kişilerin keyfi JavaScript çalışmasına neden olur.

"Görüntü" ve kimliği için karakter beklenen aralığı nedir? Girişi kaçan iyi bir fikir olsa da, her zaman giriş yalnızca belirli bir veri türü için meşru karakterler içerdiğini kontrol etmelisiniz. örneğin

if (preg_match("/\w(\w|\\.){0,31}/", $imageInput) && preg_match("/\d{1,12}/", $idClean)) {
// do database update
} else {
// invalid input, let the user know!
}

$ ImageInput üzerinde Yukarıdaki regex sadece alfanümerik bir görüntü adını izin altını ve ona tam durdurmak gerekir. 1 ila 32 karakter uzunluğunda (Size veritabanı tanımı için bu maç isterim). Hiçbir diğer karakterler izin verdi. Ben, hafızasını regex kapalı yaptı kaçışa doğru değilse beni affet, ama bilinen iyi girişine karşı sterilize etmek için regex kullanarak prensibi gitmek için yoludur.

Veritabanı güvenliği dikkate almak gerekir güvenliği tek yönü değildir. Cross site scripting (XSS) düşünün. Ne kullanıcı olarak görüntü adını girerse: javascript: alert ('abc'); Eğer kullanıcıya geri görüntülemek o zaman kendi tarayıcısında idam edecek!

Eğer id=xyz ile bir sorunu var daha önce söylendiği gibi. Ama daha çok php bir tamsayı için dönüştürme yerine iki nedenden dolayı da, bir dize olarak geçerdi:

  • Sen kod belirli bir kısmını dokunmadan id alanının türünü değiştirebilirsiniz. Bir id her zaman bir tamsayı olmak zorunda değildir.
  • PHP'nin tamsayı (maksimum değer esp.) değer aralığı alan tanımının türü daha küçük olabilir.

connection charset mysql_real \ () escape_string davranışını etkiler. İkinci parametre mysql_real \ () escape_string olarak nedenle bağlantı kaynak geçmelidir.

Verileri takmadan önce htmlentitiesi () veya kullanmak isteyip elde etmek istediğinize bağlıdır. Hiç html/utf-8 daha başka bir şey olarak veri gerekiyorsa onu geri dönüştürmek gerekiyor. Bu tam olarak güvenlik ile ilgili olmadığı ama .... senin yol var ;-)

$mysql = mysql_connect('..', '..', '..');
//...
$query = sprintf("
  UPDATE
    *****
  SET
    image='%s'
  WHERE
    id='%s'
  ", 
  mysql_real_escape_string($imageClean, $mysql),
  mysql_real_escape_string($id, $mysql)
);

Oh, ve bu arada: Kime ipucu hazırlanmış tablolara: http://docs.php.net/pdo.prepared-statements