-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathmysql-real-escape-string.xml
240 lines (223 loc) · 7.73 KB
/
mysql-real-escape-string.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 62aa2694baf7fe904744a9b0f8a2a26e7fc3cf12 Maintainer: takagi Status: ready -->
<refentry xml:id="function.mysql-real-escape-string" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>mysql_real_escape_string</refname>
<refpurpose>SQL 文中で用いる文字列の特殊文字をエスケープする</refpurpose>
</refnamediv>
<refsynopsisdiv>
<warning>
&mysql.alternative.note;
<simplelist role="alternatives">
<member><function>mysqli_real_escape_string</function></member>
<member><methodname>PDO::quote</methodname></member>
</simplelist>
</warning>
</refsynopsisdiv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>string</type><methodname>mysql_real_escape_string</methodname>
<methodparam><type>string</type><parameter>unescaped_string</parameter></methodparam>
<methodparam choice="opt"><type>resource</type><parameter>link_identifier</parameter><initializer>NULL</initializer></methodparam>
</methodsynopsis>
<para>
現在の接続の文字セットで <parameter>unescaped_string</parameter>
の特殊文字をエスケープし、 <function>mysql_query</function>
で安全に利用できる形式に変換します。バイナリデータを挿入しようとしている場合、
必ずこの関数を利用しなければなりません。
</para>
<para>
<function>mysql_real_escape_string</function> は、MySQL のライブラリ関数
mysql_real_escape_string をコールしています。
これは以下の文字について先頭にバックスラッシュを付加します。
<literal>\x00</literal>, <literal>\n</literal>,
<literal>\r</literal>, <literal>\</literal>, <literal>'</literal>,
<literal>"</literal> そして <literal>\x1a</literal>.
</para>
<para>
データの安全性を確保するため、MySQL へクエリを送信する場合には
(わずかな例外を除いて)常にこの関数を用いなければなりません。
</para>
<caution>
<title>セキュリティ: デフォルトの文字セット</title>
<para>
サーバーレベルで設定するなり API 関数
<function>mysql_set_charset</function> を使うなりして、
文字セットを明示しておく必要があります。この文字セットが
<function>mysql_real_escape_string</function>
に影響を及ぼします。詳細は
<link linkend="mysqlinfo.concepts.charset">文字セットの概念</link>
を参照ください。
</para>
</caution>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>unescaped_string</parameter></term>
<listitem>
<para>
エスケープされる文字列。
</para>
</listitem>
</varlistentry>
&mysql.linkid.description;
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
成功した場合にエスケープ後の文字列、失敗した場合に &false; を返します。
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
MySQL 接続が存在しない状態でこの関数を実行すると、
<constant>E_WARNING</constant> レベルのエラーが発生します。
この関数は、MySQL 接続が確立した状態でのみ実行するようにしましょう。
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>単純な <function>mysql_real_escape_string</function> の例</title>
<programlisting role="php">
<![CDATA[
<?php
// 接続
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());
// クエリ
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title><function>mysql_real_escape_string</function> には接続が必須であることを示す例</title>
<para>
この例では、MySQL 接続が存在しない状態でこの関数を実行したときにどうなるかを示します。
</para>
<programlisting role="php">
<![CDATA[
<?php
// まだ MySQL に接続していません
$lastname = "O'Reilly";
$_lastname = mysql_real_escape_string($lastname);
$query = "SELECT * FROM actors WHERE last_name = '$_lastname'";
var_dump($_lastname);
var_dump($query);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Warning: mysql_real_escape_string(): No such file or directory in /this/test/script.php on line 5
Warning: mysql_real_escape_string(): A link to the server could not be established in /this/test/script.php on line 5
bool(false)
string(41) "SELECT * FROM actors WHERE last_name = ''"
]]>
</screen>
</example>
</para>
<para>
<example>
<title>SQL インジェクション攻撃の例</title>
<programlisting role="php">
<![CDATA[
<?php
// $_POST['password'] をチェックしなければ、このような例でユーザーに望みどおりの情報を取得されてしまう
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";
// データベース上のユーザーに一致するかどうかを調べる
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);
// MySQL に送信されたクエリは、
echo $query;
?>
]]>
</programlisting>
<para>
MySQL に送信されたクエリは次のとおり:
</para>
<screen>
<![CDATA[
SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
]]>
</screen>
<para>
これでは、パスワードを知らなくても誰でもログインできてしまいます。
</para>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<note>
<para>
<function>mysql_real_escape_string</function> を利用する前に、MySQL
接続が確立されている必要があります。もし存在しなければ、
<constant>E_WARNING</constant> レベルのエラーが生成され、&false;
が返されます。<parameter>link_identifier</parameter> が指定されなかった場合は、
直近の MySQL 接続が用いられます。
</para>
</note>
<note>
<para>
この関数を用いてデータをエスケープしなければ、クエリは
<link linkend="security.database.sql-injection">SQL インジェクション攻撃</link>
に対しての脆弱性を持ったものになります。
</para>
</note>
<note>
<simpara>
<function>mysql_real_escape_string</function> は
<literal>%</literal> や <literal>_</literal> をエスケープしません。
MySQL では、これらの文字を <literal>LIKE</literal>, <literal>GRANT</literal>,
または <literal>REVOKE</literal> とともに用いることで、
ワイルドカードを表現します。
</simpara>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>mysql_set_charset</function></member>
<member><function>mysql_client_encoding</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->