PHP'de SQL enjeksiyonunu nas─▒l ├Ânleyebilirim?


Al─▒nan cevaba git


Kullan─▒c─▒ giri┼či bir SQL sorgusuna de─či┼čiklik yap─▒lmadan eklenirse, uygulama a┼ča─č─▒daki ├Ârnekte oldu─ču gibi SQL enjeksiyonuna a├ž─▒k hale gelir :

 $unsafe_variable = $_POST['user_input']; 

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
 

Bunun nedeni, kullan─▒c─▒n─▒n ┼č├Âyle bir ┼čey girebilmesi value'); DROP TABLE table;-- ve sorgulaman─▒n ger├žekle┼čmesidir:

 INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
 

Bunun olmas─▒n─▒ ├Ânlemek i├žin ne yap─▒labilir?


2776









Cevap say─▒s─▒n─▒ say: 28






Haz─▒rlanan ifadeleri ve parametreli hale getirilmi┼č sorgular─▒ kullan─▒n. Bunlar, veritaban─▒ sunucusu taraf─▒ndan herhangi bir parametreden ayr─▒ olarak g├Ânderilen ve ayr─▒┼čt─▒r─▒lan SQL ifadeleridir. Bu ┼čekilde bir sald─▒rgan─▒n zararl─▒ SQL enjekte etmesi imkans─▒zd─▒r.

Bunu ba┼čarmak i├žin temel olarak iki se├žene─činiz var:

  1. Kullan─▒lmas─▒ PDO (herhangi bir desteklenen veritaban─▒ s├╝r├╝c├╝s├╝ i├žin):

     $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
    
    $stmt->execute(array('name' => $name));
    
    foreach ($stmt as $row) {
        // Do something with $row
    }
     
  2. Kullan─▒lmas─▒ MySQLi (MySQL i├žin):

     $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
    $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'
    
    $stmt->execute();
    
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        // Do something with $row
    }
     

MySQL d─▒┼č─▒ndaki bir veritaban─▒na ba─član─▒yorsan─▒z, ba┼čvurabilece─činiz s├╝r├╝c├╝ye ├Âzg├╝ ikinci bir se├ženek vard─▒r (├Ârne─čin pg_prepare() ve pg_execute() PostgreSQL i├žin). PDO evrensel bir se├ženektir.

Ba─člant─▒y─▒ do─čru ┼čekilde kurma

PDO Bir MySQL veritaban─▒na eri┼čmek i├žin kullan─▒rken , ger├žek haz─▒rlanm─▒┼č ifadelerin varsay─▒lan olarak kullan─▒lmad─▒─č─▒n─▒ unutmay─▒n . Bunu d├╝zeltmek i├žin haz─▒rlanan ifadelerin em├╝lasyonunu devre d─▒┼č─▒ b─▒rakmak zorundas─▒n─▒z. PDO kullanarak ba─člant─▒ olu┼čturman─▒n bir ├Ârne─či:

 $dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'password');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 

Yukar─▒daki ├Ârnekte, hata modu kesinlikle gerekli de─čildir, ancak eklenmesi ├Ânerilir . Bu ┼čekilde, bir Fatal Error ┼čeyler ters gitti─činde senaryo durmaz . Ve bu geli┼čtiriciye ┼čans─▒ verir catch hi├žbir hata (s) throw n PDOException s.

Ne zorunludur , ancak, ilk setAttribute() devre d─▒┼č─▒ Taklit haz─▒rlanm─▒┼č tablolara ve kullan─▒m─▒ PDO s├Âyler hatt─▒, ger├žek haz─▒rlanm─▒┼č deyimleri. Bu, ifadenin ve de─čerlerin MySQL sunucusuna g├Ândermeden ├Ânce PHP taraf─▒ndan ayr─▒┼čt─▒r─▒lmad─▒─č─▒ndan emin olur (olas─▒ bir sald─▒rgana k├Ât├╝ niyetli SQL enjekte etme ┼čans─▒ vermez).

charset Yap─▒c─▒ se├ženeklerinde ayar yapabilmenize ra─čmen , PHP'nin 'eski' s├╝r├╝mlerinin (5.3.6'dan ├Ânce) DSN'deki karakter k├╝mesi parametresini sessizce yoksayd─▒─č─▒n─▒ not etmek ├Ânemlidir .

a├ž─▒klama

─░letti─činiz SQL ifadesi prepare , veritaban─▒ sunucusu taraf─▒ndan ayr─▒┼čt─▒r─▒l─▒r ve derlenir. Parametreleri belirleyerek ( yukar─▒daki ├Ârnekte oldu─ču ? gibi a veya adland─▒r─▒lm─▒┼č bir parametre :name ) veritaban─▒ motoruna filtrelemek istedi─činiz yeri s├Âylersiniz. Sonra arad─▒─č─▒n─▒zda execute , haz─▒rlanan ifade belirtti─činiz parametre de─čerleriyle birle┼čtirilir.

Buradaki ├Ânemli ┼čey, parametre de─čerlerinin SQL dizesiyle de─čil derlenmi┼č deyimle birle┼čtirilmesidir. SQL enjeksiyonu, veritaban─▒n─▒ g├Ândermek i├žin SQL olu┼čtururken k├Ât├╝ niyetli dizeleri dahil etmek i├žin beti─či kand─▒rarak ├žal─▒┼č─▒r. Bu nedenle, ger├žek SQL'i parametrelerden ayr─▒ olarak g├Ândererek, istemedi─činiz bir ┼čeyle bitme riskini s─▒n─▒rlars─▒n─▒z.

Haz─▒rlanan bir ifadeyi kullan─▒rken g├Ânderdi─činiz t├╝m parametreler sadece karakter dizisi olarak kabul edilir (veritaban─▒ motoru baz─▒ optimizasyonlar yapabilmesine ra─čmen, parametreler elbette say─▒larla sonu├žlanabilir). Yukar─▒daki ├Ârnekte, $name de─či┼čken 'Sarah'; DELETE FROM employees sonucu i├žeriyorsa , basit├že dizenin bir aramas─▒ olur "'Sarah'; DELETE FROM employees" ve bo┼č bir tabloyla bitmezsiniz .

Haz─▒rlanan ifadeleri kullanman─▒n bir ba┼čka yarar─▒, ayn─▒ ifadeyi ayn─▒ oturumda bir├žok kez y├╝r├╝t├╝rseniz, yaln─▒zca bir kez ayr─▒┼čt─▒r─▒lacak ve derlenecek ve size biraz h─▒z kazanacakt─▒r.

Oh, ve bir ek i├žin nas─▒l yap─▒laca─č─▒n─▒ sordu─čundan, i┼čte bir ├Ârnek (PDO kullanarak):

 $preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array('column' => $unsafeValue));
 

Haz─▒rlanan ifadeler dinamik sorgular i├žin kullan─▒labilir mi?

Sorgu parametreleri i├žin haz─▒rlanm─▒┼č ifadeleri kullanabilmenize ra─čmen, dinamik sorgunun yap─▒s─▒ parametrelenemez ve belirli sorgu ├Âzellikleri de─či┼čtirilemez.

Bu ├Âzel senaryolar i├žin yap─▒lacak en iyi ┼čey, olas─▒ de─čerleri k─▒s─▒tlayan bir beyaz liste filtresi kullanmakt─▒r.

 // Value whitelist
// $dir can only be 'DESC', otherwise it will be 'ASC'
if (empty($dir) || $dir !== 'DESC') {
   $dir = 'ASC';
}
 

8675







Kullan─▒mdan Kald─▒r─▒lm─▒┼č Uyar─▒: Bu yan─▒tlay─▒c─▒ ├Ârnek kodu (sorunun ├Ârnek kodu gibi), MySQL PHP 5.5.0'da kullan─▒mdan kald─▒r─▒lan ve tamamen PHP 7.0.0'da kald─▒r─▒lan PHP'nin uzant─▒s─▒n─▒ kullan─▒r .

