Latest web development tutorials

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のクエリ文字列で参照すべきでないデータを取得するとき、それは奇妙な結果につながりますのでご注意ください。