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

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

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

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

MySQL

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

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

Q&A

解決済

3回答

2998閲覧

Slickで、Plain SQLのWEHRE句を動的に変更する場合のSQL Injection対策について

satokenzo0722

総合スコア7

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

MySQL

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

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

0グッド

0クリップ

投稿2016/10/06 03:53

###前提・実現したいこと
Play 2.4(Scala) + Slick 3.0(MySQL 5.5) を利用しています。

表題通りの質問ですが、SlickのPlain SQLを利用して、WEHRE句を動的に変更した場合の
SQL Injection対策についてスマートな記法がないか悩んでおります。

下記の場合、nameに「2%' or 1=1-- 」といった文字列が来た場合などに、
SQL Injectionされてしまいます。

###該当のソースコード

scala

1// 外部入力されるnameであいまい検索をしたい 2val whereState = "and name like '%$name%'" 3 4sql"select * from a_table where age = 20 #$whereState"

SQL Injection攻撃されないスマートな記述方法がわかるかた、ご教授いただけないでしょうか。

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

文字列の最後の or 0 = 0 などと書いてあるとテーブルの全件が対象になって、ごそっとデータが盗まれます。
初歩的なチェック方法としては name に英字、マルチバイト(漢字、ひらがな、かたかな)以外をエラーとする、とか。

投稿2016/10/06 04:03

Orlofsky

総合スコア16415

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

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

satokenzo0722

2016/10/06 05:20

ご回答ありがとうございます。 そうですね、チェックしてエラーにするのも手だと思っています。 個人的に、Slickで動的にPrepared Statementをlikeに使う方法があれば一番良いと考えているのですが、どうも書き方がわからず困っている状態です。
Orlofsky

2016/10/06 06:00

通常登録時にふりがなも入れさせるサイトが多いですが、name で名前を検索する時ふりがなや外国の人はアルファベットだけに限定してSQLインジェクションができないよう検索機能を作ります。 SQLインジェクション対策 http://www.atmarkit.co.jp/ait/articles/0611/02/news127.html SQLインジェクション対策もれで損害賠償の判決もあります。 https://codezine.jp/article/detail/9204 あら、マイナスを付けられている。涙
guest

0

元のソースは "and name like" までを動的に加えているので、外部入力された name の値が空文字、あるいはNULLのときは加えたくないということですかね?
AND LIKE '%%' となればNULL以外の全件が対象になるので同じことかもしれませんが……

そのやり方については、この辺で解説しておきましたので、良かったらご覧ください。
http://qiita.com/kantomi/items/d7316b7dc7a0cf8512e1
http://qiita.com/kantomi/items/1c1f3ee99031d7e4b6a2

つまり、

and (name like パラメータ OR パラメータ IS NULL)
あるいは、パラメータに空文字がくるときは
and (name like パラメータ OR パラメータ = '')

となるようにすれば、動的なWHERE句の生成を避けることができます。

投稿2016/10/06 07:42

編集2016/10/06 07:45
kantomi

総合スコア295

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

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

0

ベストアンサー

公式のドキュメントを読む限り、Slick は
「可能な限りプリペアドステートメントを使用する」
と記載があります。
http://slick.lightbend.com/doc/3.0.3/database.html#connection-pools

Slick uses prepared statements wherever possible

しかし、ご提示のソースコードのままではプリペアドステートメントは使用できないはずです。
なぜなら、MySQLでは値の一部だけをバインドパラメータで指定することはできないからです。
(LIKE 句の"%"も「値」に含まれます)

というわけで、以下のようにソースコードを修正すると、うまくいくかも知れません。

scala

1// 外部入力された name の値 2val name = "hoge"; 3val nameLike = "%" + name + "%"; 4 5sql"select * from a_table where age = 20 and name like ${nameLike}"

http://slick.lightbend.com/doc/3.0.3/sql.html#string-interpolation

ただし、恐縮ではありますが、手元に環境が無いため、当方では動作確認しておりません。
ご自身の環境で試してみてもらえますでしょうか?

投稿2016/10/06 05:27

KiyoshiMotoki

総合スコア4791

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問