はじめに
最近、データベースにMySQLを使ってXcodeのシミュレータで取得する練習をしていました。その際MySQLから直接取得するのではなく、PHPを経由するやり方が多く紹介されていました。今回の記事では、なぜPHPを使うのかについてのイメージが掴める記事に出来ればと思ってます。
データベースの種類
個人開発でデータベースを使う場合、以下のものがよく候補として挙げられると思います。
これらはNoSQLらしいです。
- Realm
- Firebase Realtime Database
- Cloud Firestore
次の4つはSQLで操作するRDBMS(Relational DataBase Management System)です。
リレーショナル型は表で構成されたデータのイメージです。
- MySQL
- Oracle Database
- PostgreSQL
- SQLite
RDBMSとNoSQLの比較
比較についてはこちらのサイトがわかりやすかったです。
RDBMSは複雑なデータの扱いが可能で、整合性が高いが、処理速度が遅い。
NoSQLは処理速度が早く、大規模データの処理が得意だが、データの整合性が劣る。
これらのメリットデメリットを踏まえて、データベースの選択をしてるんですね。
個人開発だとNoSQLのものを使っている人が圧倒的に多い印象です。
実際の現場でどのような基準で選ばれているかなどの話も聞いてみたい。。。
SQLってなんやっけ
ここからはRDBMSの話に絞っていきます。
SQLとRDBMSの関係性について図を作成してみたので貼っときます。
SQLを無理やり一言でいうと、、、
#####リレーショナルデータベース(表)を管理するRDBMS(MySQLとか)を操作するための言語
なぜPHPがいるのか(結論)
今回のタイトルですね。Swift側から直接MySQLとかのRDBMSにアクセスも出来そうですよね。実際にやろうと思えば出来るそうですが、セキュリティ的に危ないそうなのでその辺りを調べてみました。先に結論聞いた方が、話が入ってきそうなので結論書いておきます。
####結論
SQLインジェクションを防ぐため!!!
SQLインジェクションとは
入力フォームにSQL文を入力することで、アプリケーションが想定しないSQL文を実行させることで、不正操作する攻撃のことです。
この辺り、基本情報記述者試験の勉強でも出てきました。今回具体例を調べてみて理解が深まりました。
####具体例
idに紐付いたデータを取得するSQL文があるときに、
SELECT * FROM atable WHERE id='入力されたID'
悪意のあるユーザが以下を入力したら
';DELETE FROM atable--
完成するSQL文は
SELECT * FROM atable WHERE id='';DELETE FROM atable--
→ データベース全削除になる!!!
他にもわかりやすい例が独立行政法人 情報処理推進機構のサイトに載っています。
SQLインジェクションを防げるのがPHP
具体例のようなSQL文を実行されないために、
危険な文字に対して適切にエスケープ処理をする必要があります。
しかし、エスケープが必要な文字というのは、データベースエンジンの種類によって異なるので、自分で実装していては漏れが発生して脆弱性が生じてしまいます。(どうしよう)
ここでPHP!!!
PHPはquoteメソッドというのがあり、データベースエンジンの種類を意識することなく、正しいエスケープ処理を実現してくれる!!!
公式ドキュメントにエスケープしてるコードが載ってます。
まとめ
SQLインジェクションを防ぐためにPHPを使いましょうって感じでした。
今回はPHPで話しましたが、エスケープするために使う言語はPHP以外にもあります。
JavaやPerlを使ったMySQLへの安全な接続方法などもあり、その説明が独立行政法人 情報処理推進機構のサイトに載っていました。参考文献として載せておきます。
また、SQLインジェクションを防ぐ目的以外でもPHPを使う理由があれば、教えていただきたいです。まだまだ調べきれていないと思うので。
参考文献
安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構
https://www.ipa.go.jp/security/vuln/websecurity.html
https://www.ipa.go.jp/files/000017320.pdf