ポートフォリオのアプリを公開したらイタズラされまくった話

#はじめに

私はこれまで開発未経験からサーバーサイドエンジニア転職を目指しており、
Laravel等の技術を使用して「朝活SNS」アプリを個人開発し、
AWSのEC2上で、一般公開していました。

アプリの紹介記事をQiitaにも投稿したところ、
→[AWS, Docker, CircleCI, Laravelでポートフォリオを作成してみた【参考リンク付き】](https://qiita.com/nasuB7373/items/0e507abad2017976c407)
有難いことに300LGTMもいただくことができ、多くの方に
実際にポートフォリオアプリを触ってもらえたものの、結構いろんなイタズラもされしまっておりました。^^;

実装の詰めが甘かったところもあり、その脆弱性を突かれたイタズラ等もあったので、
アプリはデプロイして終わりなのではなく、運用フェーズに入ってからも気を抜いてはいけないのだと実感しましたね。。

こちらの記事では、そんなイタズラの数々や、それに対策できた部分について簡単にご紹介できればと思います。

#1.下ネタ投稿をされまくる

これは予想はしていました・・笑
投稿機能のあるアプリなら、ありがちなイタズラかもしれませんね。
ちなみに次のような下ネタ投稿をされていました↓

![スクリーンショット 2020-11-24 23.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/34c0ba28-7707-d1d1-ae4f-ded0674bd388.png)


![スクリーンショット 2020-11-25 23.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/1a248f76-a18e-c810-40f0-ea636fc0d4dd.png)

![スクリーンショット 2020-11-25 23.35.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/e5bad80c-72fc-3e79-69dc-2232d4d43c60.png)


ザ・下ネタの帝王！ばりの単語が連呼されていますが、1日平均３回くらいは書き込まれていたので、毎日ちょいちょいパトロールを実施。。
書き込みを見つけては、トイレ掃除をするような心境でDBから投稿を削除していました。(´･_･`)笑

LaravelでNGワード機能を実装してみようと試みたものの、不具合があったため現在この辺は検討中です。


#2.クロスサイトスクリプティングを狙われる(XSS)

Webアプリ等の脆弱性を狙って、悪意のあるスクリプトを実行させたりする攻撃としても有名なXSS。
今回はそれに近いような投稿も見られました。


![スクリーンショット 2020-11-26 17.14.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/9dbbac6f-2ed2-02b1-31b9-dbbfc7dfbf6a.png)

```
<script>alert("Test")</script>
```

思いっきりJavaScriptらしきメッセージが投稿されていますね。^^;
コードの内容としては、「Test」という文字列をダイアログボックスに表示するだけのものですが、
投稿したメッセージの「<」や「>」を無害化する処理を実装済みであるため
特に何も実行はされませんでした。

#3.ゲストログイン機能のゲストユーザー情報を書き換えられる

今回作ったアプリには、「かんたんログイン」ボタンを押すと、予め用意されている
「ゲストユーザー」としてログインできるような機能があります。
（ユーザー名、メールアドレス等を入力しなくても簡単にログインできる）

イメージはこちらです↓

![guestlogin_image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/f6793a06-450b-13d6-4205-c378abe2ebbf.gif)

この機能の使用上、ゲストユーザーの`ユーザー名`や`メールアドレス`を変更されると、ゲストログイン機能が動かなくなってしまいます。

そこで、**ユーザープロフィール編集機能**では、ゲストユーザーでログインしている時だけ
`ユーザー名`や`メールアドレス`を変更できないように工夫しました。

![スクリーンショット 2021-01-13 20.49.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/b024a883-0ed6-1631-9ccf-51da0d1db93f.png)

仕組みとしては、ゲストユーザーでログインしている時だけ、Viewの
< input >タグに`readonly属性`が付与されたものが表示され、テキストボックスが灰色になって入力できなくなるようにしていました。

しかし、この対策だけでは結構マズくて、いとも簡単にゲストユーザーのユーザー名やメールアドレスを書き換えられてしまいました。
ある日ゲストログインしたら、ユーザー名が突然**「にゃ〜ん」**というものに変えられていて、めちゃめちゃ焦りました!!!^^;　 笑

おそらくChrome等のデベロッパーツールを使ってHTMLを改ざんされてしまったのだと考えられます。
![スクリーンショット 2021-01-13 20.55.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/39357687-68a8-9684-100d-427c96ce379f.png)


デベロッパーツールで< input >タグの`readonly="readonly"`を削除すると、ただのテキストボックスになり
ユーザー名やメールアドレスが普通に変更できるようになってしまいます↓

![スクリーンショット 2021-01-13 20.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/5d946aad-694a-f49d-d08c-d94c4a884091.png)


デベロッパーツールって万能ですね・・
この時フロントエンド側だけでの対策がいかにマズイのかを学びました^^;
したがって、取り急ぎバックエンド側でも、ゲストユーザーのメールアドレス等を変更できないようにセキュリティ対策の実装をしたところ、
今回の問題は無事に解決しました。
その時の対策方法は、こちらの記事にまとめています。
　[Laravel6系でゲストログイン機能（かんたんログイン）の実装](https://qiita.com/nasuB7373/items/5b00007c4f73dd55e0cb#%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89%E5%81%B4%E3%81%AE%E5%AF%BE%E7%AD%96)

#最後に
今回はざっと、公開したポートフォリオアプリへのイタズラをまとめてみましたが、
実務未経験ながらこのような体験ができて学びも多かったです。
セキュリティ面の実装の甘さに気付けたり、NGワード機能を追加してみようかな？と新たなアイディアが浮かんだり等々。。
今後は運用フェーズを意識して、セキュリティ面を強化した実装等をより心がけていきたく思います！
（まだ入社して日が浅く、実務では今は実装やセキュリティ分野は担当していませんのでご安心ださい^^;）