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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

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

Q&A

解決済

4回答

1014閲覧

SQLインジェクションについて

fire_Aji7

総合スコア11

SQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

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

0グッド

0クリップ

投稿2020/04/21 16:20

編集2020/04/21 19:42

最近、PHPとデータベースを勉強していた際に、SQLインジェクションという言葉を耳にしました。

自ら調べて分かったこと

セキュリティ対策の一つであること。
本番環境では必ず必要になるものであること。

問題・課題

具体的な対策方法や、コードの記述方法がわからず、どのサイトを参考にすれば良いのかわかりません。

どなたか教えていただけると幸いです。よろしくお願いします。

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

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

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

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

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

kai0310

2020/04/21 18:15 編集

解決した様ですが、以下を参考に具体的な解決手順を記載してください。 自己解決ではないですが、後者が見た際に参考になりますので https://teratail.com/help#resolve-myself 今回の質問ですと、「問題・課題が含まれていない質問」に該当する可能性が高いと思われます。 また、teratailでは以下の様な質問は推奨されていませんので再度ご確認ください。 https://teratail.com/help/avoid-asking
fire_Aji7

2020/04/21 19:56 編集

k011510さん、ありがとうございます。今後、気をつけるようにしていきたいと思います。
kai0310

2020/04/21 19:09 編集

今後気をつけるのではなく、今行なってください。 今後からと言う方はたくさんいる様ですが、次の時では忘れてしまう人ばかりです。 また、この質問を見た後者はどうなるのですか?
kyoya0819

2020/04/21 19:43 編集

無意味な編集のため、低評価継続
fire_Aji7

2020/04/21 19:47 編集

今回は申し訳ありません。 質問の書き方を気を付けていきます。
kai0310

2020/04/21 19:45

えっと、修正された様ですけど解決済みになっているのでは?
fire_Aji7

2020/04/21 20:16

解決済み後に編集してしまい、申し訳ありませんでした。 teratailの使い方を確認します。
guest

回答4

0

具体的な対策方法という括りが少し抽象的なので、今回はいくつかしぼってご紹介していきます。

##敵を知れ
まず、対策をする前に相手がどんな人なのか分からずして対策はできませんよね。また対策してあったものが使えなかったりと。。そこでまず、SQLインジェクションとは何かを調べましょう。
SQLインジェクションとはざっくり言うとDBに対する命令文の改ざんを行い意図しないいわゆる不正な操作を行うことです。(だいぶ抽象的に説明しているので詳細は調べてください。)

このSQLインジェクションにより、DBが操作されてしまうわけですから、データを盗まれてしまったり、保存していたファイルも操作・盗用され、最悪ログイン機能に不正なログインができてもしまいます。

##具体的な対策

以下のことをまず対策してみてください。

  • 型の指定
  • 静的placeholderの利用
  • エラーメッセージの非表示(細かいものまで)
  • 文字エンコーディングの利用

また、権限などに関しても念入りにチェックする必要もあります。

コードの提示がないので、これと言って対策を指示することはできませんが、上記は行なってください。

投稿2020/04/21 21:25

編集2020/04/21 21:39
kai0310

総合スコア2070

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

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

fire_Aji7

2020/04/21 21:31

k011510さんも、回答ありがとうございます。 初心者の私からすると、簡単な言葉を用いてくださる「k011510さん」の回答は非常にわかりやすいです。 「具体的な対策」をまずは試してみようと思います。
kai0310

2020/04/21 21:36

完璧な対策は不可能です。 初学者ということもあり、まずは初歩的なミスがまずないかを確認してみてください。また、対策方法は検索するといくつかヒットしますので、そちらも参考にしてみてください。
fire_Aji7

2020/04/21 21:39

わかりました。ありがとうございます。 自分のコードを見返し、ミスを確認してみます。 また、「敵を知れ」という考え方も頭に入れておきたいと思います。
guest

0

ベストアンサー

具体的な対策方法が分かりません

学習するなら、まず公式のドキュメントを見ましょう。
見ていないのは、論外です。お話にならないです。

