mysqli_real_escape_string
クエリのためにデータベースからデータを再利用するときに使用する必要がありますか? データベースに安全に挿入できるように、データは以前にエスケープされていました。データベースにデータを挿入するとき、バックスラッシュが削除されることを認識しています。ありがとう。
5 に答える
はい、別のクエリで再利用する場合は、DB から取得したデータを再エスケープする必要があります。エスケープは、プレゼントのギフトラッピングと同等であると考えてください。データベースの一部のデータを 1 つのクエリに「ラップ」します。データをアンラップし、データ ストアに配置します。後でそのデータを再度取得すると、ラッピングがなくなり、データが再び「危険」になります。
たとえば、次のようなものを検討してください。
$name = "Miles O'Brien";
$safe = mysql_real_escape_string($name); // name becomes Miles O\'Brien
$sql = "INSERT INTO people (names) VALUES '$safe'";
$result = mysql_query($sql) or die(mysql_error());
その名前はデータベースにありますが、実行したエスケープはもう存在しません-クエリを処理したときにデータベースによって削除されたので、次のようなことをすると:
$sql = "SELECT name FROM people"
$result = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_asssoc($result)) {
$name = $row['name']; // get Miles O'Brien from the DB again
ここでは、文字通りMiles O'Brien
まったくエスケープせずに取得します。
$other_sql = "UPDATE ... WHERE name=$name"; <---INJECTION HERE
}
エスケープは、「外部」データだけで行うものではありません...クエリ文字列に挿入するデータは、ほんの数行のコードの前にデータベースからそのデータを取得したとしても、「外部」データです。
TL;DR: 自分で簡単に注射できます。
はい、必要です。エスケープは、クエリを構文的に有効にするためにのみ使用され、テーブルに格納されているデータの一部ではありません。文字列をクエリに補間するときはいつでも、それをエスケープする必要があります。
例として、フル ネームのテーブルがあり、ラスト ネームを持つ人がいるとしO'Reilly
ます。クエリを実行してこの名前を に取得し$lname
、その変数を別のクエリで使用したい場合など。
$query = "SELECT username WHERE last_name = '$lname'";
文字列をエスケープしない場合、結果のクエリは次のようになります。
SELECT username WHERE last_name = 'O'Reilly'
ご覧のとおり、クオートは適切にバランスが取れていません。次のようになるようにエスケープする必要があります。
SELECT username WHERE last_name = 'O\'Reilly'
ただし、これらのパラメーターのプレースホルダーを使用して準備されたクエリを使用する場合は、これについてあまり心配する必要はありません (実際、プレースホルダーにバインドされている変数をエスケープするのは間違っています。バックスラッシュを格納するためです)。 )。これは一般的に好まれます。
また、データを抽出して復元するのではなく、SQL 自体を使用してデータを移動することを検討してください。
INSERT INTO Table1 (last_name)
SELECT last_name
FROM Table2
WHERE ...
これは、データベースとアプリケーションの間でデータを移動する必要がないため、より効率的である可能性もあります。
逃げるとはそういうことではない。
テキストのエスケープとは、SQL 文字列に挿入して元のテキストとして解釈できるように、エスケープ文字を挿入することを意味します。
間違ったエスケープ文字を使用しない限り、実際の値には影響しません。
テキストをあらゆる種類の構造化言語に連結するたびに、テキストを正しくエスケープする必要があります。
SQL を使用する場合は、連結の代わりにパラメーターを使用するのが理想的です。
使用する予定のすべてのユーザー入力データを適切に検証し、html または javascript コードの挿入を許可しないことを忘れないでください。MySQL インジェクションだけでなく、XSS 攻撃にも注意する必要があります。xss を防ぐ良い方法は、htmlspecialchars() を使用して HTML 文字を HTML エンティティに変換することです。