G├╝venlik Uyar─▒s─▒ : Bu cevap, g├╝venlik en iyi uygulamalar─▒yla uyumlu de─čildir. Ka├žma, SQL enjeksiyonunu ├Ânlemek i├žin yetersiz , bunun yerine haz─▒rlanm─▒┼č ifadeleri kullan─▒n. A┼ča─č─▒da belirtilen stratejiyi kullanmak kendi sorumlulu─čunuzdad─▒r. (Ayr─▒ca, mysql_real_escape_string() PHP 7'de kald─▒r─▒lm─▒┼čt─▒r.)

PHP'nin yeni bir s├╝r├╝m├╝n├╝ kullan─▒yorsan─▒z, mysql_real_escape_string a┼ča─č─▒da belirtilen se├ženek art─▒k mevcut olmayacak ( mysqli::escape_string modern bir e┼čde─čer olsa da). Bu g├╝nlerde mysql_real_escape_string se├ženek yaln─▒zca PHP'nin eski bir s├╝r├╝m├╝ndeki eski kod i├žin mant─▒kl─▒ olacakt─▒r.


─░ki se├žene─činiz var - kendi ├Âzel karakterlerinizden ka├žmak unsafe_variable veya parametreli hale getirilmi┼č bir sorgu kullanarak. Her ikisi de sizi SQL enjeksiyonundan koruyacakt─▒r. Parametreli sorgu daha iyi bir uygulama olarak kabul edilir, ancak kullanmadan ├Ânce PHP'de daha yeni bir MySQL uzant─▒s─▒na ge├žilmesi gerekecektir.

├ľnce birinden ka├žan alt vuru┼č dizisini ele alaca─č─▒z.

 //Connect

$unsafe_variable = $_POST["user-input"];
$safe_variable = mysql_real_escape_string($unsafe_variable);

mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')");

//Disconnect
 

Ayr─▒ca, mysql_real_escape_string i┼člevin ayr─▒nt─▒lar─▒na bak─▒n─▒z .

Parametreli sorguyu kullanmak i├žin , MySQL i┼člevlerinden ziyade MySQLi kullanman─▒z gerekir . ├ľrne─činizi yeniden yazmak i├žin a┼ča─č─▒daki gibi bir ┼čeye ihtiyac─▒m─▒z var.http://php.net/mysql

 <?php
    $mysqli = new mysqli("server", "username", "password", "database_name");

    // TODO - Check that connection was successful.

    $unsafe_variable = $_POST["user-input"];

    $stmt = $mysqli->prepare("INSERT INTO table (column) VALUES (?)");

    // TODO check that $stmt creation succeeded

    // "s" means the database expects a string
    $stmt->bind_param("s", $unsafe_variable);

    $stmt->execute();

    $stmt->close();

    $mysqli->close();
?>
 

├ťzerinde okumak isteyece─činiz anahtar i┼člev orada olacakt─▒r mysqli::prepare .

Ayr─▒ca, ba┼čkalar─▒n─▒n ├Ânerdi─či gibi, bir soyutlama katman─▒n─▒ PDO gibi bir ┼čeyle h─▒zland─▒rman─▒n yararl─▒ / kolay oldu─čunu bulabilirsiniz .

L├╝tfen sordu─čunuz durumun olduk├ža basit oldu─čunu ve daha karma┼č─▒k vakalar─▒n daha karma┼č─▒k yakla┼č─▒mlar gerektirebilece─čini unutmay─▒n. ├ľzellikle:

  • Kullan─▒c─▒ yap─▒s─▒na g├Âre SQL'in yap─▒s─▒n─▒ de─či┼čtirmek istiyorsan─▒z, parametreli hale getirilmi┼č sorgular yard─▒mc─▒ olmayacakt─▒r ve gereken ka├žma kapsam─▒ d─▒┼č─▒ndad─▒r mysql_real_escape_string . Bu t├╝r bir durumda, yaln─▒zca 'g├╝venli' de─čerlere izin verildi─činden emin olmak i├žin kullan─▒c─▒n─▒n giri┼čini bir beyaz listeden ge├žirmekten daha iyi olurdu.
  • Kullan─▒c─▒ giri┼či tamsay─▒lar─▒n─▒ bir ko┼čulda kullan─▒rsan─▒z ve mysql_real_escape_string yakla┼č─▒m─▒ uygularsan─▒z , Polynomial taraf─▒ndan a┼ča─č─▒daki yorumlarda a├ž─▒klanan sorunla kar┼č─▒la┼č─▒rs─▒n─▒z . Bu durum daha zordur, ├ž├╝nk├╝ tam say─▒lar t─▒rnak i┼čaretleri ile ├ževrelenmez, bu nedenle kullan─▒c─▒ giri┼činin yaln─▒zca rakam i├žerdi─čini do─črulayarak ba┼ča ├ž─▒kabilirsiniz.
  • Fark─▒nda olmad─▒─č─▒m ba┼čka durumlar da var. Sen bulabilir bu kar┼č─▒la┼čabilece─činiz daha ince sorunlar─▒n baz─▒lar─▒ ├╝zerinde yararl─▒ bir kaynakt─▒r.

1619







Buradaki her cevap, sorunun sadece bir k─▒sm─▒n─▒ kapsar. Asl─▒nda, dinamik olarak ekleyebilece─čimiz d├Ârt farkl─▒ sorgu b├Âl├╝m├╝ var: -

  • dizi
  • bir say─▒
  • tan─▒mlay─▒c─▒
  • bir s├Âzdizimi anahtar s├Âzc├╝─č├╝.

Haz─▒rlanan ifadeler sadece ikisini kapsar.

Ancak bazen sorguyu daha da dinamik hale getirmek zorunday─▒z, ayr─▒ca i┼čle├žler veya tan─▒mlay─▒c─▒lar da ekledik. Bu y├╝zden farkl─▒ koruma tekniklerine ihtiyac─▒m─▒z olacak.

Genel olarak, b├Âyle bir koruma yakla┼č─▒m─▒ beyaz listeye dayanmaktad─▒r .

Bu durumda, her dinamik parametre kodunuzda kodlanm─▒┼č ve bu k├╝meden se├žilmi┼č olmal─▒d─▒r. ├ľrne─čin, dinamik sipari┼č yapmak i├žin:

 $orders  = array("name", "price", "qty"); // Field names
$key     = array_search($_GET['sort'], $orders)); // See if we have such a name
$orderby = $orders[$key]; // If not, first one will be set automatically. smart enuf :)
$query   = "SELECT * FROM `table` ORDER BY $orderby"; // Value is safe
 

Ancak, tan─▒mlay─▒c─▒lar─▒ korumak i├žin ba┼čka bir yol daha var - ka├ž─▒┼č. Belirtilen bir tan─▒mlay─▒c─▒n─▒z oldu─ču s├╝rece, i├žerideki geri tepmelerden iki kat─▒na ├ž─▒karak ka├žabilirsiniz.

Ba┼čka bir ad─▒m olarak, haz─▒rlanan ifadelerden baz─▒ yer tutucular (sorgudaki ger├žek de─čeri temsil eden bir vekil) kullanma hakk─▒nda ger├žekten m├╝kemmel bir fikir alabilir ve ba┼čka t├╝rden bir yer tutucuyu - tan─▒mlay─▒c─▒ yer tutucuyu icat edebiliriz.

Bu y├╝zden, uzun hikayeyi k─▒saltmak i├žin: bu bir yer tutucudur , haz─▒rlanmam─▒┼č ifadeler g├╝m├╝┼č bir kur┼čun olarak kabul edilebilir.

Bu nedenle, genel bir ├Âneri, yer tutucular─▒ kullanarak sorguya dinamik par├žalar ekledi─činiz s├╝rece (ve bu yer tutucular─▒ elbette uygun ┼čekilde i┼členirse), sorgunuzun g├╝venli oldu─čundan emin olabilirsiniz .

Yine de, orada SQL'─▒n s├Âzdizimi anahtar kelimeler ile ilgili bir sorun (├Ârne─čin gibidir AND , DESC ve bu t├╝r), ancak beyaz listeleme bu durumda sadece bir yakla┼č─▒m gibi g├Âr├╝n├╝yor.

G├╝ncelle┼čtirme

SQL enjeksiyon korumas─▒yla ilgili en iyi uygulamalar hakk─▒nda genel bir anla┼čma olmas─▒na ra─čmen, yine de bir├žok k├Ât├╝ uygulama var. Ve baz─▒lar─▒ ├žok derin PHP kullan─▒c─▒lar─▒n─▒n kafas─▒nda k├Âk sald─▒. ├ľrne─čin, bu sayfada (├žo─ču ziyaret├ži taraf─▒ndan g├Âr├╝nmez olmas─▒na ra─čmen) 80'den fazla silinmi┼č cevap vard─▒r - hepsi k├Ât├╝ kalite ya da k├Ât├╝ ve modas─▒ ge├žmi┼č uygulamalar─▒ te┼čvik ederek topluluk taraf─▒ndan kald─▒r─▒lm─▒┼čt─▒r. Daha da k├Ât├╝s├╝, baz─▒ k├Ât├╝ cevaplar silinmedi, daha ├žok ba┼čar─▒l─▒ oldu.

├ľrne─čin, (1) , (2) hala (3), bir├žok (4) cevap (5) vard─▒r , bunlardan en ├žok oy alan ikinci cevap da dahil olmak ├╝zere, man├╝el dize ka├žan - g├╝vensiz oldu─ču kan─▒tlanm─▒┼č eski bir yakla┼č─▒md─▒r.

Veya dize bi├žimlendirmesinin yaln─▒zca ba┼čka bir y├Ântemini ├Âneren ve hatta en son derde deva olarak ├Âv├╝nen biraz daha iyi bir cevap var . Tabii ki ├Âyle de─čil. Bu y├Ântem normal dize bi├žimlendirmesinden daha iyidir, ancak t├╝m dezavantajlar─▒n─▒ korur: yaln─▒zca dizelere uygulanabilir ve di─čer el ile bi├žimlendirmelerde oldu─ču gibi, temelde iste─če ba─čl─▒, zorunlu olmayan bir ├Ânlemdir, herhangi bir t├╝rde insan hatas─▒na e─čilimlidir.

T├╝m bunlar─▒n, ÔÇťka├žanÔÇŁ ve SQL enjeksiyonlar─▒ndan korunma aras─▒ndaki e┼čitli─či ilan eden OWASP ya da PHP k─▒lavuzu gibi otoriteler taraf─▒ndan desteklenen ├žok eski bir bat─▒l inan├žtan dolay─▒ oldu─čunu d├╝┼č├╝n├╝yorum .

PHP k─▒lavuzunun uzun zamand─▒r s├Âyledi─či ne olursa olsun, *_escape_string hi├žbir ┼čekilde veri g├╝venli─či sa─članmaz ve asla ama├žlanmam─▒┼čt─▒r. Dize d─▒┼č─▒ndaki herhangi bir SQL par├žas─▒ i├žin i┼če yaramaz olmas─▒n─▒n yan─▒ s─▒ra, man├╝el ka├žma yanl─▒┼čt─▒r, ├ž├╝nk├╝ otomatikle┼čtirmenin tersine manueldir.

