「開発:セキュリティ:SQLインジェクション」の版間の差分
Mitsuhiro Yoshida (トーク | 投稿記録) (ページの作成: 作成中です - ~~~~ This page forms part of the Moodle security guidelines. ==What is the danger?== Suppose your code in .../course/view.php?id=123...) |
Mitsuhiro Yoshida (トーク | 投稿記録) (Done.) |
||
(同じ利用者による、間の17版が非表示) | |||
1行目: | 1行目: | ||
このページは、[[開発:セキュリティ|Moodleセキュリティガイドライン]]の一部です。 | |||
==何が危険ですか?== | |||
.../course/view.php?id=123内にある、あなたのコードが、URIから渡される「$id = 123」を使って、次のようなSQL文を実行すると想定しましょう。 | |||
<code sql> | <code sql> | ||
SELECT FROM mdl_course WHERE id = $id; | SELECT FROM mdl_course WHERE id = $id; | ||
</code> | </code> | ||
そして、あなたのコードが、わざわざパラメータを適切にクリーニングしないと想定しましょう。 | |||
邪悪なハッカーにより、URIが次のように編集されます: | |||
: .../course/view.php?id=123;DELETE+FROM+mdl_user | : .../course/view.php?id=123;DELETE+FROM+mdl_user | ||
なぜ、これが非常に、非常に悪いことなのか、私があなたにお答えします。 | |||
もちろん、データベースクエリに応じて、悪意のある入力を適切に構築する必要がありますが、これは邪悪なハッカーにとって、単なる試行錯誤の問題でしかありません。 | |||
== | ==どのようにして、Moodleはこの問題を回避するのですか?== | ||
もう一度、これは、Moodle外部からの入力が非常に疑わしいという例です。上記例では、PARAM_INTからrequired_paramに渡すことで、$idは明確にクリーニングされています。 | |||
以下、さら手の込んだクエリです: | |||
<code sql> | <code sql> | ||
UPDATE mdl_user SET lastname = '$lastname' WHERE id = $id; | UPDATE mdl_user SET lastname = '$lastname' WHERE id = $id; | ||
</code> | </code> | ||
$lastnameが「O'Brian」の場合、どうなるでしょう? そうです、あなたは次のように「'」をエスケープする必要があります: O\'Brian | |||
Moodle 1.9では、required_paramまたはoptional_param経由であなたが取得する入力すべてには、自動的にaddslashesが適用されます。 | |||
Moodle 2.0では、私たちは、ストリングの連結により作成される、危険なSQL処理を完全に回避します。Moodle 2.0のSQLは、以下のようになります。 | |||
<code sql> | <code sql> | ||
UPDATE mdl_user SET lastname = ? WHERE id = ?; | UPDATE mdl_user SET lastname = ? WHERE id = ?; | ||
</code> | </code> | ||
そして、私たちは、SQLと共に配列値 array($lastname, $id) をデータベースに渡します。 | |||
==あなたのコードで、あなたがすべきこと== | |||
* | Moodle 2.0 | ||
* 可能な場合はいつでも、あなた自身がSQLを作成する必要性をなくすためにも、get_recordのような高いレベルのdmllibメソッドを使用してください。 | |||
* あなたがSQL文に値を入れる必要がある場合、安全に値を入れるためにプレースホルダを使用してください。 | |||
Moodle 1.9 | |||
* 可能な場合はいつでも、あなた自身がSQLを作成する必要性をなくすためにも、get_recordのような高いレベルのdmllibメソッドを使用してください。 | |||
* required_paramおよびoptional_paramDataからの値は、すでにaddslashesが適用されて、データベースクエリで使用できる準備ができています。しかし、値を一重引用符 (single quote) で囲っていることを確認してください。 | |||
* あなたがデータベースよりデータを読み込んで、再度インサートしたい場合、最初にaddslashesまたはaddslashes_objectを適用してください。 | |||
* [http://sqlmap.sourceforge.net/ sqlmap]のようなツールを使用して、あなたのコードをテストするか、手動で <nowiki>< > & &lt; &gt; &amp; ' \' 碁 \ \\</nowiki> のようなトリッキーな値を入力してください。 | |||
==管理者として、あなたが実践すべきこと== | |||
* 管理者として実践すべきことは、(あなたのMoodleを最新の状態にする以外) 特にありません。 | |||
==関連情報== | ==関連情報== | ||
* http://sqlmap.sourceforge.net/ - | * http://sqlmap.sourceforge.net/ - SQLインジェクション脆弱性を自動的に探すツールです。 | ||
* [[開発:セキュリティ]] | * [[開発:セキュリティ]] | ||
* [[開発:コーディング]] | * [[開発:コーディング]] | ||
{{ | {{Category開発者}} | ||
[[Category:セキュリティ]] | [[Category:セキュリティ]] | ||
[[en:Development:Security:SQL_injection]] | [[en:Development:Security:SQL_injection]] |
2010年2月6日 (土) 05:33時点における最新版
このページは、Moodleセキュリティガイドラインの一部です。
何が危険ですか?
.../course/view.php?id=123内にある、あなたのコードが、URIから渡される「$id = 123」を使って、次のようなSQL文を実行すると想定しましょう。
SELECT FROM mdl_course WHERE id = $id;
そして、あなたのコードが、わざわざパラメータを適切にクリーニングしないと想定しましょう。
邪悪なハッカーにより、URIが次のように編集されます:
- .../course/view.php?id=123;DELETE+FROM+mdl_user
なぜ、これが非常に、非常に悪いことなのか、私があなたにお答えします。
もちろん、データベースクエリに応じて、悪意のある入力を適切に構築する必要がありますが、これは邪悪なハッカーにとって、単なる試行錯誤の問題でしかありません。
どのようにして、Moodleはこの問題を回避するのですか?
もう一度、これは、Moodle外部からの入力が非常に疑わしいという例です。上記例では、PARAM_INTからrequired_paramに渡すことで、$idは明確にクリーニングされています。
以下、さら手の込んだクエリです:
UPDATE mdl_user SET lastname = '$lastname' WHERE id = $id;
$lastnameが「O'Brian」の場合、どうなるでしょう? そうです、あなたは次のように「'」をエスケープする必要があります: O\'Brian
Moodle 1.9では、required_paramまたはoptional_param経由であなたが取得する入力すべてには、自動的にaddslashesが適用されます。
Moodle 2.0では、私たちは、ストリングの連結により作成される、危険なSQL処理を完全に回避します。Moodle 2.0のSQLは、以下のようになります。
UPDATE mdl_user SET lastname = ? WHERE id = ?;
そして、私たちは、SQLと共に配列値 array($lastname, $id) をデータベースに渡します。
あなたのコードで、あなたがすべきこと
Moodle 2.0
- 可能な場合はいつでも、あなた自身がSQLを作成する必要性をなくすためにも、get_recordのような高いレベルのdmllibメソッドを使用してください。
- あなたがSQL文に値を入れる必要がある場合、安全に値を入れるためにプレースホルダを使用してください。
Moodle 1.9
- 可能な場合はいつでも、あなた自身がSQLを作成する必要性をなくすためにも、get_recordのような高いレベルのdmllibメソッドを使用してください。
- required_paramおよびoptional_paramDataからの値は、すでにaddslashesが適用されて、データベースクエリで使用できる準備ができています。しかし、値を一重引用符 (single quote) で囲っていることを確認してください。
- あなたがデータベースよりデータを読み込んで、再度インサートしたい場合、最初にaddslashesまたはaddslashes_objectを適用してください。
- sqlmapのようなツールを使用して、あなたのコードをテストするか、手動で < > & < > & ' \' 碁 \ \\ のようなトリッキーな値を入力してください。
管理者として、あなたが実践すべきこと
- 管理者として実践すべきことは、(あなたのMoodleを最新の状態にする以外) 特にありません。
関連情報
- http://sqlmap.sourceforge.net/ - SQLインジェクション脆弱性を自動的に探すツールです。
- 開発:セキュリティ
- 開発:コーディング