1

アドバイスをいただけますか?質問を検索しましたが、私のようなものは見つかりませんでした。

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を実行するEscapeメソッドを持つデータベースクラスがあると仮定します

しかし、挿入クエリを壊すため、SQLクエリにも自動エスケープを設定できません。

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

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

それはそれらを\'xxx\'にします。これは正しくありません。

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

要するに-クエリ全体で機能し、値のみをエスケープするスマート自動エスケープを作成するにはどうすればよいですか?

4

4 に答える 4

4

実際、考慮すべき唯一のこと(ここではテストプロジェクトについては明らかに話していません)は、パラメーター化されたステートメントを使用することです。これが唯一の方法です(もちろん、SQL Synaxで許可されている場合)。適切に実行すれば、システムが複雑になることはありませんが、システムはより堅牢になります。

于 2009-04-08T10:20:38.967 に答える
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)."'";

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

醜い?ええ。そのため、代わりにパラメーター化されたクエリを使用します。これにより、文字列の連結とそのすべての問題を回避できます。

文字列の連結は簡単に見えます。人々は、ひもを一緒に詰め込むことを理解していると思っています。しかし、実際にはそうではありません。

于 2009-04-08T10:38:46.067 に答える
1

私はこの方法を使用します:

$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');
于 2009-04-08T10:22:56.947 に答える
0

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

パラメータ化されたクエリは「より複雑」であるというあなたの主張を説明してください。外部データをクエリに連結することは決してありません。それは世界で最も簡単なことであり、どのエスケープ手法よりもはるかに「防弾」に近いものです。

于 2009-04-08T10:54:29.213 に答える