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

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

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

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

2回答

207閲覧

migrate sqlインジェクション対策ができない。

trymobuo

総合スコア38

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2018/11/10 05:20

前提・実現したいこと

laravelでmigarateを実行させてデータをimportをするための実装をしています。
しかし素のmysqlで打ち込めばデータは取得できるのですがsqlインジェクション対策のためにデータを可変にして取得しようとするとエラーが起きてしまうためなぜできないのかわかりません。初心者のためいろいろ説明不足の質問になってしまい申し訳ございませんが、よろしくお願いいたします。

発生している問題・エラーメッセージ

Undefined offset: 0

エラーメッセージ Undefined offset: 0

該当のソースコード

php

1 2$list = DB::connection('r1')->select('select * from test_db'); 3 4foreach($list as $old) 5{ 6 $comment = DB::connection('hogedb')->select( 7 'select * from pp_table where pp_id IN (select ".$hoge->hoge_id." from test_db)' 8); 9 10 $p->pp_id = $comment[0]->p_comment_id; 11} 12 13

試したこと

mysqlで上記のsqlインジェクションをしていないままのmysqlを打ち込んだ時はデータが取れました
select + from pp_table where pp_id IN (select hoge_id from test_id);

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Laravelは標準でPDOを使ってSQLを発行しているので、一応SQLインジェクション対策は出来ていると考えて良いかと思います。また、ユーザーからの入力値をバリデートする機能もLaravelの作法に従って書くことで、安全な値のみをDBにアクセスさせることができるようです。
https://readouble.com/laravel/5.7/ja/queries.html

投稿2018/11/17 19:33

編集2018/11/17 19:40
sakamata

総合スコア203

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

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

trymobuo

2018/11/18 14:40

select * from pp_table where pp_id = ?', ["$old->test_db"]で値をとるようにすればsqlインジェクションとしてとれるよと伝えられたんですけどsqlインジェクションではなく普通にとれてないってことですか?
sakamata

2018/11/18 17:41

返答頂いた >sqlインジェクションとしてとれるよ は、おそらく逆の意味で、このように書けばSQLインジェクションを防げるという意味ですね。 ちょうど以下のページでも説明されているようですね。 『SQLクエリの実行』部分です https://readouble.com/laravel/5.4/ja/database.html また、私の説明が誤っていたので修正します。 DB::select( ) や select() メソッドを直接使っているのであれば、その中にSQL文をそのまま書けてしまうので、きちんとPDOを使ったSQLインジェクション対策が必要です。 そこで、コメントしてくださった様な書き方をして、ユーザーからの入力値を第二引数に入れて実行するという方法がSQLインジェクションを防ぐ正しい書き方、という事になります。 `select * from pp_table where pp_id = ?', ["$old->test_db"]` リンク先の例も同じです(ユーザーが入れた値を1と仮定) ` $users = DB::select('select * from users where active = ?', [1]);` ただ、そもそも論なのですが、SQLインジェクションというのはユーザーform等で入力した値に悪意のあるコードがある場合、うっかりDBを操作をされてしまうという事柄と理解していますが、やろうとなさっている事は >migarateを実行させてデータをimportをする とあってよく意味がわかりませんでしたが、そもそもユーザーの悪意のあるデータが入っている可能性が無い様なデータを取り扱う様に思えます。もしそのような場合にはSQLインジェクションに対してあまり気を使わなくても良い気がします。
guest

0

そもそも、「SQLインジェクション」=「外部からSQL文を流し込むこと」です。

マイグレーションは第三者が実行できるものではありませんし、「SQL文を投入する」のが正当な操作であれば、「SQLインジェクション」と同じ形で書くよりほかに選択肢はありません。

投稿2018/11/10 06:44

maisumakun

総合スコア145183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問