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

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

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

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

PHP

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

Q&A

解決済

2回答

2096閲覧

ユーザーからの入力値をSQL文の変数に利用について

sanpei

総合スコア15

SQL

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

PHP

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

0グッド

0クリップ

投稿2017/03/28 10:26

現在、PHPにてDBの情報をブラウザで閲覧するプログラムを作成しています。
SQLインジェクション対策を勉強中ですが、下記の疑問に関しご教授いただければ幸いです

ユーザー入力値をSQL文に使用しない下記の例の場合、
識別子に変数を利用することで、インジェクション攻撃の危険性はあるのでしょうか。


例)SQLに使用するDBが複数あります。

DataBase_A
DataBase_B
DataBase_C
DataBase_D

ユーザーによって使用するDBが異なるため(DataBase部分が異なりA~Bは同じ)、
INIファイルにDataBase部分を定義し、SQLを下記のように記述

;iniファイル DataBaseName = DataBase

PHP

1 2$dataBaseName = $ini['DataBaseName'] 3 4$sql = <<<SQL 5SELECT A.COL,B.COL 6FROM {$dataBaseName}_A AS A JOIN {$dataBaseName}_B AS B ON A.COL = B.COL 7SQL;

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

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

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

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

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

guest

回答2

0

ベストアンサー

$dataBaseNameとありますがテーブル名ですよね?

ほぼほぼ問題なさそうにも見えますが、変数でわたさなくても
分岐で処理すればよいような気もします。
とくに変数で渡したDBなりテーブルが必ず存在するかどうかの
チェックも必要かと思います

投稿2017/03/28 13:06

yambejp

総合スコア114843

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

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

sanpei

2017/03/29 00:57 編集

ご回答ありがとうございます。 すいませんPHPソースの記載間違いで、実際は FROM [DataBase_A].[dbo].TabA AS A JOIN [DataBase_B].[dbo].TabA というかんじででDB名を指定していました。 そこで「DataBase」の部分だけが異なる別のDBに接続するのに INIファイルの記載を変更することで、 PHPに記載されているSQL文のFROM句を一括変更できればと考えました。 FROM [(変数)_A].[dbo].TabA AS A JOIN [(変数)_B].[dbo].TabA 勉強不足すぎて恐縮ですが、 「変数で渡さずに分岐で処理する」とはどういう意味でしょうか。 概要だけでもご教授いただけないでしょうか。
yambejp

2017/03/29 02:40 編集

DB名やテーブル名は変数から生成するのではなく、 スタティックに指定するということです。 一番単純な分岐はifですね if($user=="Aさん"){ $sql="SELECT * FROM `DB_X`"; }elseif($user=="Bさん"){ $sql="SELECT * FROM `DB_Y`"; } リストをつかって $user="Aさん"; $list=["Aさん"=>"DB_X","Bさん"=>"DB_Y"]; if(array_key_exists($user,$list)){ $sql="SELECT * FROM `{$list[$user]}`"; } のような書き方もできると思います。 想定外のデータがくれば$sqlは空なので判断できます
sanpei

2017/03/29 07:17

事前にユーザー毎にDBを割り当てて、条件によってSQLを組み立てるのですね。 値の存在チェック、配列を利用する方法など勉強になります。 基本的なことなのにご丁寧に回答いただきありがとうございました!
guest

0

特定のPHPバージョン、および設定のいかんによっては起こりえます。

http://php.net/manual/ja/security.globals.php

投稿2017/03/28 10:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sanpei

2017/03/29 00:56

ご回答ありがとうございます。 いただいたリンク先を拝見しました。 当方のPHPバージョンは7.1なので該当しないようです。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問