Ve OWASP daha da k├Ât├╝le┼čtiriyor, tamamen sa├žma bir kullan─▒c─▒ girdisine ka├žmay─▒ vurgulayarak : Enjeksiyon korumas─▒ ba─člam─▒nda b├Âyle bir kelime olmamal─▒d─▒r. Her de─či┼čken potansiyel olarak tehlikelidir - kaynak ne olursa olsun! Veya ba┼čka bir deyi┼čle - her de─či┼čkenin sorguya konmas─▒ i├žin uygun ┼čekilde bi├žimlendirilmesi gerekir - kaynak ne olursa olsun. ├ľnemli olan var─▒┼č noktas─▒. Bir geli┼čtirici koyunlar─▒ ke├žilerden ay─▒rmaya ba┼člad─▒─č─▒ an (baz─▒ de─či┼čkenlerin "g├╝venli" olup olmad─▒─č─▒n─▒ d├╝┼č├╝nerek) felakete ilk ad─▒m─▒n─▒ att─▒. ─░fadelerin bile giri┼č noktas─▒nda toplu ka├žarak, ├žok sihirli al─▒nt─▒lar ├Âzelli─čine benzeyen - zaten a┼ča─č─▒lanm─▒┼č, kullan─▒mdan kald─▒r─▒lm─▒┼č ve kald─▒r─▒lm─▒┼č oldu─čunu s├Âylemekten bahsetmiyorum bile.

Bu nedenle, "ka├žan" ndan farkl─▒ olarak, haz─▒rlanan ifadeler , ger├žekte SQL enjeksiyonundan (uygulanabilir oldu─čunda) koruyan bir ├Ânlemdir.

Hala ikna olmuyorsan─▒z, i┼čte o zaman yazd─▒─č─▒m ad─▒m ad─▒m bir a├ž─▒klama, Otostop├žunun SQL Enjeksiyonunun ├ľnlenmesi Rehberi , bu konular─▒ ayr─▒nt─▒l─▒ bir ┼čekilde a├ž─▒klad─▒m ve hatta tamamen k├Ât├╝ uygulamalar ve a├ž─▒klamalar─▒na adanm─▒┼č bir b├Âl├╝m derledim.


1045







Parametreli SQL sorgular─▒n─▒ ├žal─▒┼čt─▒rmak i├žin PDO (PHP Veri Nesneleri) kullanman─▒z─▒ tavsiye ederim .

Bu sadece SQL enjeksiyonuna kar┼č─▒ koruma sa─člamakla kalmaz, ayn─▒ zamanda sorgular─▒ h─▒zland─▒r─▒r.

Ve yerine PDO kullanarak mysql_ , mysqli_ ve pgsql_ fonksiyonlar─▒, ba┼čvurunuzun daha D├╝─čmeyi veritaban─▒ sa─člay─▒c─▒lar─▒ zorunda ender bulunmas─▒ndan, ritaban─▒ndan elde biraz olun.


833







Kullan─▒m PDO ve haz─▒rlanan sorgular.

( $conn bir PDO nesnedir)

 $stmt = $conn->prepare("INSERT INTO tbl VALUES(:id, :name)");
$stmt->bindValue(':id', $id);
$stmt->bindValue(':name', $name);
$stmt->execute();
 

614







G├Ârd├╝─č├╝n├╝z gibi, insanlar en ├žok haz─▒rl─▒kl─▒ ifadeleri kullanman─▒z─▒ ├Ânerir. Yanl─▒┼č de─čil, ancak sorgunuz i┼člem ba┼č─▒na yaln─▒zca bir kez y├╝r├╝t├╝ld├╝─č├╝nde , hafif bir performans cezas─▒ olacakt─▒.

Bu sorunla kar┼č─▒ kar┼č─▒yayd─▒m, ancak san─▒r─▒m bunu ├žok karma┼č─▒k bir ┼čekilde ├ž├Âzd├╝m - bilgisayar korsanlar─▒n─▒n al─▒nt─▒ kullanmaktan ka├ž─▒nmalar─▒ i├žin. Bunu ├Âyk├╝nm├╝┼č haz─▒r ifadelerle birlikte kulland─▒m. Her t├╝rl├╝ olas─▒ SQL enjeksiyon sald─▒r─▒lar─▒n─▒ ├Ânlemek i├žin kullan─▒yorum .

Benim yakla┼č─▒m─▒m:

  • Giri┼čin tamsay─▒ olmas─▒n─▒ beklerseniz, bunun ger├žekten bir tamsay─▒ oldu─čundan emin olun . PHP gibi de─či┼čken bir dilde bu ├žok ├Ânemlidir. ├ľrne─čin bu ├žok basit ama g├╝├žl├╝ ├ž├Âz├╝m├╝ kullanabilirsiniz: sprintf("SELECT 1,2,3 FROM table WHERE 4 = %u", $input);

  • E─čer tamsay─▒dan ba┼čka bir ┼čey beklerseniz, onu alt ├╝st edin . Alt─▒gen yaparsan─▒z, t├╝m girdilerden kusursuzca ka├žars─▒n─▒z. C / C ++ 'da mysql_hex_string() PHP'de kullanabilece─činiz bir fonksiyon var bin2hex() .

    Ka├žan dizenin orijinal uzunlu─čunun 2 kat─▒ b├╝y├╝kl├╝─č├╝nde olaca─č─▒ndan endi┼če etmeyin, kullansan─▒z bile mysql_real_escape_string PHP ayn─▒ kapasiteyi tahsis etmek zorunda kal─▒r ((2*input_length)+1) .

  • Bu onalt─▒l─▒k y├Ântem, ikili verileri aktar─▒rken s─▒kl─▒kla kullan─▒l─▒r, ancak SQL enjeksiyon sald─▒r─▒lar─▒n─▒ ├Ânlemek i├žin t├╝m verilerde kullan─▒lmamas─▒n─▒n bir nedenini g├Âremiyorum. Verileri haz─▒rlaman─▒z 0x veya UNHEX bunun yerine MySQL i┼člevini kullanman─▒z gerekti─čini unutmay─▒n.

Yani, ├Ârne─čin, sorgu:

 SELECT password FROM users WHERE name = 'root'
 

Olacak:

 SELECT password FROM users WHERE name = 0x726f6f74
 

veya

 SELECT password FROM users WHERE name = UNHEX('726f6f74')
 

Hex m├╝kemmel bir ka├ž─▒┼č. Enjeksiyon yapman─▒n yolu yok.

UNHEX i┼člevi ve 0x ├Âneki aras─▒ndaki fark

Yorumlarda baz─▒ tart─▒┼čmalar oldu, bu y├╝zden sonunda a├ž─▒kl─▒─ča kavu┼čturmak istiyorum. Bu iki yakla┼č─▒m ├žok benzerdir, ancak baz─▒ y├Ânlerden biraz farkl─▒d─▒r:

** 0x ** ├Âneki yaln─▒zca char, varchar, text, block, binary, vb . Gibi veri s├╝tunlar─▒ i├žin kullan─▒labilir .
Ayr─▒ca, bo┼č bir dize eklemek ├╝zereseniz, kullan─▒m─▒ biraz karma┼č─▒kt─▒r. Bunu tamamen de─či┼čtirmeniz '' gerekecek veya bir hata ile kar┼č─▒la┼čacaks─▒n─▒z.

UNHEX () herhangi bir s├╝tun ├╝zerinde ├žal─▒┼č─▒r ; bo┼č dize hakk─▒nda endi┼čelenmenize gerek yok.


Hex y├Ântemleri genellikle sald─▒r─▒ olarak kullan─▒l─▒r

Bu hex y├Ânteminin, tamsay─▒lar─▒n karakter dizileri gibi oldu─ču ve sadece birlikte ka├žt─▒klar─▒ bir SQL enjeksiyon sald─▒r─▒s─▒ olarak kullan─▒ld─▒─č─▒n─▒ unutmay─▒n mysql_real_escape_string . Sonra t─▒rnak kullanmaktan ka├ž─▒nabilirsiniz.

├ľrne─čin, sadece b├Âyle bir ┼čey yaparsan─▒z:

 "SELECT title FROM article WHERE id = " . mysql_real_escape_string($_GET["id"])
 

Bir sald─▒r─▒ size ├žok kolay enjekte edebilir . Komut dosyan─▒zdan d├Ânen a┼ča─č─▒daki enjekte edilmi┼č kodu g├Âz ├Ân├╝nde bulundurun:

SELECT ... WHERE id = -1 birli─či all, table_name ├Â─česini information_schema.tables

ve ┼čimdi sadece tablo yap─▒s─▒n─▒ ay─▒kla:

SE├ç─░N ... NEREDE id = -1 birli─či all_profiln_column dosyas─▒ndan info_schema.column i┼člevinden bir s├╝tun se├žer, burada table_name = 0x61727469636c65

Ve sonra sadece ne istedi─čini veriyi se├žin. Haval─▒ de─čil mi

Ancak, enjekte edilebilir bir sitenin kodlay─▒c─▒s─▒ onu alt─▒gen yaparsa, sorgu ┼č├Âyle g├Âr├╝nece─činden enjeksiyon m├╝mk├╝n olmaz: SELECT ... WHERE id = UNHEX('2d312075...3635')


543







Kullan─▒mdan Kald─▒r─▒lm─▒┼č Uyar─▒: Bu yan─▒tlay─▒c─▒ ├Ârnek kodu (sorunun ├Ârnek kodu gibi), MySQL PHP 5.5.0'da kullan─▒mdan kald─▒r─▒lan ve tamamen PHP 7.0.0'da kald─▒r─▒lan PHP'nin uzant─▒s─▒n─▒ kullan─▒r .

