2009-04-08 15 views
1

私に助言してもらえますか?私は質問を探しましたが、私のものと似た何かを見つけませんでした。ユーザー入力のSQLエスケープ

SQLクエリで使用するときにユーザー入力を自動的にエスケープするにはどうすればよいですか?私は、私は

をmysql_real_escape_stringの実行しかし、私は同様にSQLクエリで自動エスケープを設定することはできませんエスケープメソッドを使用したデータベースのクラスを持っていると仮定すると

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

ようなもので満たされた私のコードでは好きではありませんそれは挿入クエリを破るためです:

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

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

それは\ 'xxx \'になります。これは間違っています。

最後に私がやりたいことは、システムをより複雑にするため、パラメータ化された文を作ることです。他に何も残らないときはこのオプションを検討します。

簡潔に言うと、全体のクエリで機能し、値だけをエスケープするスマートな自動エスケープを作成する方法は?

答えて

4

実際、考慮する必要がある唯一のことは、パラメータ化された文を使用することです(明らかにここでのテストプロジェクトとは言いません)。これが唯一の方法です(SQLのsynaxが許される場合はもちろんです)。正常に実行されても、これらはシステムをより複雑にすることはありませんが、になります。

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

はここ$db->set()メソッドが自動的に(すなわち第2引数)の値をエスケープ:

+0

ありがとう、私はそれに行きます。 –

1

は、私は、このメソッドを使用します。

PHP 5では、あなたもこれを行うことができます。

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

申し訳ありませんが、あなたは自動何もできません。文字列を連結するときには、常に文字をエスケープする必要があります。これは一度「解決」できるものではなく、もう一度考える必要はありません。

そうした場合:

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

は、その後、あなたのクエリ文字列は、文字列の区切り文字はともに文字列リテラル内の実際のアポストロフィありアポストロフィ、アポストロフィ含まれています

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

一つはエスケープする必要がありますが、もう一つはしてはならない。どちらがどのようなものかをどのように判断できますか?あなたは、その情報は永遠に失われません。代わりに言わなければならない:(または使用しているデータベースに適している他の方のエスケープ機能)

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

醜いですか?ええ、ええ。そのため、代わりにパラメータ化クエリを使用しています。これは、すべての悲惨さで文字列の連結から離れます。

文字列の連結が簡単です。人々は一緒に紐を理解すると思っています。しかし、実際にはそうではありません。私がやりたい

0

最終のものは、それがシステムより 複雑になりますよう、パラメータ化された文を作るです。他に何も残らないときはこのオプションを検討します。

パラメータ化されたクエリが「より複雑」であるというあなたの主張を説明するのに気をつけますか?私は外部のデータをクエリに連結しません。これはです。これは世界で最も簡単なことですが、エスケープするテクニックよりも "防弾性"に近いことがあります。