質問

あなたは私に助言お願いできますか?私が質問を探したが鉱山に似何かが見つかりませんでした。

どのように私は、ユーザーの入力が自動的にそれらがSQLクエリで使用することを意図しているときにエスケープするのですか?私のようなもので満たされた私のコードでは好きではありません。

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

の私はmysql_real_escape_stringの

実行エスケープ方式を使用したデータベースのクラスを持っていると仮定すると、

しかし、それはINSERTクエリを壊すので、私は、同様のSQLクエリで自動エスケープを設定することはできません。

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

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

これは作る彼ら\ 'XXX \'。これは間違っています。

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

要するに - ?全体クエリと連携し、値のみをエスケープスマート自動エスケープを作る方法

役に立ちましたか?

解決

実際には、1とあなたが考慮しなければならない唯一のものは、(私たちは明らかに、ここでのテストプロジェクトについて話していない)パラメータ化された文を使用することです。これは、(SQLのSYNAXはもちろん、彼らのために可能に)唯一の方法です。適切に行われ、これらは、あなたのシステムをより複雑にすることはありませんが、彼らは<全角> のそれはより堅牢になります。

他のヒント

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

あなたが行う場合:

$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)."'";

(またはいずれか他のエスケープ関数は、使用しているデータベースに適しています。)

醜いですか?地獄ええ。私たちが代わりにパラメータ化クエリを使用する理由です。これは、そのすべての苦境を持つ文字列の連結から離れるます。

文字列の連結が簡単になります。人々は、彼らが一緒にclodging文字列を理解すると思います。しかし、実際に、彼らにはありません。

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

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

ここ$db->set()方法は、自動的に値(すなわち第2引数)をエスケープ。

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

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

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

クエリが「より複雑」であり、パラメータ化あなたの主張を説明するためにケア? の今までにの - - 私は、クエリへの外部データを連結していない、それが行うには、世界で最も簡単なことだ、ならびに任意のエスケープ技術よりも「防弾」をはるかに近いということであることが今までにありそうです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top