From 65dba42ed400ba2ee930e418aff9595ae2949b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AD=A6=E7=94=B0=20=E6=86=B2=E5=A4=AA=E9=83=8E?= Date: Sun, 11 Oct 2026 22:55:21 +0900 Subject: [PATCH] =?UTF-8?q?mysqli=20=E3=82=92=E5=8E=9F=E6=96=87=E3=81=AE?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=81=AB=E8=BF=BD=E5=BE=93=20(2=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/mysqli/mysqli/quote-string.xml | 174 ++++++++++++++++++ .../mysqli/mysqli/real-escape-string.xml | 39 ++-- 2 files changed, 199 insertions(+), 14 deletions(-) create mode 100644 reference/mysqli/mysqli/quote-string.xml diff --git a/reference/mysqli/mysqli/quote-string.xml b/reference/mysqli/mysqli/quote-string.xml new file mode 100644 index 0000000000..e11d69edd3 --- /dev/null +++ b/reference/mysqli/mysqli/quote-string.xml @@ -0,0 +1,174 @@ + + + + + + mysqli::quote_string + mysqli_quote_string + SQL 文で使用する文字列をエスケープし、クォートで囲む + + + + &reftitle.description; + &style.oop; + + public stringmysqli::quote_string + stringstring + + &style.procedural; + + stringmysqli_quote_string + mysqlimysql + stringstring + + + SQL 文中で使用できる正しい形式の SQL 文字列リテラルを作成します。 + 指定した文字列は、接続で使用している現在の文字セットを考慮して + mysqli::real_escape_string と同じ方法でエスケープされたうえで、 + シングルクォートで囲まれます。 + そのため、戻り値にはクォートを追加せず、そのままクエリに埋め込む必要があります。 + + + mysqli::real_escape_string とは異なり、 + 接続で NO_BACKSLASH_ESCAPES SQL モードが有効になっている場合でも、 + 結果を安全に使えます。 + + + セキュリティ: デフォルトの文字セット + + 文字セットは、サーバーレベルか API 関数 + mysqli_set_charset のどちらかで設定しないと、 + mysqli_quote_string に反映されません。詳細は + 文字セットの概念 + を参照ください。 + + + + + クォートが適しているのは、文字列リテラルだけです。 + テーブル名やカラム名などの識別子は、クォートしても安全にはなりません。 + 可能な限り、プリペアドステートメント + を使い、クエリを手動で組み立てるのは避けてください。 + + + + + + &reftitle.parameters; + + + &mysqli.link.description; + + string + + + エスケープしてクォートで囲む文字列。 + + + エンコードされる文字は + NUL (ASCII 0)、 + \n、\r、 + \、'、 + "、および + CTRLZ + です。 + 接続で NO_BACKSLASH_ESCAPES SQL モードが有効になっている場合は、 + ' だけを 2 つ重ねてエンコードします。 + + + + + + + + + &reftitle.returnvalues; + + シングルクォートで囲んだ、エスケープ済みの文字列を返します。 + + + + + &reftitle.examples; + + <methodname>mysqli::quote_string</methodname> の例 + &style.oop; + +quote_string($city)); +$result = $mysqli->query($query); +printf("Select returned %d rows.\n", $result->num_rows); + +/* このクエリは失敗します。なぜなら、$city をエスケープしてクォートで囲む処理をしていないからです */ +$query = sprintf("SELECT CountryCode FROM City WHERE name='%s'", $city); +$result = $mysqli->query($query); +]]> + + &style.procedural; + + + + &examples.outputs.similar; + + + + + + + + &reftitle.seealso; + + mysqli::real_escape_string + mysqli::set_charset + + + + + diff --git a/reference/mysqli/mysqli/real-escape-string.xml b/reference/mysqli/mysqli/real-escape-string.xml index 8006d0ac29..8f78f5d540 100644 --- a/reference/mysqli/mysqli/real-escape-string.xml +++ b/reference/mysqli/mysqli/real-escape-string.xml @@ -1,6 +1,6 @@ - + @@ -23,22 +23,32 @@ stringstring - この関数を使用して、SQL 文中で使用できる正当な形式の SQL 文字列を作成します。 + この関数を使用して、SQL 文中で使用できる正しい形式の SQL 文字列を作成します。 文字列 escapestr が、エスケープされた SQL に変換されます。その際、接続で使用している現在の文字セットが考慮されます。 セキュリティ: デフォルトの文字セット - サーバーレベルで設定するなり API 関数 - mysqli_set_charset を使うなりして、 - 文字セットを明示しておく必要があります。この文字セットが - mysqli_real_escape_string - に影響を及ぼします。詳細は + 文字セットは、サーバーレベルか API 関数 + mysqli_set_charset のどちらかで設定しないと、 + mysqli_real_escape_string に反映されません。詳細は 文字セットの概念 を参照ください。 + + + この関数は結果をクォートで囲まないため、呼び出し側で囲む必要があります。 + 接続で NO_BACKSLASH_ESCAPES SQL モードが有効になっている場合、 + エスケープされるのはシングルクォート (') だけです。 + そのため、値をダブルクォート (") で囲むと、 + 文字列が途中で終わってしまい、SQL インジェクションにつながるおそれがあります。 + 代わりに プリペアドステートメント + を使ってください。それができない場合は、結果を常にシングルクォートで囲む + mysqli::quote_string を使ってください。 + + @@ -52,7 +62,7 @@ エスケープする文字列。 - + エンコードされる文字は NUL (ASCII 0)、 \n、\r、 @@ -60,7 +70,9 @@ "、および CTRLZ です。 - + 接続で NO_BACKSLASH_ESCAPES SQL モードが有効になっている場合は、 + ' だけを 2 つ重ねてエンコードします。 + @@ -133,11 +145,10 @@ Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax &reftitle.seealso; - - - mysqli_set_charset - - + + mysqli_set_charset + mysqli_quote_string +