PHP と SQL はどちらも、Web アプリケーションでデータを処理するために一般的に使用されるプログラミング言語です。ユーザー入力データを扱うときは、データのセキュリティに注意を払う必要があります。ユーザーが機密情報にアクセスしたり盗んだりするために悪意のあるコードや SQL クエリを挿入しようとする可能性があるためです。これを防ぐには、入力されたデータをエスケープして、起こり得るリスクを排除する必要があります。この記事では、PHP と SQL でのデータ エスケープについて紹介します。
PHP では、入力データをエスケープするために使用できる 2 つの一般的な関数、つまりaddslashes()
とmysqli_real_escape_string()
。
1.1addslashes()
addslashes()
関数は、問題の発生を避けるために、文字列内の引用符やバックスラッシュなどの特殊文字をエスケープできます。データベース内で。たとえば、ユーザーが「I'm a hacker
」と入力しようとすると、この文字列は SQL ステートメントの引用構造を壊すため、PHP 構文エラーが発生します。addslashes()
を使用すると、この文字列をI\'m a hacker
にエスケープして正しく解析できるようになります。コードは次のとおりです。
$username = "I'm a hacker"; $username = addslashes($username);
1.2mysqli_real_escape_string()
mysqli_real_escape_string()
この関数は、使用できる接続関連の関数です。ステートメント内の SQL 特殊文字をエスケープします。この機能を使用する前に、データベースへの接続を作成する必要があります。サンプル コードは次のとおりです。
$conn = mysqli_connect($host, $user, $password, $dbname); $string = "I'm a hacker"; $string = mysqli_real_escape_string($conn, $string);
Usingmysqli_real_escape_string()
文字列をエスケープするときは、必ずデータベースへの接続の作成と関連付けてください。そうしないとエスケープできません。
SQL ステートメントでは、パラメーター化されたクエリを使用することでインジェクション攻撃を回避できます。パラメーター化されたクエリを使用すると、データを定数に変換できるため、悪意のあるコードの挿入を回避できます。
2.1 パラメータ化されたクエリ
パラメータ化されたクエリとは、実際のデータ値の代わりに SQL ステートメントでパラメータを使用することを指します。これらのパラメータは、ステートメントの実行時にのみ実際の値にバインドされます。 PHP では、PDO オブジェクトを使用してパラメータ化されたクエリを実行できます。例:
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $password); $stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username'); $stmt->execute(['username' => $username]);
この例では、コロン (:) を使用してユーザー名のプレースホルダーを作成します。次に、execute()
メソッドを使用して、プレースホルダーを実際のユーザー名の値にバインドします。
2.2 プリペアド ステートメント
SQL インジェクションを防ぐもう 1 つの方法は、プリペアド ステートメントを使用することです。この場合、SQL クエリ内のすべての変数はパラメータとして扱われ、クエリが実行される前にエスケープされます。 PHP では、mysqli
拡張機能を使用して、準備されたステートメントを実行できます。例:
$conn = mysqli_connect($host, $user, $password, $dbname); $stmt = mysqli_prepare($conn, 'SELECT * FROM users WHERE username = ?'); mysqli_stmt_bind_param($stmt, 's', $username); mysqli_stmt_execute($stmt);
この例では、mysqli_prepare()
関数を使用して、クエリ ステートメントを作成し、実行前にすべてのパラメータをバインドします。s
パラメータ タイプを使用して文字列変数をバインドします。次に、mysqli_stmt_execute()
関数を使用してクエリを実行します。
要約すると、Web アプリケーションでの SQL インジェクション攻撃を防ぐには、データのエスケープが重要です。 PHP では、addslashes()
またはmysqli_real_escape_string()
関数を使用して文字列をエスケープできます。 SQL ステートメントでは、パラメーター化されたクエリまたはプリペアド ステートメントを使用して、インジェクション攻撃を防ぐことができます。いずれの方法でも、Web アプリケーションのセキュリティを向上させることができます。
以上がphp、SQL、エスケープの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。