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

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

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

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

SQL

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

データベース

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

Q&A

解決済

2回答

963閲覧

SQLiteにてWhere条件にA=B!=Cと書いた場合

hamayanhamayan

総合スコア8

SQLite

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

SQL

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

データベース

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

0グッド

0クリップ

投稿2020/02/08 10:07

SQL Injectionの勉強をしていて、以下の様なSQL文が動作しているのを見つけました。
これがうまく動くのが理解できなかったのですが、どのような解釈がされて、Where部分が恒真となっているのでしょうか。

以下のようにテーブル作成。

sql

1CREATE TABLE User ( 2 id nchar(10), 3 pass nchar(10) 4); 5 6INSERT INTO User VALUES('admin', 'adminpass');

このテーブルに対して以下のクエリを実行すると、adminのレコードが取得できました。

sql

1SELECT * FROM User where pass = '' != '' --'

このサイトにて現象確認しています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

SELECT文がhamayanhamayanさんが書いた通りですと、"--"が1行コメントの記号として扱われているからですね。

個人的にはA!=B=Cなど、解釈に誤解を招く条件文はできるだけ使わないほうがいいのではないかと思います。

SQL

1SELECT * FROM User where pass = '' != '' --' 2 ↑以降コメント 3 4SELECT * FROM User where pass = '' != '' ='--' 5 ↑これだと0件になる 6 [| TRUE | != '']TRUE、これに対し='--'なのでFALSEになる 7 8SELECT * FROM User where pass = '' != '' 9 | TRUE | != '' ← なのでデータが表示される 10 11SELECT * FROM User where pass = 'adminpass' != TRUE 12 | TRUE | != TRUE ← なのでデータが表示されない 13 14SELECT * FROM User where pass = 'adm' != TRUE 15 | FALSE | != TRUE ← なのでデータが表示される

投稿2020/02/08 11:41

crowmt

総合スコア402

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

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

hamayanhamayan

2020/02/09 05:37

なるほど、bool!=文字列はそういう比較になるんですね。 勉強になりました!
sazi

2020/02/09 06:26

いやいや、そういう比較は普通エラーで、やることではないですから。
crowmt

2020/02/09 06:28

無事に解決できて何よりです。 私もテストサイトの情報いただきました。 ありがとうございます。
crowmt

2020/02/09 07:01

コメントをよく見てませんでした… saziさんも書かれていますが、本来bool!=文字列という比較は行わないようにすべきです。 A!=B=Cという書き方が、本来行うべきではない動作をしている、と解釈してほしいです。 A!=B AND A=C(解釈次第ではB=C)という感じの明確な条件文を書くことをおすすめします。
hamayanhamayan

2020/02/11 00:29

質問文中にもありますが、SQL Injectionの勉強の一環ですので、仕様の穴(実装の穴?)となる部分について確認したかったという感じです。
crowmt

2020/02/11 00:57

承知しました。 教えた側としましては、間違った実装をするのではないかと心配しますので… 言語によっては穴があったりしますが、それを(知らずに)使用してシステム構築すると、将来的に修正された時(言語のバージョンやOSのアップなど)にシステムが止まるということも起きたりします。 全ての穴を把握するのは無理ですが、知っていて損でもないと思います。 ちなみに私は今回質問に貼られたサイトでパターンを予測して、いろいろSQLを組んで実行し、ググったりして結論を出しました。 動かせる環境がある場合は、自分でいろいろと考えて実行すると、いい勉強になると思います。 好奇心旺盛に楽しんでいただければ幸いです。
guest

0

()が省略されているだけでしょう。

(pass = '') != ''

なら結果は変わりませんが

pass = ('' != '')

だと結果が変わります。

投稿2020/02/08 11:44

sazi

総合スコア25195

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

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

sazi

2020/02/08 11:46

そもそも、文字列と真偽を比較しているので、他のDBMSならエラーになるかと思います。
hamayanhamayan

2020/02/09 05:39

確かにMySQL5.6だと挙動が変わりました。 ふしぎ…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問