「開発:セキュリティ:SQLインジェクション」の版間の差分

提供:MoodleDocs
移動先:案内検索
(Done.)
 
(同じ利用者による、間の7版が非表示)
1行目: 1行目:
作成中です - [[利用者:Mitsuhiro Yoshida|Mitsuhiro Yoshida]] 2010年1月25日 (月) 16:11 (UTC)
このページは、[[開発:セキュリティ|Moodleセキュリティガイドライン]]の一部です。
このページは、[[開発:セキュリティ|Moodleセキュリティガイドライン]]の一部です。


==何が危険ですか?==
==何が危険ですか?==


.../course/view.php?id=123 内にある、あなたのコードがURIから渡される「$id = 123」を使って、次のようなSQL文を実行すると想定しましょう。
.../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;
11行目: 9行目:
そして、あなたのコードが、わざわざパラメータを適切にクリーニングしないと想定しましょう。
そして、あなたのコードが、わざわざパラメータを適切にクリーニングしないと想定しましょう。


邪悪なハッカーいより、URLが次のように編集されます:
邪悪なハッカーにより、URIが次のように編集されます:
: .../course/view.php?id=123;DELETE+FROM+mdl_user
: .../course/view.php?id=123;DELETE+FROM+mdl_user
なぜ、これが非常に、非常に悪いことなのか、私があなたにお答えします。
なぜ、これが非常に、非常に悪いことなのか、私があなたにお答えします。


もちろん、データベースクエリに応じて、悪意のある入力を適切に構築する必要がありますが、邪悪なハッカーにとって、単なる試行錯誤の問題でしかありません。
もちろん、データベースクエリに応じて、悪意のある入力を適切に構築する必要がありますが、これは邪悪なハッカーにとって、単なる試行錯誤の問題でしかありません。


==どのようにして、Moodleはこの問題を回避するのですか?==
==どのようにして、Moodleはこの問題を回避するのですか?==


もう一度、これは、Moodle外部からの入力が非常に疑わしいという例です。上記例では、PARAM_INT から required_param に渡すことで、$idは明確にクリーニングされています。
もう一度、これは、Moodle外部からの入力が非常に疑わしいという例です。上記例では、PARAM_INTからrequired_paramに渡すことで、$idは明確にクリーニングされています。


以下、さらn手の込んだクエリーです:
以下、さら手の込んだクエリです:
<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
$lastnameが「O'Brian」の場合、どうなるでしょう? そうです、あなたは次のように「'」をエスケープする必要があります: O\'Brian


Moodle 1.9では、required_param または optional_param 経由であなたが取得する入力すべてには、自動的に addslashes が適用されます。
Moodle 1.9では、required_paramまたはoptional_param経由であなたが取得する入力すべてには、自動的にaddslashesが適用されます。


Moodle 2.0では、私たちは、ストリングの連結により作成される、危険SQL処理を完全に回避します。Moodle 2.0のSQLは、以下のようになります。
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 = ?;
38行目: 36行目:


Moodle 2.0
Moodle 2.0
* 可能な場合はいつでも、あなた自身ががSQLを作成する必要性をなくすためにも、get_recordのような高いレベルのdmllibメソッドを使用してください。
* 可能な場合はいつでも、あなた自身がSQLを作成する必要性をなくすためにも、get_recordのような高いレベルのdmllibメソッドを使用してください。
* あなたがSQL文に値を入れる必要がある場合、安全に値を入れるためにプレースホルダを使用してください。
* あなたがSQL文に値を入れる必要がある場合、安全に値を入れるためにプレースホルダを使用してください。


Moodle 1.9
Moodle 1.9
* 可能な場合はいつでも、あなた自身ががSQLを作成する必要性をなくすためにも、get_recordのような高いレベルのdmllibメソッドを使用してください。
* 可能な場合はいつでも、あなた自身がSQLを作成する必要性をなくすためにも、get_recordのような高いレベルのdmllibメソッドを使用してください。
* required_paramおよびoptional_paramDataからの値は、すでにaddslashesが適用されて、データベースクエリで使用できる準備ができています。しかし、値を一重引用符 (single quote) で囲っていることを確認してください。
* required_paramおよびoptional_paramDataからの値は、すでにaddslashesが適用されて、データベースクエリで使用できる準備ができています。しかし、値を一重引用符 (single quote) で囲っていることを確認してください。
* あなたがデータベースよりデータを読み込んで、再度インサートしたい場合、最初にaddslashesまたはaddslashes_objectを適用してください。
* あなたがデータベースよりデータを読み込んで、再度インサートしたい場合、最初にaddslashesまたはaddslashes_objectを適用してください。


* Test your code by using a tool like [http://sqlmap.sourceforge.net/ sqlmap]のようなツールを使用して、あなたのコードをテストするか、手動で <nowiki>< > & &amp;lt; &amp;gt; &amp;amp; ' \' 碁 \ \\</nowiki> のようなトリッキーな値を入力してください。
* [http://sqlmap.sourceforge.net/ sqlmap]のようなツールを使用して、あなたのコードをテストするか、手動で <nowiki>< > & &amp;lt; &amp;gt; &amp;amp; ' \' 碁 \ \\</nowiki> のようなトリッキーな値を入力してください。
 
==What you need to do as an administrator==


* This is not something that administrators can do anything about (other than keeping your Moodle up-to-date).
==管理者として、あなたが実践すべきこと==


* 管理者として実践すべきことは、(あなたのMoodleを最新の状態にする以外) 特にありません。


==関連情報==
==関連情報==


* http://sqlmap.sourceforge.net/ - a tool for automatically finding SQL injection vulnerabilities.
* http://sqlmap.sourceforge.net/ - SQLインジェクション脆弱性を自動的に探すツールです。
* [[開発:セキュリティ]]
* [[開発:セキュリティ]]
* [[開発:コーディング]]
* [[開発:コーディング]]


{{CategoryDeveloper}}
{{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のようなツールを使用して、あなたのコードをテストするか、手動で < > & &lt; &gt; &amp; ' \' 碁 \ \\ のようなトリッキーな値を入力してください。

管理者として、あなたが実践すべきこと

  • 管理者として実践すべきことは、(あなたのMoodleを最新の状態にする以外) 特にありません。

関連情報