-3

SQL インジェクション攻撃に対する保護をアップグレードして、より体系的にしたいと考えています。pdo、プリペアド ステートメント、mysql_escape_string の 3 つの主要な方法をまとめました。pdo が最適であると考えられますが、細心の注意を払っている場合は mysql_escape_string で十分であると考えられます。複数のテーブルを含む複雑なクエリがたくさんあるので、PDO または準備済みステートメントに行く準備ができていないと思うので、これは大きな作業になるでしょう。しかし、mysql_escape_string をよりプログラム的に利用したいと考えています。

ユーザーが送信する個々の変数をすべてエスケープするのではなく、句読点を処理するために何らかの変更が必要になる可能性がある標準関数を使用して SQL コマンドをエスケープすることを考えていました。および % などです。すべての sql ステートメントの標準関数は、変数ごとのアプローチよりも体系的で標準的であるように思われます。では、句読点を処理するためにどのような変更が必要になる可能性があるのでしょうか? また、mysql_escape_string が 100% 完了していないので、htmlspecialchars や strip_tags など、関数に入れるべきものは他にありますか?

基本機能はこちら。

function safe($sql) {
$safesql = mysql_real_escape_string($sql);
return $safesql;
}
4

5 に答える 5

3

複数のテーブルを含む複雑なクエリがたくさんあるので、PDO または準備済みステートメントに行く準備ができていないと思うので、これは大きな作業になるでしょう。

巨大?多分。しかし、努力する価値はあります。

クエリ全体をエスケープすると問題が発生します

はい。関数は、SQL の一部がインジェクション攻撃なのか、意図したものなのかを知る方法がありません。

SQLに挿入された時点でテキストをエスケープする必要があります。テキストを SQL に挿入してから、どのビットが SQL で、どのビットがテキストであったかを後で判断することはできません。

htmlspecialchars や strip_tags など、関数に入れるべきものは他にありますか?

strip_tagsデータを捨てます。私はそれを使用しません。

との両方がstrip_tagshtmlspecialchars安全でないデータが HTML ドキュメントに挿入されるのを防ぎます。これらは、データを SQL に挿入する前ではなく、HTML ドキュメントにデータを挿入する前に使用してください。

于 2012-06-04T12:56:11.217 に答える
0

個人的には、「複雑なクエリ」を自分で保護することは、PDO や ActiveRecord などを使用するよりもはるかに複雑で時間がかかると安全に想定できると思います。さらに、コードをよりデータベースに依存しないものにします。

于 2012-06-04T13:17:00.173 に答える
0

クエリ全体で機能させる唯一の方法は、独自の SQL パーサーを作成することです。その場合でも 、クエリのどの部分が SQL インジェクションであるかを魔法のように確認する必要があります。それは不可能なので、一度にクエリ全体でこれを行うことはできません。

于 2012-06-04T12:57:29.100 に答える
0

明確にするために、mysql_real_escape_stringクエリ全体を使用するのではなく、クエリの作成に使用している文字列値のみを使用する必要があります。

例:

"Select Id from table where username ='".mysql_real_escape_string($username)."' limit 1";
于 2012-06-04T12:58:50.860 に答える
-1

個人的には、phpBB の人たちが書いた db-class が好きです。それは優れており、高速で、かなり安全です。

于 2012-06-04T13:01:19.043 に答える