SQLiteの注射
あなたのウェブサイトには、SQLiteデータベースに入力し、入力をユーザーに許可する場合、あなたは安全性の問題に直面しているこの時間は、SQLインジェクションと呼ばれています。 この章では、これを防止するために、セキュリティスクリプトSQLiteの文を確保する方法を紹介します。
ユーザーが名前を入力する必要があるなど、ユーザの入力を要求する際の注射は、通常発生しますが、ユーザーは、SQLiteの文が入っており、この文は無意識のうちに、データベース上で実行されます。
ユーザーが入力したデータを信頼することはありません、唯一の検証データ処理ので、ルールは、パターンマッチングによって行われます。 これらのルールを変更するには、必要に応じて - 次の例では、ユーザー名、ユーザー名には、英数字またはアンダースコアに制限され、長さは8-20文字の間でなければなりません。
場合(するpreg_matchは($ _GET [ 'ユーザー名']、 "/ ^ \ {8,20} $ / W"、$)が一致します){ $ Dbを=新しいにSQLiteDatabase( 'ファイル名'); $結果= @ $ DB->クエリ( "[0]ユーザー名= $マッチSELECT * FROM"); }エルス{ 「受け入れられないユーザ名 "エコー; }
この問題を示すために、この仮説の抜粋を考えてみます。問題を示すために、この抜粋を考えてみます。
$名= "カディール ';ユーザーからのDELETE;"; @ $ DB->クエリ( "ユーザ名= '{$名}'のユーザーSELECT * FROM");
ユーザー名で指定された列名を取得する関数呼び出しは、ユーザテーブルからレコードと一致します。 通常の状況下では、$ nameは、このような文字列の腸骨などの英数字とスペースが含まれています。 $名が新しいクエリを追加するしかし、ここで、データベースへの呼び出しは致命的な問題が発生します:ユーザーのすべてのレコードを削除するには、DELETEクエリを注入しました。
あなたは、文字列内の実行を提供し、クエリ、コールは失敗しますが、SQLiteのとPostgreSQLはまだクエリに積層されているが、スタックしようとした場合、1つの関数呼び出しで複数のクエリを積み重ねるクエリまたはデータベースインタフェースを実行するためにそこに許可されていませんが、すべてのクエリ、深刻なセキュリティ上の問題を引き起こす可能性があります。
SQLインジェクションを防ぎます
PerlやPHPなどのスクリプト言語では、巧みにエスケープ文字のすべてを扱うことができます。 PHPは、特殊文字の入力をエスケープするために使用されているSQLiteのためのプログラミング言語の文字列関数のsqlite_escape_stringを()を提供します。
場合(get_magic_quotes_gpc()) { $名= sqlite_escape_string($名); } $結果= @ $ DB->クエリ( "ユーザー名= '{$名}' SELECT * FROM");
データは挿入が安全になるように符号化されているが、それは単純なテキスト比較をレンダリングしますが、WHERE句を使用できないLIKE、クエリで、列は、バイナリデータが含まれています 。
、にaddslashes()をSQLiteのクエリ文字列で参照すべきでないデータを取得するとき、それは奇妙な結果につながりますのでご注意ください。