Ne aşağıdaki yapmanın daha iyi bir yolu olacaktır

2 Cevap php
if(get_magic_quotes_gpc())
{
  $location_name = trim(mysql_real_escape_string(trim(stripslashes($_GET['location_name']))));
}
else
{
  $location_name = trim(mysql_real_escape_string(trim($_GET['location_name'])));
}

Ben bugüne kadar kod. Bu kod ... Tamam temelde gibi geliyor bana. Eğer ben güvenle iç trim() kaldırabilirsiniz düşünüyorum. Bu sonsuz sürümü ile spam bana değil deneyin, ben bu daha iyi yapmak için learn nasıl denemek istiyorum.

UPDATE

Yani bazı cevapların okuduktan sonra, ben güvenle, bir kullanıcı veri alma depolamak ve daha sonra geri görüntülemek için iyi bir yöntem anlamak için geldik düşünüyorum.

Ilk sayfasını yüklediğinizde

$foo = trim($_GET['foo']);
if(get_magic_quotes_gpc())
{
  $foo = stripslashes($foo);
}

Eğer veritabanında verileri saklamak olmasa bile, bir SQL dizesinin bir parçası olarak bu değişkeni kullanmak için geldiğinde, sonra bunu kaçmak gerekir.

 mysql_real_escape_string($foo);

Ve nihayet, veritabanından veri okuma ve HTML olarak görüntülemek isteyen varsa, bir blog ya da forum üzerinde böyle bir mesajı htmlspecialchars kullanarak değişkeni geçmelidir

echo(htmlspecialchars($bar));

Herhangi birini kullanmak için fonksiyonları daha iyi bir dizi önermek ister misiniz? sonra diğer tabii aramak için onları kolaylaştırmak için bu işlevleri sarma.

2 Cevap

İşte:

$location_name = trim($_GET['location_name']);
if(get_magic_quotes_gpc()) $location_name=stripslashes($location_name);

Sonra SQL enjeksiyonu koruma da, ancak bir SQL sorgusunda Bu VAR yapışmadan önce son dakikaya kadar bunu yapmayın. Ve o zaman bile var kendisi değil, bir kopyasına değişiklikleri uygulamak değildir. Sen (Form başarısız olursa örneğin) sonra kullanıcıya $ LOCATION_NAME göstermek isteyebilirsiniz. Bu yüzden

$sql="UPDATE whatever(location) VALUES('" . mysql_real_escape_string($location_name) . "')"

Ben $ LOCATION_NAME veritabanında sona erecek elbette varsayarak yaşıyorum; aksi takdirde mysql_real_escape_string gerekmez.

Eğer bir yerde sayfanızda $ LOCATION_NAME görüntülemek için gidiyoruz eğer Sonunda htmlspecialchars kullanmak istiyorum.

Edit: Sadece (kesinlikle zaten veritabanında htmlspecialchars'dan yoluyla dönüşmüş verileri kaydetmek değil) veri görüntülemeden önce htmlspecialchars () kullanmak istiyorum. Genel olarak son anda kaçan fonksiyonları kullanmak ve sonra var bir kopyasını istiyorum. Eğer komut sırasında herhangi bir noktada var orijinal biridir ve bir yerde daha önce de oldu, bir dönüşümün bazı rasgele karakterlerini taşıyan olmadığını biliyorum yolu.

Kaçış fonksiyonları / olması gerektiği yeri de biliyorsun. sql öncelemeli sql sorgu / yakındır. XSS (htmlspecialchars'ın) kaçan bir web sayfasında verileri görüntülemek parçası yakındır.

Eğer şeylerin kavrama kez olsun Son olarak, her zaman PHP'nin PDO işlevlerini kullanarak SQL kaçan vazgeçmek olabilir. Ayrıca gelecekte bu bakmak da almak isteyebilirsiniz: http://stackoverflow.com/questions/110575/do-htmlspecialchars-and-mysql-real-escape-string-keep-my-php-code-safe-from-injec

Söylemek üzgünüm ama söz herşey yanlış.

Birincisi, hiçbir şekilde, performans ile ilgisi yoktur. Bu işlevler bir darboğaz ve asla herhangi bir performans sorunu neden asla.

Sonraki Sen sihirli tırnak kurtulmak için yanlış yeri tercih ettik. Sihirli tırnak ilgili ilgili veri girişi, veritabanı değil değildir. Bu ayrı bir işlevi yapmak ve yapılandırma dosyasında yerleştirmek, her komut dahil olmak daha iyidir. Sen here birini kullanabilirsiniz

Yani, kod bu gibi olmak:

$location_name = mysql_real_escape_string(trim($_GET['location_name']));

Veritabanı öncelemeli sıkı ve koşulsuz ise başka bir şey isteğe bağlı olarak ama ben şiddetle, başka bir şey ile kaçan veritabanı karıştırmak için değil tavsiye.