Bir php fonksiyon parametreleri içindeki boşluğun Sorunları

4 Cevap php

Benim kod biçimlendirme için üzgünüm. Araç çubuğu gitmişti ...

Ben bir mysql db bazı verileri eklemek istediğiniz. Ben php bir fonksiyon yazmıştım:

function add_ID($ID, $token)  {
 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
 mysql_query($add);
 echo 'added successfully';
}  
if(isset($_GET['addDeviceID'])) {
 add_ID($_GET['ID'], $_GET['token']);
}

In the URL-Field of my Browswe I'am calling the function like that: http://www.justanexample.com/example.php?ID=123123123&token=qwertzuiop

Bu çalışıyor.

If I put a space into either one of the parameters for example like that: http://www.justanexample.com/example.php?ID=123123 123&token=qwertzuiop

Hiçbir şey benim mysql db eklendi.

Would be great to get some help :) Thank you!

4 Cevap

Sizin işlevi SQL enjeksiyon için açıktır. Bir SQL sorgusunda kullanmadan önce tüm kullanıcı alınan parametreleri doğrulamak, ve mysql_real_escape_string üzerinden herhangi dizeler geçirmek, sonra ben sadece example.php?token='; DROP DATABASE; gibi bir şey geçmek çünkü Asil bozsun senin uygulama.

Sizin durumda, alınan parametreler ilk beklediğiniz formda olduğu bir kontrol yapmak gerekir onlar yoksa kullanıcıya bir hata döndürür, ve ancak o zaman SQL sorgusuna onları geçmek.

function add_ID($ID, $token)  {
  $id = mysql_real_escape_string($id);
  $token = mysql_real_escape_string($token);

  $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
  mysql_query($add);
  echo 'added successfully';
}  

if(isset($_GET['addDeviceID'])) {
  $id    = isset($_GET['id']) ? $_GET['id'] : 0; // in case no ID has been passed in
  $token = isset($_GET['token']) ? $_GET['token'] : '';

  if (!is_numeric($id) {
    die('ID is not a number');
  } 

  // validate token here as well

  add_ID($id, $token);
}

Ayrıca, sadece dize birleştirme kullanarak daha parametreleri ile SQL sorguları yapmanın genel çok daha iyi bir yoldur parametrelenmişse sorgular, içine bakmak gerekir. Bunun için, mysqli uzantısı yerine mysql, ya da daha yüksek bir düzeyde, PDO'de de kullanarak içine bakmak.

Sen veritabanına göndermeden önce girişini doğrulamak gerekir. Doğrulama mümkün değilse Veya, filtre ve / veya değerini kaçış.

Validation

Eğer düşünüyorsanız ID sıfırdan büyük bir tamsayı olmak için:

if (!ctype_digit($ID)) {
    // invalid ID
}

Eğer düşünüyorsanız token bir alfanümerik dize olması:

if (!ctype_alnum($token)) {
    // invalid token
}

Filtering

Geçerli olur böylece Filtreleme girişi geçersiz parçaları kaldırıyor:

if (!ctype_digit($ID)) {
    $ID = preg_replace('/\D+/', '', $ID);
    // $ID does now only contain digits
}
if (!ctype_alnum($token)) {
    $token = preg_replace('/\D+/', '', $token);
    // $token does now only contain alphanumeric characters
}

Escaping

Kaçan bazı dize context string declaration in MySQL . PHP has the mysql_real_escape_string fonksiyonunun bu amaç için iyi:

$add = "INSERT INTO ids (ID, token) VALUES ('".mysql_real_escape_string($ID)."', '".mysql_real_escape_string($token)."')";

str_replace function örneğin kullanarak onlardan boşluk çıkarmak:

 $ID = str_replace(' ', '', $ID);
 $token= str_replace(' ', '', $token);

 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";

Ayrıca, ben örneğin tırnak belirtmeden sorguyu çalıştırmak böylece $ kimliği tablodaki bir tamsayı alanı olduğunu sanıyorum:

 $add = "INSERT INTO ids (ID, token) VALUES ($ID, '$token')";

Sizin kod bir hata varsa Sorgu başarıyla hiç kontrol etmeden tamamlar üstleniyor. Ben nedeniyle mekanlara bir sözdizimi hatası olacak tahmin ediyorum. Kimlik alanı sonra tamsayı türü, yapıyor ise ID=123 123 sözdizimi hatası olacaktır. Aşağıdaki gibi tüm SQL enjeksiyonu ve diğer yanıtlar tavsiye sanitasyon verileri dahil olmak üzere, sizin add_ID işlevini yeniden gerekir:

function add_ID($ID, $token) {
  $query = 'blah blah blah';
  mysql_query($query);
  if (mysql_error()) {
       echo 'ruhroh, someone set us up the bomb: ', mysql_error();
  } else {
       echo 'woohoo, it worked!';
  }
}

En azından bu sorgu gerçekten başarılı eğer size ve o olmasaydı patladı ne olacak. Herhangi bir tür bir veritabanı sorgu başarılı olacağını varsayabiliriz asla. Yukarıdaki gibi işleme hatta bazı basit hata var DEĞİL (sunucu, vs disk alanı, bağlantı havuzu bitkin, işlem kilitlenme öldü ..) havaya uçurmak için çok fazla yolu var.