-
Notifications
You must be signed in to change notification settings - Fork 82
Expand file tree
/
Copy pathsetauthorizer.xml
More file actions
260 lines (246 loc) · 12.6 KB
/
setauthorizer.xml
File metadata and controls
260 lines (246 loc) · 12.6 KB
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
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 22583751fbfdaa3eaa41aeb6470d1343f5cb2c78 Maintainer: mumumu Status: ready -->
<refentry xml:id="sqlite3.setauthorizer" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>SQLite3::setAuthorizer</refname>
<refpurpose>SQL文が出来ることを限定するため、authorizer として使われるコールバックを設定する</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis role="SQLite3">
<modifier>public</modifier> <type>bool</type><methodname>SQLite3::setAuthorizer</methodname>
<methodparam><type class="union"><type>callable</type><type>null</type></type><parameter>callback</parameter></methodparam>
</methodsynopsis>
<para>
SQLite に対して毎回アクション(読み取り、削除、更新など)
が実行される度に呼び出されるコールバックを設定します。
これは信頼できないソースがSQL文を準備する時に、
自分たちが許可していないデータにアクセスさせないとか、
データベースに損害を与える不正なSQL文を実行させないといった用途に使います。
たとえば、アプリケーションはデータベースの評価の際は
任意のSQL文の実行を許可しています。しかし、
データベースに対する変更は許可したくありません。
ユーザーが入力したSQL文が準備される間に、
authorizer が割って入り、SELECT 文以外のSQL文を許可しないようにできます。
</para>
<para>
authorizer コールバックは、
SQLite が文を準備するたびに複数回呼ばれる可能性があります。
<literal>SELECT</literal> や
<literal>UPDATE</literal> 文は
個別のカラムが読み取られたり、更新されたりするたびに
authorizer を呼び出します。
</para>
<para>
authorizer は引数を5つまで指定して呼び出すことが出来ます。
最初の引数は常に与えられます。
これは <literal>SQLite3</literal> の定数に一致する
<type>int</type> の値(アクションコード) です。
それ以外の引数は、アクションによっては与えられないことがあります。
以下の表が、アクションに応じた2番目と3番目の引数に関する説明を記しています:
<table>
<title>アクションコードと引数の一覧</title>
<tgroup cols="3">
<thead>
<row>
<entry>アクション</entry>
<entry>第2引数</entry>
<entry>第3引数</entry>
</row>
</thead>
<tbody>
<row><entry><constant>sqlite3::create_index</constant></entry><entry>インデックス名</entry><entry>テーブル名</entry></row>
<row><entry><constant>sqlite3::create_table</constant></entry><entry>テーブル名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::create_temp_index</constant></entry><entry>インデックス名</entry><entry>テーブル名</entry></row>
<row><entry><constant>sqlite3::create_temp_table</constant></entry><entry>テーブル名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::create_temp_trigger</constant></entry><entry>トリガ名</entry><entry>テーブル名</entry></row>
<row><entry><constant>sqlite3::create_temp_view</constant></entry><entry>view名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::create_trigger</constant></entry><entry>トリガ名</entry><entry>テーブル名</entry></row>
<row><entry><constant>sqlite3::create_view</constant></entry><entry>view名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::delete</constant></entry><entry>テーブル名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::drop_index</constant></entry><entry>インデックス名</entry><entry>テーブル名</entry></row>
<row><entry><constant>sqlite3::drop_table</constant></entry><entry>テーブル名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::drop_temp_index</constant></entry><entry>インデックス名</entry><entry>テーブル名</entry></row>
<row><entry><constant>sqlite3::drop_temp_table</constant></entry><entry>テーブル名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::drop_temp_trigger</constant></entry><entry>トリガ名</entry><entry>テーブル名</entry></row>
<row><entry><constant>sqlite3::drop_temp_view</constant></entry><entry>view名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::drop_trigger</constant></entry><entry>トリガ名</entry><entry>テーブル名</entry></row>
<row><entry><constant>sqlite3::drop_view</constant></entry><entry>view名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::insert</constant></entry><entry>テーブル名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::pragma</constant></entry><entry>プラグマの名前</entry><entry>プラグマに渡す最初の引数。もしくは &null;</entry></row>
<row><entry><constant>sqlite3::read</constant></entry><entry>テーブル名</entry><entry>カラム名</entry></row>
<row><entry><constant>sqlite3::select</constant></entry><entry>&null;</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::transaction</constant></entry><entry>操作</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::update</constant></entry><entry>テーブル名</entry><entry>カラム名</entry></row>
<row><entry><constant>sqlite3::attach</constant></entry><entry>ファイル名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::detach</constant></entry><entry>データベース名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::alter_table</constant></entry><entry>データベース名</entry><entry>テーブル名</entry></row>
<row><entry><constant>sqlite3::reindex</constant></entry><entry>インデックス名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::analyze</constant></entry><entry>テーブル名</entry><entry>&null;</entry></row>
<row><entry><constant>sqlite3::create_vtable</constant></entry><entry>テーブル名</entry><entry>モジュール名</entry></row>
<row><entry><constant>sqlite3::drop_vtable</constant></entry><entry>テーブル名</entry><entry>モジュール名</entry></row>
<row><entry><constant>sqlite3::function</constant></entry><entry>&null;</entry><entry>ファンクション名</entry></row>
<row><entry><constant>sqlite3::savepoint</constant></entry><entry>操作</entry><entry>セーブポイントの名前</entry></row>
<row><entry><constant>sqlite3::recursive</constant></entry><entry>&null;</entry><entry>&null;</entry></row>
</tbody>
</tgroup>
</table>
</para>
<para>
4番目の引数は、適切な場合にだけ指定する(<literal>"main"</literal>,
<literal>"temp"</literal>, などの) データベースの名前です。
</para>
<para>
authorizer コールバックに与える5番目の引数は、
トップレベルのSQLコードから直接アクセスが行われる場合に、
アクセスを試みる責任を持つ一番奥の view やトリガの名前です。
</para>
<para>
コールバックが <constant>SQLite3::OK</constant>
を返すと、操作のリクエストが承認されたことになります。
コールバックが <constant>SQLite3::DENY</constant>
を返すと、authorizer を動かした呼び出しは失敗し、
なぜアクセスが失敗したのかを説明するメッセージが残ります。
</para>
<para>
アクションが <constant>SQLite3::READ</constant> で、
さらにコールバックが
<constant>SQLite3::IGNORE</constant> を返す場合、
準備されたSQL文は、
<constant>SQLite3::OK</constant> が返された場合に読まれていたテーブルのカラムを &null; で置き換えるように文を組み立てます。
<constant>SQLite3::IGNORE</constant> は、
信頼できないユーザーのアクセスが、
テーブルの個別のカラムへのアクセスを拒否する場合に使うことが出来ます。
</para>
<para>
テーブルを <literal>SELECT</literal> 文で参照しているが、
そのテーブルからカラムの値を抜き出さない場合
(たとえば、<literal>"SELECT count(*) FROM table"</literal>
のようなクエリの場合)、
<constant>SQLite3::READ</constant> の authorizer コールバックは
カラムの情報が空文字列になった状態で一度だけ呼び出されます。
</para>
<para>
アクションコードが <constant>SQLite3::DELETE</constant> で、
さらにコールバックが
<constant>SQLite3::IGNORE</constant> を返した場合、
DELETE の操作は継続しますが、truncate による最適化は無効になります。
この場合、全ての行は個別に削除されます。
</para>
<para>
接続ひとつにつき、authorizer ひとつだけがデータベースに存在できます。
<methodname>SQLite3::setAuthorizer</methodname> が呼び出されるたびに、
以前の呼び出しは上書きされます。
&null; をコールバックに指定することで、
authorizer を無効に出来ます。authorizer はデフォルトで無効になっています。
</para>
<para>
authorizer コールバックは、コールバックを呼び出すデータベース接続に対していかなる変更もしてはいけません。
</para>
<para>
authorizer はSQL文が準備される時にだけ呼び出されることに注意して下さい。
実行時ではありません。
</para>
<para>
さらなる詳細は
<link xlink:href="&url.sqlite;c3ref/set_authorizer.html">SQLite3 のドキュメント</link> を参照ください。
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term><parameter>callback</parameter></term>
<listitem>
<para>
呼び出される <type>callable</type>。
</para>
<para>
&null; が渡されると、
現在の authorizer のコールバックが無効になります。
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.success;
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
このメソッドは例外をスローしません。
しかし、いったん authorizer が有効になり、不正な値を返すと、
SQL文の準備がエラー
(または例外。
<methodname>SQLite3::enableExceptions</methodname> の使い方によります)
を発生させるようになります。
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title><methodname>SQLite3::setAuthorizer</methodname> の例</title>
<para>
この例は、読み取りだけを許可します。
さらに、<literal>users</literal> テーブルのいくつかのカラムだけを返します。
他のカラムは &null; で置き換えられます。
</para>
<programlisting role="php">
<![CDATA[
<?php
$db = new SQLite3('data.sqlite');
$db->exec('CREATE TABLE users (id, name, password);');
$db->exec('INSERT INTO users VALUES (1, \'Pauline\', \'Snails4eva\');');
$allowed_columns = ['id', 'name'];
$db->setAuthorizer(function (int $action, ...$args) use ($allowed_columns) {
if ($action === SQLite3::READ) {
list($table, $column) = $args;
if ($table === 'users' && in_array($column, $allowed_columns)) {
return SQLite3::OK;
}
return SQLite3::IGNORE;
}
return SQLite3::DENY;
});
print_r($db->querySingle('SELECT * FROM users WHERE id = 1;'));
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[id] => 1
[name] => Pauline
[password] =>
)
]]>
</screen>
</example>
</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
-->