Mysql_query için parametrelerin kullanılması

3 Cevap php

aşağıdaki gibi okuyan bir yerde ederken ilginç bir şey öğrendim juz .. O bir şey söylüyor:

$query = sprintf("SELECT firstname, lastname, address, age FROM friends 
WHERE firstname='%s' AND lastname='%s'",mysql_real_escape_string($firstname),
    mysql_real_escape_string($lastname));

Bu gibi sorguyu kullanarak yerine

$query="select firstname, lastname, address, age FROM friends
WHERE firstname='".$_RETURN['name1']."', lastname='".$_RETURN['name2']."'";

Bu makul görünüyor .. u bu hiç kodlama .. ve nasıl herhangi bir kötü niyetli saldırıları engellemek olur denedim ..

3 Cevap

Öncelikle, ne bu konuda denir olduğunu SQL-Injection. Bu temelde kullanıcı girişi üzerinden veritabanına karşı sorguları değiştirmek için sadece bir olasılık.

Bir örneğe bakalım:

Sorgu:

SELECT temp1 FROM temp WHERE temp2 = 'VAR1';

Now we'll assign VAR1 the value of: '; DROP TABLE *; -- And we'll get:

SELECT temp1 FROM temp WHERE temp2 = ''; DROP TABLE *; --';

Ile mysql_real_escape_string bu gibi görünecektir:

SELECT temp1 FROM temp WHERE temp2 = '\'; DROP TABLE *; --'

mysql_real_escape_string, bir sorgu içinde kullanım için bir string 'güvenliği'.

Ama sonunda, you should stop using the mysql_* tamamen . Onlar kalktı ve SQL enjeksiyonu veya sorguları ile tavlama diğer yollarla önlemeye geldiğinde güvensiz olarak kabul ediyoruz.

You should simply stop concatenating queries together like this ve prepared statements kullanmaya başlamak, bunlar sadece, kullanmak varsayılan olarak SQL Injection önlemek değil, aynı zamanda uygulama hızını artırabilir daha kolaydır.

PHP için bütün mysql_* açılan kapatmak için tasarlanmış iki uzantı vardır:

! Please stop using mysql_* : Ve ben tekrar söylemek

Bildiğim kadarıyla ben farkında değilim gibi, mysql_real_escape_string , short of using prepared statements with mysqli veya PDO SQL enjeksiyonu önlemek için daha iyi yollarından biridir.

sprintf tamamen zevk meselesi gibi biçimlendirme fonksiyonları kullanma; İlk örnekte büyük avantajı fonksiyonu mysql_real_escape_string (diğer yanıtlar birinde açıklanmıştır) tüm SQL enjeksiyonu engeller olduğunu; birçok kişi yerine güveniyor PHP, içinde biraz şüpheli magic_quotes_gpc özelliği farklı.

magic_quotes_gpc otomatik olarak müşterilerinden gelen istekleri aldığınız şeyleri kaçar ... ama sözde ikinci-düzey enjeksiyonları tespit edemez:

  1. Eğer bir müşteri kötü niyetli bir sorgu olsun ve veritabanında içeriğini depolamak. magic_quotes_gpc SQL enjeksiyon önler; kötü niyetli dize doğru depolanır.
  2. Daha sonra, veritabanından bu dize getirme ve başka bir sorguda bulunmaktadır. Şimdi dize bir istek gelmedi, bu yüzden magic_quotes_gpc dize kaçış yok. Voilà, SQL enjeksiyonu; Veri şimdi muhtemelen gitti.

mysql_real_escape_string gibi bir şey ya da bir sorgu oluşturucu (örn. adodb) ile bir veritabanı soyutlama katmanı, ya kendinizi kaçan bazı araçları kullanarak, sadece en iyi için umut kesinlikle üstündür.