--> -->
手元のシステムはLaravel5.4で動いていました。
これを最新の6.xに移行したとき、頻繁に419 Session Expireエラーが出るようになった話です。
原因は、Session::regenerate()でした。
セッションIDの再生成はセキュリティの観点から推奨される処理です。
このregenerate()ですが、Laravel5.6.9から、実行時にCSRF TOKENも再生成されるようになりました。
regenerate the token on session regeneration
件のシステムは画面遷移時にほぼ毎回Session::regenerate()を実施していたため、エラーでredirect()->back()で戻った際などにTOKENが再利用される場合、419エラーが発生していたのでした。
regenerate処理のソースを見ると、
1 2 3 4 5 6 7 8 9 10 11 12 |
|
となっていて、migrate()実施後にトークンを作り直しているので、「Session::regenerate()」を「Session::migrate()」とすることで回避しました。
アクセス修飾子は public ですがマニュアルには載っていないので、一応自己責任で・・・。
検索しても何も出ないので恐らく皆さんそんなアホな事はしないのだと思いますがハマったので一応メモ・・・(._.)φ
さくらのクラウド(石狩第一リージョン)で新しくサーバーを立てまして、CentOS7系の最新であった7.7をプリセットから入れました。
サーバー作成後、パケットフィルタを一から作成して、最小限のポート(22,80)だけを空け、ssh経由で色々設定しておりました。
2,3日経った頃、設定作業を行っていると突然sshが切断され、以降繋がらなくなりました。慌ててコンソールから入ってみると、IPアドレスがありません。
# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::****:****:****:**** prefixlen 64 scopeid 0x20<link> ether **:**:**:**:**:** txqueuelen 1000 (Ethernet) RX packets 61085 bytes 3813838 (3.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2195 bytes 1087830 (1.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 303 bytes 26360 (25.7 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 303 bytes 26360 (25.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
なんと言うことでしょう。これはさくらの障害か?
結論を先に言います。原因はいい加減なパケットフィルタでした。
さくらのクラウドはクラウドレベルでパケットフィルタを設定できますが、ここではポート22,80ぐらいしか空けていませんでした。ところが、サーバーは自身のIPアドレスをDHCPで取得しており、これがudp/68を使うため、DHCPの更新ができず、IPアドレスが消失してしまったという事象でした。パケットフィルタに「udp 68 allow」を設定して無事解決しました。
パケットフィルタのプリセットにudp/68が入っていて、「なんだろうこれー」と思ったまま放置してしまったのが敗因(?)でした。名探偵コナンばりに、少しでも「あれれー?」と思った事はきちんと調べましょう。
この原因に気づいたのは、ログでした。
Feb 17 14:39:40 localhost dhclient[1265]: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 17 (xid=0x1d63c663) Feb 17 14:39:41 localhost NetworkManager[604]: <warn> [1581917981.4975] dhcp4 (eth0): request timed out
以前建てたさくらのクラウドのサーバーは静的IPだったため遭遇しなかったのですが、今回建てたサーバーはDHCPでIPアドレスを取得していたため、IPアドレス更新のタイミングでIPアドレスが取れなくなり、ネットワーク接続が消失してしまったのでした。
サーバー構築当初は正常に稼働し、数日経って突然切れるという、少し怖い話でした。
Tweet