G├╝venlik Uyar─▒s─▒ : Bu cevap, g├╝venlik en iyi uygulamalar─▒yla uyumlu de─čildir. Ka├žma, SQL enjeksiyonunu ├Ânlemek i├žin yetersiz , bunun yerine haz─▒rlanm─▒┼č ifadeleri kullan─▒n. A┼ča─č─▒da belirtilen stratejiyi kullanmak kendi sorumlulu─čunuzdad─▒r. (Ayr─▒ca, mysql_real_escape_string() PHP 7'de kald─▒r─▒lm─▒┼čt─▒r.)

├ľNEML─░

SQL Injection'─▒ ├Ânlemenin en iyi yolu , kabul edilen cevab─▒n g├Âsterdi─či gibi , ka├žmak yerine Haz─▒rlanan ─░fadeleri kullanmakt─▒r .https://stackoverflow.com/a/60496/2224584

Aura.Sql ve EasyDB gibi geli┼čtiricilerin haz─▒rlanm─▒┼č ifadeleri daha kolay kullanmalar─▒n─▒ sa─člayan k├╝t├╝phaneler vard─▒r . Haz─▒rlanan tablolar─▒ daha iyi alt─▒ndad─▒r nedenleriyle ilgili daha fazla bilgi edinmek i├žin SQL enjeksiyonu durdurma , bak─▒n bu mysql_real_escape_string() baypas ve WordPress son zamanlarda sabit Unicode SQL Enjeksiyon a├ž─▒klar─▒ .

Enjeksiyon ├Ânleme - mysql_real_escape_string ()

PHP bu sald─▒r─▒lar─▒ ├Ânlemek i├žin ├Âzel olarak yap─▒lm─▒┼č bir i┼čleve sahiptir. Yapman─▒z gereken tek ┼čey bir i┼člevin a─čz─▒n─▒ kullanmak mysql_real_escape_string .

mysql_real_escape_string MySQL sorgusunda kullan─▒lacak bir dizgiyi al─▒r ve g├╝venli bir ┼čekilde ka├žan t├╝m SQL enjeksiyon giri┼čimleriyle ayn─▒ dizgiyi d├Ând├╝r├╝r. Temel olarak, bir kullan─▒c─▒n─▒n MySQL g├╝venli bir alternatif, ka├žan bir al─▒nt─▒ \ 'ile girebilece─či sorunlu teklifleri (') de─či┼čtirir.

NOT: Bu i┼člevi kullanmak i├žin veritaban─▒na ba─čl─▒ olmal─▒s─▒n─▒z!

// MySQL'e ba─član

 $name_bad = "' OR 1'"; 

$name_bad = mysql_real_escape_string($name_bad);

$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
echo "Escaped Bad Injection: <br />" . $query_bad . "<br />";


$name_evil = "'; DELETE FROM customers WHERE 1 or username = '"; 

$name_evil = mysql_real_escape_string($name_evil);

$query_evil = "SELECT * FROM customers WHERE username = '$name_evil'";
echo "Escaped Evil Injection: <br />" . $query_evil;
 

Daha fazla ayr─▒nt─▒y─▒ MySQL - SQL Injection Prevention (SQL Enjeksiyon ├ľnleme) b├Âl├╝m├╝nde bulabilirsiniz .


494







B├Âyle basit bir ┼čey yapabilirsin:

 $safe_variable = mysqli_real_escape_string($_POST["user-input"], $dbConnection);
mysqli_query($dbConnection, "INSERT INTO table (column) VALUES ('" . $safe_variable . "')");
 

Bu her sorunu ├ž├Âzmeyecek, ama ├žok iyi bir basamak ta┼č─▒. De─či┼čkenin varl─▒─č─▒n─▒, bi├žimini (say─▒lar─▒, harfleri vb.) Kontrol etmek gibi belirgin ├Â─čeleri d─▒┼čar─▒da b─▒rakt─▒m.


456







Ne kullan─▒rsan─▒z kullan─▒n, girdilerinizin zaten iyi durumda olmad─▒─č─▒ndan magic_quotes veya iyi niyetli bir ├ž├Âpl├╝kten ge├žmedi─činden emin olun ve gerekirse stripslashes temizleyin ya da sterilize edin.


376







Kullan─▒mdan Kald─▒r─▒lm─▒┼č Uyar─▒: Bu yan─▒tlay─▒c─▒ ├Ârnek kodu (sorunun ├Ârnek kodu gibi), MySQL PHP 5.5.0'da kullan─▒mdan kald─▒r─▒lan ve tamamen PHP 7.0.0'da kald─▒r─▒lan PHP'nin uzant─▒s─▒n─▒ kullan─▒r .