php.net


本番環境

本番環境、開発環境云々以前に、そのような脆弱性を作らないように、プログラミングしなければいけません。
なので、本番環境のみ気をつければ良いのではなく、開発環境・打っている時よりそのようなものを作らないように意識と、確認と診断をしていかなければいけません。

投稿2020/04/21 16:26

編集2020/04/21 18:17
kyoya0819

総合スコア10429

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

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

fire_Aji7

2020/04/21 18:07

ご紹介いただいたサイトを参考にさせていただきます。ありがとうございました。
kyoya0819

2020/04/21 18:10 編集

こういうことを回答すると、愚痴る人や不満に思う人多いですが、できていないと後々不利益を被るのはご自身ですので悪しからず。 学習頑張ってください。
fire_Aji7

2020/04/21 19:06 編集

asuchi0819さん、ありがとうございます。そのようなお言葉がすごく支えになります。これから頑張っていきます。
退会済みユーザー

退会済みユーザー

2020/04/21 21:01

久しぶりに「LITTLE BOBBY TABLES」見たw
kyoya0819

2020/04/21 21:34

まぁ、一番いいのはSQLインジェクションの脆弱性があるシステムをローカルで作って自分でそれに攻撃することだと思います。
kyoya0819

2020/04/21 21:39

私の中学時代の恩師の言葉「『how to』じゃなくて『why』を大事にしろ。」。 数学の問題によく出てきます。非常に難しい図形計算で、「手法」を覚えるでしょうか?覚えないはずです。なぜ、そのような解法が導き出せるかの根幹を知るはずです。 プログラミングもそうです。「こういうことをするならこうすればいい。」と覚えるのではなく、「こういう風になってるから、こうすれば解決する。」と、いう風に学習をしていけば必ず力は伸びていきます。 How toではなく、Whyを大切にして今後の学習頑張って下さい。
fire_Aji7

2020/04/21 21:49

asuchi0819さん、そのお言葉、非常にわかりやすく、心に響きました。 How toではなく、Whyを大切にするんですね。すごく共感できます。 また、ローカルで作って自分で攻撃してみるという方法は初めて知りました。 確かに、自分で攻撃してみれば、どこに脆弱性があるのかわかりますもんね。 非常に参考になります。 これから、プログラミングを学習していく上で、「How toではなくWhy」というのを大事にしていきます。 私みたいな初心者に、色々なことを教えていただき、本当にありがとうございます。自信がつきました。
guest

0

「安全な Web サイトを作りたい」人の学習の入り口として
安全なウェブサイトの作り方
がよく紹介されます。

このページの下の方に、別冊:「安全なSQLの呼び出し方」があり、古い資料ですが、SQL 部分に特化した読み物になっています。
質問の回答にちょうどよいかと。

また、php に限った話題であれば、以下も参考にしてください。
PDO::ATTR_EMULATE_PREPARES => falseは必要か?

投稿2020/04/21 21:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kai0310

2020/04/21 21:14

そういえば、プリペアドステートメントを行うためにDBに接続する必要がないため、エミュレーションを行ったほうがパフォーマンスは向上するという話を耳にしたことがあります。
fire_Aji7

2020/04/21 21:23

te2jiさん、ありがとうございます。 サイトと資料の方、参考にさせていただきたいと思います。 解決済みだったにもかかわらず回答していただき、とても嬉しいです。 『PDO::ATTR_EMULATE_PREPARES => falseは必要か?』の記事も拝見させていただきます。
guest

0

解決方法

ベストアンサー
asuchi0819さんにご紹介いただいた2つのサイトと、asuchi0819さんの「How toではなくWhy」
php.net
https://www.w3schools.com/sql/sql_injection.asp

その他役立った情報
k011510さんの「敵を知れ」、「具体的な対策」

te2jiさんのPDO::ATTR_EMULATE_PREPARES => falseは必要か?

以上の内容を参考にし、解決しました。

投稿2020/04/21 20:27

編集2020/04/21 22:21
fire_Aji7

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問