質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3127閲覧

SQLインジェクションに関するこの漫画の解説をしていただきたいです

Moririn_1881

総合スコア18

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/07/31 16:49

編集2019/07/31 17:02

https://docs.python.org/ja/2.7/library/sqlite3.html
の中に、

「たいてい、SQL 操作では Python 変数の値を使う必要があります。この時、クエリーを Python の文字列操作を使って構築することは安全とは言えないので、すべきではありません。そのようなことをするとプログラムが SQL インジェクション攻撃に対し脆弱になります (https://xkcd.com/327/ ではどうなってしまうかをユーモラスに描いています)。」

と説明がありますが、この漫画のユーモアはおろか、意味もよく分からず困っております。
どなたか教えていただけると助かります。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2019/07/31 17:09

ユーモアが理解できるかどうかは感性によるんで、他人が説明してどうなるもんでもない気がしますが、SQLインジェクションとは何か、と、義務教育レベルの英語が読めれば書いてあることはわかりますよね。 どの部分の意味がわからなかったんでしょうか?
Moririn_1881

2019/07/31 18:21

ご回答ありがとうございます。 意味を取れなかったのが、3.4コマ目になります。 下の方のお陰で大枠は理解できました。
guest

回答3

0

ベストアンサー

訳したらこんな感じですよね。

1コマ目
電話「こちらはあなたの息子さんの学校です。ちょっとコンピュータのトラブルがありまして」
2コマ目
人物「あらら、彼がなにかを壊したんでしょうか?」
電話「まぁある意味で」
3コマ目
電話「あなたは本当に息子に『Robert'); DROP TABLE Students;』と名付けたんですか?」
人物「はいそうです。私らは『リトルボビーテーブルズ』と呼んでますが」(BobbyはRobertの愛称)
4コマ目
電話「そうですか。私たちは今年度の学生のレコード(行)を失いました。あなたの幸せを祈ってます」
人物「私はあなた方がデータベースへの入力のサニタイズ(無害化)を学べたことを願ってます」

3コマ目で「SQLインジェクションを起こす名前」が付けられている事が判明したあたりがユーモアなんでしょう。

投稿2019/07/31 17:24

gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Moririn_1881

2019/07/31 18:24

ご回答ありがとうございます。 全訳も丁寧につけていただき、より理解がしやすくなりました。
guest

0

ユーモアはちょっと置いといて、SQL インジェクション防止のための本質的なところに目を向けてはいかがですか? それは、

ユーザー入力と文字列連結してクエリを組み立てると SQL インジェクションの問題があるので、クエリは必ずパラメータ化すべき。

・・・ということです。

漫画は、ユーザー入力を文字列連結するようなコーディングだったので、ユーザーに drop... という文字列を入力され、結果、テーブルがまるごとドロップされてしまったということです。

【追記】

下の 2019/08/01 10:10 の私のコメントで「長くなりますので回答欄に追記します」と書きましたが、それを以下に書きます。

漫画にこだわらないで、ドキュメントの本質を見ようよ。ってことですね。

質問者さんの本来の疑問は漫画の意味ではなくて、https://docs.python.org/ja/2.7/library/sqlite3.html に書いてあった「SQL インジェクション攻撃に対し脆弱」になるのは何故かで、対策として以下のようにクエリをパラメータ化するということが書いてあったが理解できない。

# Never do this -- insecure! symbol = 'RHAT' c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) # Do this instead t = ('RHAT',) c.execute('SELECT * FROM stocks WHERE symbol=?', t)

漫画を読めば理解できると思ったがやっぱり理解できない・・・ということで今回の質問に至ったと勝手に理解してます。

違いますか?>質問者さん

「パラメータ化」って言葉を選んだのにもなんか理由があったりしますか? 「プリペアドステートメントを使用する」って表現が一般的な気がしますが、使い分けの理由があれば知りたいです。

自分的には「SQL インジェクション防止」⇒「クエリのパラメータ化」という言葉が出てくるということです。質問者さんが参考にされている記事にも "パラメータ割り当てを使います" とありましたし。

パラメータ化のもう一つのメリットにパフォーマンスの向上がありますが、そちらに目が行くと「プリペアドステートメント」という言葉も出てくるかもしれませんが。

#SQL Server の場合の自分的な理解ですが、クエリをパラメータ化するというのはリテラルの部分をプレースホルダを使って記述すること。パラメータの入力はリテラルとして扱われるから SQL インジェクション攻撃を防ぐことができる・・・ということで、「SQL インジェクション」と言われると「パラメータ化」という言葉しか出てきません。

パラメータ化クエリ
http://surferonwww.info/BlogEngine/post/2012/02/02/Parameterized-query.aspx

#これは質問者さんにとってはどうでもいい話かもしれませんが、もう一つ副次的な効用があって、SQL Server + SqlClient でパラメータ化クエリを使用すると、照合順序の違いによる文字化けに悩むことがなくなるというメリットもあります。

パラメータ化の副次的な効用
http://surferonwww.info/BlogEngine/post/2016/06/04/use-parameterized-query-to-avoid-unexpected-character-corruption.aspx

投稿2019/07/31 22:28

編集2019/08/01 01:26
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/31 22:35

この漫画だと、 > ユーザー入力と文字列連結してクエリを組み立てると SQL インジェクションの問題があるので、クエリは必ずパラメータ化すべき。 とは言ってないんですよねぇ。
退会済みユーザー

退会済みユーザー

2019/07/31 22:39

見るべきところは漫画ではありません。質問の一行目の記事です。
退会済みユーザー

退会済みユーザー

2019/08/01 00:42

漫画にこだわらないで、ドキュメントの本質を見ようよ。ってことですね。 理解しました。 余談ですが、「パラメータ化」って言葉を選んだのにもなんか理由があったりしますか?「プリペアドステートメントを使用する」って表現が一般的な気がしますが、使い分けの理由があれば知りたいです。
退会済みユーザー

退会済みユーザー

2019/08/01 01:10

上のコメントに対するレスは、長くなりますので回答欄に追記します。
退会済みユーザー

退会済みユーザー

2019/08/01 01:44

横からのコメントに、回答の追記、ありがとうございます。 > パラメータ化のもう一つのメリットにパフォーマンスの向上がありますが、そちらに目が行くと「プリペアドステートメント」という言葉も出てくるかもしれませんが。 そうなんですよねぇ。「プリペアドステートメント」の本来の目的はパフォーマンスなんですよね。「パラメータ化」って表現はバインド機構の方を推したってことですね。理解できました。 SQL Server 余談も面白かったです。
Moririn_1881

2019/08/02 05:22

漫画を読めば理解できると思ったがやっぱり理解できない・・・ということで今回の質問に至ったと勝手に理解してます。 違いますか?>質問者さん はい、そうです。 お二人の談義がわかるようになるまで勉強させていただきます( ..)φ ご回答ありがとうございました。
guest

0

この漫画、理解度で笑うポイントが変わってきます。

第1段階「うわ。SQL インジェクションwww DROP かよ。エグいwww」
第2段階「複文かよ(苦笑)」
第3段階「文字連結放置かよ(冷笑)」
第4段階「(広い心で)うわ。SQL インジェクションwww DROP かよ。エグいwww」

第1段階で笑うことを想定した漫画ですが、第4段階で笑えるようになりましょう!

投稿2019/07/31 22:35

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/01 12:36

おー結構マイナスくらったなぁw 追記しときますね。 2.5 登録フォーム考えたら DB でエラー出るだろ(微笑)
Moririn_1881

2019/08/02 05:18

ご回答ありがとうございます。 そこまで深く理解できるように勉強いたします。
退会済みユーザー

退会済みユーザー

2019/08/02 09:17

そうですね。回答の意味がわかるようになれば、そこそこセキュアなコードが書けるようになると思います。 ちなみに、gentaro さんの翻訳、SQL インジェクションのキモ部分(後続をコメント化する箇所)がなぜか削除されているのですが、結構高評価がついています。 多分みんな第一段階で評価しちゃってますw ちゃんと理解した上で笑えるようになりましょう。 以下、理解した上で広い心で笑った人のコメントです。 https://qiita.com/jnchito/items/4317c08b0348bd1f8c36 この辺が広い心w > そこを突っ込むなよというのは、私も思います…
bochan2

2019/08/02 16:27

te2jiさんの回答は的を得ていて素晴らしいのに低評価する人が居て残念です
退会済みユーザー

退会済みユーザー

2019/08/02 22:29 編集

私個人の感想としては、(現時点で)本件の最も適切な回答は SurferOnWww さんなんですけどね^^; SQL インジェクションに関して理解を深めたいのであれば、漫画は無視して本来の対処方法をドキュメントから学び取るのが適切です。 私の回答は、、、「ゆでたまご理論」はちゃんとした理論を知らないで感心しちゃうとアブないよっていう余談回答ですw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問