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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

Q&A

解決済

2回答

2021閲覧

即答希望:sqlのidとパスワードを一致したときのみtrueにしたい。

garchomp

総合スコア128

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

0グッド

1クリップ

投稿2017/07/12 12:33

編集2017/07/12 13:14

イメージ説明

mysqlでこれがあったとしましょう。

garchomp=matutani9613 true

garchomp=sayanons false

sayanon matutani9613 false

sayanon sayanons true

とするにはwhere文をどう書いたらいいでしょうか?

調べてもなかなか出てこなかったので即答でお願いします<m(__)m>

追記:修正依頼がありましたので、自分が試した方法を記載します。

思いついた限りは…

select * from users where name=pass;

もちろんダメでした。

select * from users where name in pass;

これもダメでした、

select * from users where id=1 in name and id=1 in pass;

なんて書いたらいいのかわかりません…

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

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

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

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

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

iwamoto_takaaki

2017/07/12 13:07

書いてみたSQLとその時の結果を張り付けて、何が足りなそうか考察をつけるとヒントがもらえます。
guest

回答2

0

ベストアンサー

ここで回答を貰うより SQL の書き方を学んだ方が良い気がします。

select * from users where name=pass;

これが意味するのは、users テーブルの中から、name に入っている値と pass に入っている値が同じ行を検索するという意味です。

select * from users where name in pass;

これが意味するのは、users テーブルの中から、リスト pass の中に name が含まれる行を検索するという意味です。pass はリストでないので期待通りには動かないでしょう。

select * from users where id=1 in name and id=1 in pass;

これは正直何が書きたいのか分かりません。

ヒントですが、おそらくやられたいのは

画面等から入力されたユーザ名(name)とパスワード(pass)の対が正しいかどうかを判定する SQL を書きたいのだと思います。(こういう「何がしたいか」の質問でないと回答者には伝わりません)

だとすると、name と pass の値は分かっているのですから、SQL に組み込むだけです。

今から悪い例を書きます。

プログラムでユーザ名の入った変数名 aname とパスワードの入った変数名 apass を使って以下の様に SQL を組み立てました。

sql = "SELECT * from USERS WHERE NAME = '" + aname + "' AND PASS = '" + aname + "'"

こうすると、例えば aname が garchomp で apass が matutani9613 の時に SQL が

sql

1SELECT * from USERS WHERE NAME = 'garchomp' AND PASS = 'matutani9613'

この様になり、結果 ID が 1 のレコードが返ってくる訳です。ユーザとパスワードの対が正しいかを判定するにはこの SQL が1行返ってくるか、それもと返ってこなかったかを調べれば良いのです。

で、ここまで書いてなぜ「悪い例」と書いたのかを説明すると、悪意のある人が画面でパスワードに ' OR '' = ' を入力してしまうと出来上がる SQL が

sql

1SELECT * from USERS WHERE NAME = 'garchomp' AND PASS = '' OR '' = ''

になってしまい、だれでもログイン出来てしまう様になってしまうからです。これは「プリペアドステートメント」や「プレースホルダ」といったキーワードで検索して勉強して下さい。

投稿2017/07/12 16:10

編集2017/07/12 16:13
mattn

総合スコア5030

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

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

garchomp

2017/07/13 02:12 編集

丁寧な回答ありがとうございます<m(__)m> 恐ろしい書き方もあるんですね…調べてみます。 変な質問になってしまい申し訳ございませんでした。
garchomp

2017/07/13 02:40 編集

もしかしたら、今回の場合は、andよりorのほうが優先順位高くなっていたため、and以外の部分をかっこでくくり、 SELECT * from profiles WHERE( name = 'garchomp') AND (age = '' OR '' = ''); という風にしたらよろしいでしょうか? (自分で試した限りでは大丈夫でした。 もしこれをprepareに組み込む場合は SELECT * from profiles WHERE( name = '?') AND (age = '?'); として、executeで渡していく形で不正アクセスは防げそうですか?
mattn

2017/07/13 02:39 編集

prepare を使うのであればカッコは必要ないです。またセキュリティを考慮するのであれば prepare を使わないという選択肢はないです。
garchomp

2017/07/13 02:41

prepare使っても結果としては渡されるはずだと思ったのですが…もしかして(文字列として認識させることができるため、orは反応しない)という認識でよろしいでしょうか?
mattn

2017/07/13 16:44

はい。prepared を使うと SQL が壊される事はないです。
guest

0

name = garchomp AND pass = matutani9613
ってことかな?

投稿2017/07/12 13:25

Z-TALBO

総合スコア525

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

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

garchomp

2017/07/12 13:40

そうですね。 ログインフォームを作りたいので…この場合 name=#{@name} and pass=#{@pass} でも実現できるでしょうか?(上記コードはruby入ってます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問