Kullanıcı sağlanan giriş SQL-öncelemeli

4 Cevap php

Bana tavsiye verebilir misiniz? Ben sorular için aradı ama benim için benzer bir şey bulamadık.

SQL sorgularında kullanmak üzere tasarlanmıştır zaman nasıl benim kullanıcı girdileri otomatik olarak kaçtı yapabilirim? Gibi bir şey ile dolu benim kod sevmiyorum

$var_x = $DB->Escape($_POST['var_x']);
$another_var = $DB->Escape($_POST['another_var']);
$some_string = $DB->Escape($_POST['some_string']);
...

* I mysql_real_escape_string gerçekleştirir Escape yöntemi ile Veritabanı sınıf var varsayarsak

Bu insert sorguları tatili nedeniyle Ama ben, hem de SQL sorgusuna otomatik kaçış ayarlanamaz:

function Exec($sql){
   $result = mysql_query($this->Escape($sql));
}

$q = $DB->Exec("SELECT * FROM table WHERE id = 'xxx'");

Onları \ 'xxx \' yapar. hangi yanlıştır.

Yapmak istediğim son şey sistemi daha karmaşık hale getirecek gibi parametreli ifadeleri olun. Başka bir şey bıraktı zaman ben bu seçeneği göz önünde olacak.

Kısacası - Bütün sorgu ile çalışıyor ve sadece değerler kaçar akıllı otomatik kaçış yapmak nasıl?

4 Cevap

Aslında, hiç (biz tabii ki, burada test projeleri konuşma değil) düşünmelisiniz bir ve tek şey parametreli ifadeler kullanmaktır. Bu tek yol (SQL synax tabii, onlar için izin verdiğinde) olduğunu. Düzgün yapılmazsa, bu sistem daha karmaşık yapmaz, ama onlar will daha güçlü olun.

Maalesef, otomatik bir şey olamaz. Dizeleri bitiştirmek zaman, her zaman karakter orada sorunlar kaçan olacak; bu konuda tekrar düşünmek zorunda kez ve asla 'çözmek' bir şey değildir.

Eğer yaparsanız:

$a= "a'b";
$query= "SELECT * FROM things WHERE name='$a'";

Sonra sorgu dizesi gerçek dize hazır olarak kesme, alt ve dize sınırlayıcı tek tırnak hem kesme içerir:

SELECT * FROM things WHERE name='a'b'

Bir öncelenmesi gerekir; Diğer olmamalıdır. Nasıl hangisi söyleyebilir? Sen, bu bilgiler sonsuza kadar kayıp olamaz. Bunun yerine söylemeliyim:

$query= "SELECT * FROM things WHERE name='".mysql_real_escape_string($a)."'";

(Ya da hangisi diğer kaçış işlevi kullandığınız veritabanı için daha uygundur.)

Çirkin? Hell yeah. Yerine Parametrelenmiş sorguları kullanmak neden budur. Bu uzakta tüm sıkıntılardan ile dize birleştirme aldığı.

String birleştirme kolay görünüyor. İnsanlar birlikte clodging dizeleri anlıyorum. Ama gerçekten, onlar değil.

Ben bu yöntemi kullanın:

$db->set('name',$name);
$db->set('title',$title);
$db->insert('users');

İşte $db->set() yöntemi otomatik olarak (2 argüman yani) değeri kaçar.

PHP 5 ile de yapabilirsiniz:

$db->set('name',$name)->set('title',$title)->insert('users');

Last thing i want to do is make parameterized statements, as it will make system more complicated. I'll consider this option when nothing else will left.

Sorgular "daha karmaşık" olduğunu parametrelenmişse sizin iddiasını açıklamak ister misin? ever - - Ben sorguları dış verileri birleştirmek yoktur ve bunu yapmak için dünyanın en basit şey, yanı sıra herhangi bir kaçış tekniği daha "kurşun geçirmez" çok daha yakın olmak olmak hiç muhtemeldir.