G├╝venlik Uyar─▒s─▒ : Bu cevap, g├╝venlik en iyi uygulamalar─▒yla uyumlu de─čildir. Ka├žma, SQL enjeksiyonunu ├Ânlemek i├žin yetersiz , bunun yerine haz─▒rlanm─▒┼č ifadeleri kullan─▒n. A┼ča─č─▒da belirtilen stratejiyi kullanmak kendi sorumlulu─čunuzdad─▒r. (Ayr─▒ca, mysql_real_escape_string() PHP 7'de kald─▒r─▒lm─▒┼čt─▒r.)

Parametreli sorgu VE giri┼č do─črulama gitmek i├žin yoludur. Kullan─▒lsa bile, SQL enjeksiyonunun ger├žekle┼čebilece─či bir├žok senaryo mysql_real_escape_string() vard─▒r.

Bu ├Ârnekler, SQL enjeksiyonuna a├ž─▒k:

 $offset = isset($_GET['o']) ? $_GET['o'] : 0;
$offset = mysql_real_escape_string($offset);
RunQuery("SELECT userid, username FROM sql_injection_test LIMIT $offset, 10");
 

veya

 $order = isset($_GET['o']) ? $_GET['o'] : 'userid';
$order = mysql_real_escape_string($order);
RunQuery("SELECT userid, username FROM sql_injection_test ORDER BY `$order`");
 

Her iki durumda da, ' kaps├╝llemeyi korumak i├žin kullanamazs─▒n─▒z .

Kaynak : Beklenmeyen SQL Enjeksiyonu (Ka├ž─▒┼č Yeterli De─čilse)


359







Bence, PHP uygulaman─▒zda (veya bu konuda herhangi bir web uygulamas─▒nda) SQL enjeksiyonunu genel olarak ├Ânlemenin en iyi yolu, uygulaman─▒z─▒n mimarisini d├╝┼č├╝nmektir. SQL enjeksiyonuna kar┼č─▒ koruman─▒n tek yolu, veritaban─▒na her konu┼čtu─čunuzda Do─čru Olan─▒ yapan ├Âzel bir y├Ântem veya i┼člev kullanmay─▒ hat─▒rlamaksa, yanl─▒┼č yapars─▒n─▒z. Bu ┼čekilde, sorgunuzu kodunuzun bir noktas─▒nda do─čru ┼čekilde bi├žimlendirmeyi unutmaman─▒z yaln─▒zca bir zaman meselesidir.

MVC modelini ve CakePHP veya CodeIgniter gibi bir ├žer├ževeyi benimsemek muhtemelen do─čru yoldur: G├╝venli veritaban─▒ sorgular─▒ olu┼čturmak gibi ortak g├Ârevler ├ž├Âz├╝lm├╝┼č ve bu t├╝r ├žer├ževelerde merkezi olarak uygulanm─▒┼čt─▒r. Web uygulaman─▒z─▒ mant─▒kl─▒ bir ┼čekilde d├╝zenlemenize yard─▒mc─▒ olur ve nesneleri tek tek SQL sorgular─▒ olu┼čturmaktan ├žok y├╝kleme ve kaydetme hakk─▒nda daha fazla d├╝┼č├╝nmenizi sa─člar.


308







Sakl─▒ yordamlar─▒ ( MySQL'in 5.0'dan beri sakl─▒ yordamlar─▒ destekledi─čini ) g├╝venlik a├ž─▒s─▒ndan tercih ediyorum - avantajlar─▒ -

  1. ├ço─ču veritaban─▒ ( MySQL dahil ), kullan─▒c─▒n─▒n eri┼čiminin sakl─▒ yordamlar─▒ y├╝r├╝tmeyle s─▒n─▒rland─▒r─▒lmas─▒n─▒ sa─člar. ─░nce taneli g├╝venlik eri┼čim kontrol├╝, ayr─▒cal─▒k sald─▒r─▒lar─▒n─▒n artmas─▒n─▒ ├Ânlemek i├žin kullan─▒┼čl─▒d─▒r. Bu, tehlike alt─▒ndaki uygulamalar─▒n SQL'i do─črudan veritaban─▒na kar┼č─▒ ├žal─▒┼čt─▒rmas─▒n─▒ ├Ânler.
  2. Uygulamadan ham SQL sorgusunu soyutlarlar, b├Âylece uygulama i├žin veritaban─▒ yap─▒s─▒n─▒n daha az bilgisi vard─▒r. Bu, insanlar─▒n veritaban─▒n─▒n alt─▒nda yatan yap─▒y─▒ anlamalar─▒n─▒ ve uygun sald─▒r─▒lar tasarlamalar─▒n─▒ zorla┼čt─▒r─▒r.
  3. Yaln─▒zca parametreleri kabul ederler, bu nedenle parametreli hale getirilmi┼č sorgular─▒n avantajlar─▒ vard─▒r. Tabii ki - IMO hala giri┼činizi dezenfekte etmeniz gerekiyor - ├Âzellikle sakl─▒ yordam─▒n i├žinde dinamik SQL kullan─▒yorsan─▒z.

Dezavantajlar─▒ -

  1. Onlar (sakl─▒ prosed├╝rler) bak─▒m─▒ ├žok zordur ve ├žok h─▒zl─▒ bir ┼čekilde ├žo─čalabilirler. Bu, onlar─▒ y├Ânetmeyi bir sorun haline getirir.
  2. Dinamik sorgular i├žin ├žok uygun de─čillerdir - e─čer dinamik kodu parametre olarak kabul etmek i├žin yap─▒lm─▒┼člarsa, avantajlar─▒n ├žo─ču ihmal edilir.

294







SQL enjeksiyonlar─▒n─▒ ve di─čer SQL kesmelerini ├Ânlemenin bir├žok yolu vard─▒r. ─░nternette kolayca bulabilirsiniz (Google Arama). Tabii ki PDO iyi ├ž├Âz├╝mlerden biridir. Ancak size SQL enjeksiyonundan korunma konusunda baz─▒ iyi ba─člant─▒lar ├Âneriyorum.

SQL enjeksiyonu nedir ve nas─▒l engellenir

SQL enjeksiyonu i├žin PHP k─▒lavuzu

PHP'de SQL enjeksiyonu ve ├Ânlenmesinin Microsoft a├ž─▒klamas─▒

Ve baz─▒lar─▒ MySQL ve PHP ile SQL enjeksiyonunu ├Ânleme gibi .

┼×imdi, neden sorgunuzu SQL enjeksiyonundan engellemeniz gerekiyor?

Size ┼čunu bildirmek isterim: Neden a┼ča─č─▒daki k─▒sa bir ├Ârnekle SQL enjeksiyonunu ├Ânlemeye ├žal─▒┼č─▒yoruz:

Giri┼č kimlik do─črulama e┼čle┼čmesi i├žin sorgu:

 $query="select * from users where email='".$_POST['email']."' and password='".$_POST['password']."' ";
 

┼×imdi, e─čer birisi (bilgisayar korsan─▒) koyarsa

 $_POST['email']= [email protected]' OR '1=1
 

ve bir ┼čey parola ....

Sorgu, yaln─▒zca a┼ča─č─▒dakilere kadar sisteme ayr─▒┼čt─▒r─▒l─▒r:

 $query="select * from users where email='[email protected]' OR '1=1';
 

Di─čer k─▒s─▒m at─▒lacak. Peki ne olacak? Yetkili olmayan bir kullan─▒c─▒ (bilgisayar korsan─▒) ┼čifresi olmadan y├Ânetici olarak giri┼č yapabilir. Art─▒k y├Ânetici / e-posta kullan─▒c─▒s─▒n─▒n yapabilece─či her ┼čeyi yapabilir. Bak─▒n, SQL enjeksiyonunun engellenmemesi ├žok tehlikeli.


291







Birisi PHP ve MySQL veya ba┼čka bir dataBase sunucusu kullanmak isterse:

  1. PDO (PHP Veri Nesneleri) ├Â─črenmeyi d├╝┼č├╝n├╝n - ├žoklu veritabanlar─▒na tek tip eri┼čim y├Ântemi sa─člayan bir veritaban─▒ eri┼čim katman─▒d─▒r.
  2. MySQLi ├Â─črenmeyi d├╝┼č├╝n├╝nhttp://en.wikipedia.org/wiki/MySQLi
  3. Strip_tags , mysql_real_escape_string ya da de─či┼čken say─▒sal ise, sadece yerel PHP i┼člevlerini kullan─▒n (int)$foo . PHP'deki de─či┼čkenlerin t├╝r├╝ hakk─▒nda daha fazla bilgiyi buradan okuyun . PDO veya MySQLi gibi k├╝t├╝phaneler kullan─▒yorsan─▒z, daima PDO :: quote () ve mysqli_real_escape_string () kullan─▒n .

K├╝t├╝phanelerden ├Ârnekler:

---- PDO

----- Yer tutucu yok - SQL enjeksiyonu i├žin uygun! O k├Ât├╝

 $request = $pdoConnection->("INSERT INTO parents (name, addr, city) values ($name, $addr, $city)");
 

----- Ads─▒z yer tutucular

 $request = $pdoConnection->("INSERT INTO parents (name, addr, city) values (?, ?, ?);
 

----- ─░simli yer tutucular

 $request = $pdoConnection->("INSERT INTO parents (name, addr, city) value (:name, :addr, :city)");
 

--- MySQLi

 $request = $mysqliConnection->prepare('
       SELECT * FROM trainers
       WHERE name = ?
       AND email = ?
       AND last_login > ?');

    $query->bind_param('first_param', 'second_param', $mail, time() - 3600);
    $query->execute();
 

PS :

PDO bu sava┼č─▒ kolayl─▒kla kazand─▒. On iki farkl─▒ veritaban─▒ s├╝r├╝c├╝s├╝n├╝n ve adland─▒r─▒lm─▒┼č parametrelerin deste─čiyle, k├╝├ž├╝k performans kayb─▒n─▒ g├Ârmezden gelebilir ve API'sine al─▒┼čabiliriz. Bir g├╝venlik a├ž─▒s─▒ndan, her ikisi de geli┼čtirici kullanmalar─▒ gerekti─či ┼čekilde kulland─▒─č─▒ s├╝rece her ikisi de g├╝venlidir.

Ancak hem PDO hem de MySQLi olduk├ža h─▒zl─▒ olsa da, MySQLi ├Âl├ž├╝tlerde ├Ânemsiz ┼čekilde daha h─▒zl─▒ performans g├Âsterir - haz─▒rlanmam─▒┼č ifadeler i├žin ~% 2.5 ve haz─▒r olanlar i├žin ~% 6.5.

Ve l├╝tfen her sorguyu veritaban─▒n─▒za test edin - enjeksiyonun ├Ân├╝ne ge├žmek i├žin daha iyi bir yol.


263







M├╝mk├╝nse, parametrelerinizi yaz─▒n. Ancak, yaln─▒zca int, bool ve float gibi basit t├╝rlerde ├žal─▒┼č─▒yor.

 $unsafe_variable = $_POST['user_id'];

$safe_variable = (int)$unsafe_variable ;

mysqli_query($conn, "INSERT INTO table (column) VALUES ('" . $safe_variable . "')");
 

255







├ľnbellek motorlar─▒ndan yararlanmak istiyorsan─▒z, Redis veya Memcached gibi , belki DALMP bir se├ženek olabilir. Saf MySQLi kullan─▒r . Bunu kontrol edin: PHP kullanarak MySQL i├žin DALMP Veritaban─▒ Soyutlama Katman─▒.

Ayr─▒ca, sorgunuzu haz─▒rlamadan ├Ânce arg├╝manlar─▒n─▒z─▒ 'haz─▒rlayabilirsiniz', b├Âylece dinamik sorgular olu┼čturabilir ve sonunda tamamen haz─▒rlanm─▒┼č bir ifadeler sorgusu alabilirsiniz. PHP kullanarak MySQL i├žin DALMP Veritaban─▒ Soyutlama Katman─▒.


230







PDO'nun ( mysql_ i┼člevlerden gelen) nas─▒l kullan─▒laca─č─▒ndan emin olmayanlar i├žin , tek bir dosya olan ├žok, ├žok basit bir PDO sarmalay─▒c─▒s─▒ yapt─▒m . Uygulamalar─▒n yap─▒lmas─▒ gereken t├╝m genel i┼čleri yapman─▒n ne kadar kolay oldu─čunu g├Âstermek i├žin var. PostgreSQL, MySQL ve SQLite ile ├žal─▒┼č─▒r.

Temel olarak, okumak manuel okurken basit saklamak ve formatta de─čerleri almak i├žin yapmak ger├žek hayatta kullan─▒m─▒na PDO i┼člevlerini koymak nas─▒l g├Ârmek sen istiyorum.

Tek bir s├╝tun istiyorum

 $count = DB::column('SELECT COUNT(*) FROM `user`);
 

Bir dizi (key => value) sonu├žlar─▒ istiyorum (yani bir se├žim kutusu yapmak i├žin)

 $pairs = DB::pairs('SELECT `id`, `username` FROM `user`);
 

Tek bir sat─▒r sonucu istiyorum

 $user = DB::row('SELECT * FROM `user` WHERE `id` = ?', array($user_id));
 

Bir dizi sonu├ž istiyorum

 $banned_users = DB::fetch('SELECT * FROM `user` WHERE `banned` = ?', array(TRUE));
 

221







Bu PHP i┼člevini kullanarak mysql_escape_string() h─▒zl─▒ bir ┼čekilde iyi bir ├Ânleme alabilirsiniz.

├ľrne─čin:

 SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."'
 

mysql_escape_string - Bir mysql_query i├žinde kullanmak i├žin bir dize ka├žar

Daha fazla ├Ânleme i├žin, sonunda ekleyebilirsiniz ...

 wHERE 1=1   or  LIMIT 1
 

Sonunda olsun:

 SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."' LIMIT 1
 

219







SQL ifadelerinde ├Âzel karakterlerden ka├žmak i├žin birka├ž kural.

MySQL kullanmay─▒n . Bu uzant─▒ kullan─▒mdan kald─▒r─▒ld─▒. Kullan─▒m MySQLi veya PDO yerine.

MySQLi

Bir dizedeki ├Âzel karakterlerden elle ka├žmak i├žin mysqli_real_escape_string i┼člevini kullanabilirsiniz . Do─čru karakter seti mysqli_set_charset ile ayarlanmad─▒k├ža i┼člev d├╝zg├╝n ├žal─▒┼čmayacakt─▒r .

├ľrnek:

 $mysqli = new mysqli('host', 'user', 'password', 'database');
$mysqli->set_charset('charset');

$string = $mysqli->real_escape_string($string);
$mysqli->query("INSERT INTO table (column) VALUES ('$string')");
 

Haz─▒rlanan ifadelerle de─čerlerin otomatik olarak ka├ž─▒lmas─▒ i├žin, uygun ba─člama de─či┼čkenleri i├žin tiplerin uygun bir d├Ân├╝┼č├╝m i├žin sa─članmas─▒ gereken mysqli_prepare ve mysqli_stmt_bind_param kullan─▒n :

├ľrnek:

 $stmt = $mysqli->prepare("INSERT INTO table (column1, column2) VALUES (?,?)");

$stmt->bind_param("is", $integer, $string);

$stmt->execute();
 

Haz─▒rlanan ifadeleri veya mysqli_real_escape_string kullan─▒yor olsan─▒z da, ├žal─▒┼čt─▒─č─▒n─▒z giri┼č verilerinin t├╝r├╝n├╝ her zaman bilmeniz gerekir.

Bu nedenle, haz─▒rlanm─▒┼č bir ifade kullan─▒rsan─▒z, mysqli_stmt_bind_param i┼člevi i├žin de─či┼čken t├╝rlerini belirtmeniz gerekir.

Ve mysqli_real_escape_string kullan─▒m─▒, ad─▒ndan da anla┼č─▒laca─č─▒ gibi, bir dizgede ├Âzel karakterlerden ka├žmak i├žin oldu─čundan, tamsay─▒lar─▒ g├╝venli hale getirmez. Bu i┼člevin amac─▒, SQL deyimlerindeki dizelerin k─▒r─▒lmas─▒n─▒ ve veritaban─▒na sebep olabilece─či zarar─▒ ├Ânlemektir. mysqli_real_escape_string, ├Âzellikle sprintf ile birle┼čtirildi─činde d├╝zg├╝n kullan─▒ld─▒─č─▒nda yararl─▒ bir i┼člevdir.

├ľrnek:

 $string = "x' OR name LIKE '%John%";
$integer = '5 OR id != 0';

$query = sprintf( "SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string($string), $integer);

echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 5

$integer = '99999999999999999999';
$query = sprintf("SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string($string), $integer);

echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 2147483647
 

208







Bu sorunun basit alternatifi, veritaban─▒nda kendisine uygun izinlerin verilmesiyle ├ž├Âz├╝lebilir. ├ľrne─čin: e─čer bir MySQL veritaban─▒ kullan─▒yorsan─▒z, veritaban─▒na terminalden veya verilen UI'dan girin ve a┼ča─č─▒daki komutu uygulay─▒n:

  GRANT SELECT, INSERT, DELETE ON database TO [email protected]'localhost' IDENTIFIED BY 'password';
 

Bu, kullan─▒c─▒y─▒ yaln─▒zca belirtilen sorgunun yaln─▒zca s─▒n─▒rland─▒r─▒lmas─▒n─▒ k─▒s─▒tlar. Silme iznini kald─▒r─▒n, b├Âylece veriler PHP sayfas─▒ndan g├Ânderilen sorgudan asla silinmeyecek. Yap─▒lmas─▒ gereken ikinci ┼čey, MySQL'in izinleri ve g├╝ncellemeleri yenilemesi i├žin ayr─▒cal─▒klar─▒ temizlemektir.

 FLUSH PRIVILEGES; 
 

flo┼č hakk─▒nda daha fazla bilgi .

Kullan─▒c─▒n─▒n ge├žerli ayr─▒cal─▒klar─▒n─▒ g├Ârmek i├žin a┼ča─č─▒daki sorguyu ba┼člat.

 select * from mysql.user where User='username';
 

GRANT hakk─▒nda daha fazla bilgi edinin .


181







G├╝venlik Uyar─▒s─▒ : Bu cevap, g├╝venlik en iyi uygulamalar─▒yla uyumlu de─čildir. Ka├žma, SQL enjeksiyonunu ├Ânlemek i├žin yetersiz , bunun yerine haz─▒rlanm─▒┼č ifadeleri kullan─▒n. A┼ča─č─▒da belirtilen stratejiyi kullanmak kendi sorumlulu─čunuzdad─▒r. (Ayr─▒ca, mysql_real_escape_string() PHP 7'de kald─▒r─▒lm─▒┼čt─▒r.)

Kullan─▒mdan Kald─▒r─▒lm─▒┼č Uyar─▒ : ┼×u anda mysql uzant─▒s─▒ kullan─▒mdan kald─▒r─▒lm─▒┼čt─▒r. PDO uzant─▒s─▒n─▒ kullanman─▒z─▒ ├Âneririz

Web uygulamam─▒n SQL enjeksiyonuna kar┼č─▒ savunmas─▒z kalmas─▒n─▒ ├Ânlemek i├žin ├╝├ž farkl─▒ yol kullan─▒yorum.

  1. Kullan─▒m─▒ mysql_real_escape_string() i├žinde ├Ânceden tan─▒mlanm─▒┼č bir fonksiyonudur, PHP ve a┼ča─č─▒daki karakterlere bu kod eklenti ters e─čik ├žizgi: \x00 , \n , \r , \ , ' , " ve \x1a . SQL enjeksiyon olas─▒l─▒─č─▒n─▒ en aza indirmek i├žin giri┼č de─čerlerini parametre olarak iletin.
  2. En geli┼čmi┼č yol PDO'lar─▒ kullanmakt─▒r.

Umar─▒m bu sana yard─▒mc─▒ olmu┼čtur.

A┼ča─č─▒daki sorguyu d├╝┼č├╝n├╝n:

$iId = mysql_real_escape_string("1 OR 1=1"); $sSql = "SELECT * FROM table WHERE id = $iId";

mysql_real_escape_string () burada korunmayacakt─▒r. De─či┼čkenlerinizin etraf─▒nda tek t─▒rnak ('') kullan─▒rsan─▒z, sorgunuz i├žinde sizi koruyan ┼čey budur. ─░┼čte bunun i├žin a┼ča─č─▒da bir ├ž├Âz├╝m:

$iId = (int) mysql_real_escape_string("1 OR 1=1"); $sSql = "SELECT * FROM table WHERE id = $iId";

Bu sorunun bu konuda baz─▒ iyi cevaplar─▒ var.

Ben PDO kullanarak en iyi se├ženek oldu─čunu ├Âneriyorum.

D├╝zenle:

mysql_real_escape_string() PHP 5.5.0 itibariyle kullan─▒mdan kald─▒r─▒lm─▒┼čt─▒r. MySQL veya PDO kullan─▒n.

Mysql_real_escape_string () i┼člevine bir alternatif

 string mysqli_real_escape_string ( mysqli $link , string $escapestr )
 

├ľrnek:

 $iId = $mysqli->real_escape_string("1 OR 1=1");
$mysqli->query("SELECT * FROM table WHERE id = $iId");
 

172







Yararl─▒ cevaplarla ilgili olarak, bu konuya biraz de─čer katmay─▒ umuyorum.

SQL enjeksiyonu, kullan─▒c─▒ giri┼čleri (bir kullan─▒c─▒ taraf─▒ndan doldurulan ve sorgular─▒n i├žinde kullan─▒lan giri┼čler) arac─▒l─▒─č─▒yla yap─▒labilecek bir sald─▒r─▒d─▒r. SQL enjeksiyon kal─▒plar─▒ do─čru sorgu s├Âzdizimidir, buna adland─▒rabiliriz: k├Ât├╝ sebeplerden dolay─▒ k├Ât├╝ sorgular ve ├╝├ž g├╝venlik ilkesini (gizlilik ilkesini etkileyen) gizli bilgiler (eri┼čim kontrol├╝n├╝ atlayarak) almaya ├žal─▒┼čan k├Ât├╝ bir insan olabilece─čini varsay─▒yoruz. , b├╝t├╝nl├╝k ve kullan─▒labilirlik).

┼×imdi, hedefimiz SQL enjeksiyon sald─▒r─▒lar─▒, soru sorma (PHP kullanarak SQL enjeksiyon sald─▒r─▒s─▒n─▒n nas─▒l ├Ânlenece─či) gibi g├╝venlik tehditlerini ├Ânlemek, daha ger├žek├ži olmak, veri filtrelemek veya giri┼č verilerini silmek, kullan─▒c─▒ giri┼či verilerini kullan─▒rken PHP veya ba┼čka bir programlama dili kullanan bu t├╝r bir sorgulama s├Âz konusu de─čildir ya da haz─▒rlanan ifade veya ┼ču anda SQL enjeksiyon engellemesini destekleyen di─čer ara├žlar gibi modern teknolojiyi kullanmak i├žin daha fazla ki┼či taraf─▒ndan ├Ânerildi─či gibi, bu ara├žlar─▒n art─▒k mevcut olmad─▒─č─▒n─▒ m─▒ d├╝┼č├╝n├╝yorsunuz? Ba┼čvurunuzu nas─▒l g├╝vence alt─▒na al─▒yorsunuz?

SQL enjeksiyonuna kar┼č─▒ yakla┼č─▒m─▒m: Veritaban─▒na g├Ândermeden ├Ânce kullan─▒c─▒ giri┼či verilerinin temizlenmesi (herhangi bir sorguda kullanmadan ├Ânce).

┼×unun i├žin veri filtreleme (g├╝venli olmayan verileri g├╝venli veriye d├Ân├╝┼čt├╝rme)

PDO ve MySQLi'nin mevcut olmad─▒─č─▒n─▒ g├Âz ├Ân├╝nde bulundurun . Ba┼čvurunuzu nas─▒l g├╝vence alt─▒na alabilirsiniz? Beni onlar─▒ kullanmaya zorluyor musun? PHP d─▒┼č─▒ndaki di─čer dillerden ne haber? Sadece belirli bir dil i├žin de─čil, daha geni┼č s─▒n─▒r i├žin kullan─▒labilece─či i├žin genel fikirler sunmay─▒ tercih ederim.

  1. SQL kullan─▒c─▒s─▒ (kullan─▒c─▒ imtiyaz─▒n─▒ s─▒n─▒rlama): en yayg─▒n SQL i┼člemleri (SELECT, UPDATE, INSERT) 'dir, ├Âyleyse neden UPDATE'in gerektirmeyen bir kullan─▒c─▒ya yetki vermesini sa─čla? ├ľrne─čin, giri┼č ve arama sayfalar─▒ yaln─▒zca SELECT kullan─▒yor, ├Âyleyse neden bu kullan─▒c─▒larda y├╝ksek ayr─▒cal─▒kl─▒ DB kullan─▒c─▒lar─▒ kullan─▒l─▒yor?

RULE: t├╝m ayr─▒cal─▒klar i├žin bir veritaban─▒ kullan─▒c─▒s─▒ olu┼čturmay─▒n. T├╝m SQL i┼člemleri i├žin, plan─▒n─▒z─▒ kolay kullan─▒m i├žin kullan─▒c─▒ ad─▒ olarak (deluser, selectuser, updateuser) gibi olu┼čturabilirsiniz.

En az ayr─▒cal─▒k ilkesine bak─▒n .

  1. Veri filtreleme: Herhangi bir sorgu kullan─▒c─▒ giri┼či olu┼čturmadan ├Ânce, do─črulanmas─▒ ve filtrelenmesi gerekir. Programc─▒lar i├žin, her kullan─▒c─▒-giri┼č de─či┼čkeni i├žin baz─▒ ├Âzellikler tan─▒mlamak ├Ânemlidir: veri tipi, veri deseni ve veri uzunlu─ču . (X ve y) aras─▒nda bir say─▒ olan bir alan, kesin kural kullan─▒larak tam olarak do─črulanmal─▒d─▒r ve bir dize (metin) olan bir alan i├žin: desen, ├Ârne─čin bir kullan─▒c─▒ ad─▒n─▒n yaln─▒zca baz─▒ karakterleri i├žermesi gerekir; [a-zA-Z0-9_-.] deyin. Uzunluk, (x ve n) aras─▒nda de─či┼čir, burada x ve n (tamsay─▒lar, x <= n). Kural: Kesin filtreler olu┼čturmak ve do─črulama kurallar─▒ benim i├žin en iyi y├Ântemlerdir.

  2. Ba┼čka ara├žlar kullan─▒n: Burada, haz─▒rlanm─▒┼č bir ifadenin (parametrele┼čtirilmi┼č sorgu) ve sakl─▒ yordamlar konusunda sizinle ayn─▒ fikirdeyim. Buradaki dezavantajlar, bu yollar─▒n ├žo─ču kullan─▒c─▒ i├žin mevcut olmayan geli┼čmi┼č beceriler gerektirmesidir. Buradaki temel fikir, SQL sorgusu ile i├žinde kullan─▒lan veriler aras─▒nda ayr─▒m yapmakt─▒r. Her iki yakla┼č─▒m da g├╝venli olmayan verilerde bile kullan─▒labilir, ├ž├╝nk├╝ buradaki kullan─▒c─▒ giri┼či verileri (herhangi veya x = x) gibi orijinal sorguya hi├žbir ┼čey eklemez.

Daha fazla bilgi i├žin, l├╝tfen OWASP SQL Injection Prevention Heat Sheet'i okuyun .

┼×imdi, ileri d├╝zey bir kullan─▒c─▒ysan─▒z, bu savunmay─▒ istedi─činiz gibi kullanmaya ba┼člay─▒n, ancak yeni ba┼člayanlar i├žin h─▒zl─▒ bir ┼čekilde sakl─▒ bir prosed├╝r uygulayamazlar ve ifadeyi haz─▒rlayamazlarsa, girdi verilerini olabildi─čince filtrelemek daha iyidir.

Son olarak, bir kullan─▒c─▒n─▒n kullan─▒c─▒ ad─▒n─▒ girmek yerine bu metni a┼ča─č─▒da g├Ânderdi─čini d├╝┼č├╝nelim:

 [1] UNION SELECT IF(SUBSTRING(Password,1,1)='2',BENCHMARK(100000,SHA1(1)),0) User,Password FROM mysql.user WHERE User = 'root'
 

Bu girdi, ├Ânceden haz─▒rlanm─▒┼č herhangi bir a├ž─▒klama ve sakl─▒ yordam olmadan erken kontrol edilebilir, ancak kullan─▒c─▒ taraf─▒nda veri filtreleme ve do─črulama i┼čleminden sonra ba┼člayanlar kullan─▒larak g├╝venli tarafta olmalar─▒ gerekir.

Son nokta, daha fazla ├žaba ve karma┼č─▒kl─▒k gerektiren beklenmeyen davran─▒┼člar─▒ tespit etmektir; normal web uygulamalar─▒ i├žin ├Ânerilmez.

Yukar─▒daki kullan─▒c─▒ giri┼činde beklenmeyen davran─▒┼člar SELECT, UNION, IF, SUBSTRING, BENCHMARK, SHA ve root'tur. Bu kelimeler tespit edildikten sonra giri┼či ├Ânleyebilirsiniz.

G├ťNCELLEME 1:

Bir kullan─▒c─▒ bu yaz─▒n─▒n faydas─▒z oldu─čunu yorumlad─▒, tamam! ─░┼čte OWASP.ORG ne sa─člad─▒ :

Birincil savunmalar:

Se├ženek # 1: Haz─▒rlanan ─░fadelerin Kullan─▒m─▒ (Parametreli Sorgular)
Se├ženek # 2: Sakl─▒ Prosed├╝rlerin Kullan─▒m─▒
Se├ženek # 3: Girilen T├╝m Kullan─▒c─▒dan Girilen ─░┼člemlerden Ka├žmak

Ek savunma:

Ayr─▒ca Zorla: En Az Ayr─▒cal─▒k
Ayr─▒ca Ger├žekle┼čtir: Beyaz Liste Giri┼č Do─črulamas─▒

Bildi─činiz gibi, bir makale istemek ge├žerli bir arg├╝manla, en az bir referansla desteklenmelidir! Aksi takdirde, sald─▒r─▒ ve k├Ât├╝ bir iddia olarak kabul edilir!

G├╝ncelleme 2:

PHP k─▒lavuzundan, PHP: Haz─▒rlanan Bildirimler - K─▒lavuz :

Ka├žma ve SQL enjeksiyonu

Ba─članan de─či┼čkenler sunucu taraf─▒ndan otomatik olarak ├ž─▒kar─▒l─▒r. Sunucu, ka├žan de─čerlerini y├╝r├╝tmeden ├Ânce uygun yerlere ifade ┼čablonuna ekler. Uygun bir d├Ân├╝┼č├╝m olu┼čturmak i├žin sunucuya ba─čl─▒ de─či┼čken t├╝r├╝ i├žin bir ipucu sa─članmal─▒d─▒r. Daha fazla bilgi i├žin mysqli_stmt_bind_param () i┼člevine bak─▒n.

Sunucu i├žindeki de─čerlerden otomatik olarak ka├žma, bazen SQL enjeksiyonunu ├Ânlemek i├žin bir g├╝venlik ├Âzelli─či olarak kabul edilir. Giri┼č de─čerleri do─čru ┼čekilde ka├ž─▒l─▒rsa, haz─▒rlanmam─▒┼č ifadelerle ayn─▒ derecede g├╝venlik sa─članabilir.

G├╝ncelleme 3:

Haz─▒rlanan bir c├╝mleyi kullan─▒rken PDO ve MySQLi'nin sorguyu MySQL sunucusuna nas─▒l g├Ânderdi─čini bilmek i├žin test senaryolar─▒ olu┼čturdum:

PDO:

 $user = "''1''"; // Malicious keyword
$sql = 'SELECT * FROM awa_user WHERE userame =:username';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':username' => $user));
 

Sorgu G├╝nl├╝─č├╝:

     189 Query SELECT * FROM awa_user WHERE userame ='\'\'1\'\''
    189 Quit
 

MySQLi:

 $stmt = $mysqli->prepare("SELECT * FROM awa_user WHERE username =?")) {
$stmt->bind_param("s", $user);
$user = "''1''";
$stmt->execute();
 

Sorgu G├╝nl├╝─č├╝:

     188 Prepare   SELECT * FROM awa_user WHERE username =?
    188 Execute   SELECT * FROM awa_user WHERE username ='\'\'1\'\''
    188 Quit
 

Haz─▒rlanan bir ifadenin veriden ka├žt─▒─č─▒ a├ž─▒kt─▒r, ba┼čka bir ┼čey yoktur.

Yukar─▒daki a├ž─▒klamada da belirtildi─či gibi,

Sunucu i├žindeki de─čerlerden otomatik olarak ka├žma, bazen SQL enjeksiyonunu ├Ânlemek i├žin bir g├╝venlik ├Âzelli─či olarak kabul edilir. Giri┼č de─čerleri do─čru ┼čekilde ka├ž─▒l─▒rsa, haz─▒rlanmam─▒┼č ifadelerle ayn─▒ derecede g├╝venlik sa─članabilir

Bu nedenle, bu intval() herhangi bir sorgu g├Ândermeden ├Ânce tamsay─▒ de─čerleri i├žin iyi bir fikir oldu─čunu kan─▒tlar . Ayr─▒ca, sorguyu g├Ândermeden ├Ânce zararl─▒ kullan─▒c─▒ verilerinin ├Ânlenmesi do─čru ve ge├žerli bir yakla┼č─▒md─▒r .

L├╝tfen daha fazla ayr─▒nt─▒ i├žin bu soruya bak─▒n: PDO, MySQL'e ham sorgu g├Ânderirken, Mysqli haz─▒rlanm─▒┼č sorgu g├Ânderir, her ikisi de ayn─▒ sonucu verir

Referanslar:

  1. SQL Enjeksiyon Hile Sayfas─▒
  2. SQL Enjeksiyonu
  3. Bilgi G├╝venli─či
  4. G├╝venlik ilkeleri
  5. Veri do─črulama

172







Basit bir yol, CodeIgniter veya Laravel gibi bir PHP ├žer├ževesini kullanarak filtreleme ve aktif kay─▒t gibi yerle┼čik ├Âzelliklere sahip olacak ve b├Âylece bu n├╝anslar i├žin endi┼čelenmenize gerek kalmayacakt─▒.


167







Uyar─▒: Bu cevapta a├ž─▒klanan yakla┼č─▒m yaln─▒zca ├žok ├Âzel senaryolar i├žin ge├žerlidir ve SQL enjeksiyon sald─▒r─▒lar─▒ yaln─▒zca enjekte edilmeye dayanmad─▒─č─▒ndan g├╝venli de─čildir X=Y .

Sald─▒rganlar, PHP'nin $_GET de─či┼čkeni veya URL'nin sorgu dizesiyle forma girmeye ├žal─▒┼č─▒yorsa, g├╝venli olmad─▒klar─▒nda bunlar─▒ yakalayabilirsiniz.

 RewriteCond %{QUERY_STRING} ([0-9]+)=([0-9]+)
RewriteRule ^(.*) ^/track.php
 

├ç├╝nk├╝ 1=1 , 2=2 , 1=2 , 2=1 , 1+1=2 , vb ... bir sald─▒rgan─▒n, bir SQL veritaban─▒ ortak sorulard─▒r. Belki de bir├žok hack uygulamas─▒ taraf─▒ndan kullan─▒l─▒yor.

Ancak, sitenizden g├╝venli bir sorguyu yeniden yazmaman─▒z gerekti─čine dikkat etmeniz gerekir. Yukar─▒daki kod , korsanl─▒─ča ├Âzg├╝ dinamik sorgu dizesini sald─▒rgan─▒n IP adresini ya da EVEN THE COOKIES, ge├žmi┼č, taray─▒c─▒ veya ba┼čka bir hassas ├Â─čeyi saklayacak bir sayfaya yeniden yazmak veya y├Ânlendirmek (size ba─čl─▒) i├žin bir ipucu veriyor bu nedenle, hesaplar─▒n─▒ yasaklayarak veya yetkililere ba┼čvurarak daha sonra onlarla ilgilenebilirsiniz.http://en.wikipedia.org/wiki/IP_address


141







PHP ve MySQL i├žin ├žok fazla cevap var , fakat burada SQL enjeksiyonunun yan─▒ s─▒ra oci8 s├╝r├╝c├╝lerinin d├╝zenli kullan─▒m─▒n─▒ engelleyen PHP ve Oracle kodlar─▒ :

 $conn = oci_connect($username, $password, $connection_string);
$stmt = oci_parse($conn, 'UPDATE table SET field = :xx WHERE ID = 123');
oci_bind_by_name($stmt, ':xx', $fieldval);
oci_execute($stmt);
 

126







Idiorm gibi bir 'nesne-ili┼čkisel e┼čle┼čtirici' kullanmak iyi bir fikirdir :http://j4mie.github.io/idiormandparis/

 $user = ORM::for_table('user')
->where_equal('username', 'j4mie')
->find_one();

$user->first_name = 'Jamie';
$user->save();

$tweets = ORM::for_table('tweet')
    ->select('tweet.*')
    ->join('user', array(
        'user.id', '=', 'tweet.user_id'
    ))
    ->where_equal('user.username', 'j4mie')
    ->find_many();

foreach ($tweets as $tweet) {
    echo $tweet->text;
}
 

Sizi yaln─▒zca SQL enjeksiyonlar─▒ndan de─čil ayn─▒ zamanda s├Âzdizimi hatalar─▒ndan da kurtar─▒r! Ayr─▒ca, bir kerede ve birden fazla ba─člant─▒da birden ├žok sonuca eylemleri filtrelemek veya uygulamak i├žin y├Ântem zincirine sahip model koleksiyonlar─▒n─▒ destekler.


123







Kullan─▒mdan Kald─▒r─▒lm─▒┼č Uyar─▒: Bu yan─▒tlay─▒c─▒ ├Ârnek kodu (sorunun ├Ârnek kodu gibi), MySQL PHP 5.5.0'da kullan─▒mdan kald─▒r─▒lan ve tamamen PHP 7.0.0'da kald─▒r─▒lan PHP'nin uzant─▒s─▒n─▒ kullan─▒r .

G├╝venlik Uyar─▒s─▒ : Bu cevap, g├╝venlik en iyi uygulamalar─▒yla uyumlu de─čildir. Ka├žma, SQL enjeksiyonunu ├Ânlemek i├žin yetersiz , bunun yerine haz─▒rlanm─▒┼č ifadeleri kullan─▒n. A┼ča─č─▒da belirtilen stratejiyi kullanmak kendi sorumlulu─čunuzdad─▒r. (Ayr─▒ca, mysql_real_escape_string() PHP 7'de kald─▒r─▒lm─▒┼čt─▒r.)

PDO ve MYSQLi kullanmak , SQL enjeksiyonlar─▒n─▒ ├Ânlemek i├žin iyi bir uygulamad─▒r, fakat ger├žekten MySQL fonksiyonlar─▒ ve sorgular─▒ ile ├žal─▒┼čmak istiyorsan─▒z kullanmak daha iyi olacakt─▒r.

mysql_real_escape_string

 $unsafe_variable = mysql_real_escape_string($_POST['user_input']);
 

Bunu ├Ânlemek i├žin daha fazla yetenek var: tan─▒mlamak gibi - e─čer girdi bir string, say─▒, char veya array ise, bunu saptamak i├žin ├žok fazla dahili fonksiyon vard─▒r. Ayr─▒ca, giri┼č verilerini kontrol etmek i├žin bu i┼člevleri kullanmak daha iyi olacakt─▒r.

is_string

 $unsafe_variable = (is_string($_POST['user_input']) ? $_POST['user_input'] : '');
 

is_numeric

 $unsafe_variable = (is_numeric($_POST['user_input']) ? $_POST['user_input'] : '');
 

Girdi verilerini kontrol etmek i├žin bu i┼člevleri kullanmak ├žok daha iyidir mysql_real_escape_string .


123







Bu k├╝├ž├╝k i┼člevi birka├ž y─▒l ├Ânce yazd─▒m:

 function sqlvprintf($query, $args)
{
    global $DB_LINK;
    $ctr = 0;
    ensureConnection(); // Connect to database if not connected already.
    $values = array();
    foreach ($args as $value)
    {
        if (is_string($value))
        {
            $value = "'" . mysqli_real_escape_string($DB_LINK, $value) . "'";
        }
        else if (is_null($value))
        {
            $value = 'NULL';
        }
        else if (!is_int($value) && !is_float($value))
        {
            die('Only numeric, string, array and NULL arguments allowed in a query. Argument '.($ctr+1).' is not a basic type, it\'s type is '. gettype($value). '.');
        }
        $values[] = $value;
        $ctr++;
    }
    $query = preg_replace_callback(
        '/{(\\d+)}/', 
        function($match) use ($values)
        {
            if (isset($values[$match[1]]))
            {
                return $values[$match[1]];
            }
            else
            {
                return $match[0];
            }
        },
        $query
    );
    return $query;
}

function runEscapedQuery($preparedQuery /*, ...*/)
{
    $params = array_slice(func_get_args(), 1);
    $results = runQuery(sqlvprintf($preparedQuery, $params)); // Run query and fetch results.   
    return $results;
}
 

Bu, ifadelerin tek sat─▒rl─▒k C # -ish String.Format gibi ├žal─▒┼čt─▒r─▒lmas─▒n─▒ sa─člar:

 runEscapedQuery("INSERT INTO Whatever (id, foo, bar) VALUES ({0}, {1}, {2})", $numericVar, $stringVar1, $stringVar2);
 

De─či┼čken t├╝r├╝ g├Âz ├Ân├╝ne al─▒nd─▒─č─▒nda ka├žar. Tablo, s├╝tun isimlerini parametrele┼čtirmeye ├žal─▒┼č─▒rsan─▒z, her dizgiyi ge├žersiz bir s├Âzdizimi olan t─▒rnaklara koyarken ba┼čar─▒s─▒z olur.

G├ťVENL─░K G├ťNCELLEME: ├ľnceki str_replace s├╝r├╝m, kullan─▒c─▒ verilerine {#} belirte├žler ekleyerek enjeksiyonlara izin verdi. Bu preg_replace_callback s├╝r├╝m, de─či┼čtirme bu simgeleri i├žeriyorsa sorun yaratmaz.


87



─░lgili yay─▒nlar


ÔÇťBobby TablesÔÇŁ XKCD ├žizgi roman─▒ndan gelen SQL enjeksiyonu nas─▒l ├žal─▒┼č─▒yor?

PDO haz─▒rlanm─▒┼č ifadeler SQL enjeksiyonunu ├Ânlemek i├žin yeterli mi?

HTML / PHP ile XSS nas─▒l ├Ânlenir?

Java - SQL enjeksiyonunu ├Ânlemek i├žin ka├ž─▒┼č dizesi

PHPÔÇÖde HTMLÔÇÖyi nas─▒l eko edebilirim?

PreparedStatement, SQL enjeksiyonunu nas─▒l ├Ânler veya ├Ânler?

PHP sitesi i├žin taray─▒c─▒ ├Ânbelle─či nas─▒l ├Ânlenir

Sql enjeksiyonlar─▒n─▒ ├Ânlemek i├žin parametreler ger├žekten yeterli mi?

Node.js'de SQL enjeksiyonunu ├Ânleme

SQLParameter, SQL Injection'─▒ nas─▒l ├Ânler?

Etiketle ilgili di─čer sorular [php]


403 Forbidden vs 401 Yetkisiz HTTP yan─▒tlar─▒

Bir alanla m├╝lk aras─▒ndaki fark nedir?

Python'da dizin olup olmad─▒─č─▒n─▒ bulma

─░lk ├ľ─če listeden nas─▒l ├ž─▒kar─▒l─▒r?

T├╝m ├ž─▒kt─▒lar─▒ dosyaya y├Ânlendir [├žo─čalt]

Yeni bir Android Par├žas─▒ olu┼čturmak i├žin en iyi y├Ântem

SQL, SELECT * [columnA d─▒┼č─▒nda] tableA FROM kullanarak bir s├╝tunu d─▒┼člar m─▒?

Project Euler ile h─▒z kar┼č─▒la┼čt─▒rmas─▒: C vs Python ile Erlang ve Haskell

Git beni bir ┼čifre soruyor

Yerle┼čik DOM y├Ântemlerini veya Prototipini kullanarak bir HTML dizesinden yeni bir DOM ├Â─česi olu┼čturma