# すごく匿名ダイヤリー ## 問題環境 匿名で日記が投稿できるサービス「すごく匿名ダイヤリー」を運営しています。 従来、フロントエンドとバックエンドを同じドメインで運用していましたが、 構成変更のため、バックエンドをサブドメインに変更する作業を行っています。 変更前: https://old-diary.ictsc.net/ https://old-diary.ictsc.net/api/ 変更後: https://new-diary.ictsc.net/ https://api.new-diary.ictsc.net/ ※VNCサーバのWebブラウザからのみ閲覧可能です ソースコード内のドメインやパスは適切に書き換えましたが、何故か正常に動作しません。 変更前と同じように各機能が動作するよう、サーバにログインして原因調査 及び 修正を行ってください。 なお、サービスはメンテナンス中で限定公開としているため、対応中にサービス断が生じても問題ありません。 また、投稿データについてもバックアップから復元するので、(変更前/変更後環境共に)日記の追加・削除・スター追加は任意に実施して問題ありません。 今後の運用・開発を考慮し、変更は問題解決に必要な箇所に絞り、出来るだけ他に影響を与えないように直してください。 全てを直しきれない場合でも、可能なところまで直してください。 ## サービス仕様 - 誰でも匿名で日記が投稿・閲覧できる - 投稿されている日記に対して誰でもスターを付けることができる - 日記は投稿したブラウザで閲覧すると削除ボタンが表示され、削除が可能 (期間/個数に制限あり) - フロントエンドはSPA(Single Page Application)として構築されている - 日記の取得/投稿/削除/スター追加はWebAPI経由でバックエンドと通信して実現する ## 解答方法 - 修正 と 報告 の両方が必要です - 「変更後」のURLでサービスが正常に動作するよう、実際にサーバ上で修正を行ってください。 - 解答から「原因と実施した修正内容」を報告してください。 - 報告は最終的に行った内容のみで問題ありません (途中の試行錯誤は記載不要) - 具体的に記載してください (例: XXXを直した、ではなく XXXがXXXなので、XXXファイルのXXX部分にXXXXXXXXXを追加した 等) ## ログイン情報 VNCサーバから $ ssh 192.168.0.80 -l admin → PW: USerPw@19 ※ $ sudo su - にて rootユーザに昇格可能です # 回答 どうせCORSだろ CSPだった  `systemctl status`で確認 apache PHPで動いてそう [Apache2.4 header情報を追加する | 優技録](https://www.yuulinux.tokyo/10337/) [CSP: connect-src - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Security-Policy/connect-src) ### /var/www/new-front/index.html ```diff - <meta http-equiv="Content-Security-Policy" content="default-src 'self'; connect-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com;"> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; connect-src https://api.new-diary.ictsc.net; script-src 'self' 'unsafe-eval'; style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com;"> ``` ### /var/www/new-api/public/index.php ```diff $uri = rawurldecode($uri); +if ($httpMethod == 'OPTIONS') { + header('HTTP/1.1 200 OK'); + return; +} $routeInfo = $dispatcher->dispatch($httpMethod, $uri); switch ($routeInfo[0]) { ``` ### /etc/httpd/conf.d/virtualhost.conf ```diff SSLEngine on SSLCertificateFile /etc/pki/tls/certs/new-diary.crt SSLCertificateKeyFile /etc/pki/tls/private/new-diary.key SSLCertificateChainFile /etc/pki/tls/certs/chain-diary.crt + Header add Access-Control-Allow-Origin https://new-diary.ictsc.net + Header add Access-Control-Allow-Methods "POST, GET, DELETE, PUT, OPTIONS" + Header add Access-Control-Expose-Headers "Location" ``` ## 清書 Content-Securty-Policyの`connect-src`ディレクティブが,正しく設定されていなかったため,ブラウザにより`https://api.new-diary.ictsc.net`への接続をブロックされていました. そこで/var/www/new-front/index.htmlを下記の様に変更し,`https://api.new-diary.ictsc.net`への接続を許可しました. ### /var/www/new-front/index.html ```diff - <meta http-equiv="Content-Security-Policy" content="default-src 'self'; connect-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com;"> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; connect-src https://api.new-diary.ictsc.net; script-src 'self' 'unsafe-eval'; style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com;"> ``` CORSの設定が正しくヘッダーに載っていなかったため,`https://api.new-diary.ictsc.net`への接続をブロックされていました. そこで,以下のように`/etc/httpd/conf.d/virtualhost.conf`にレスポンスヘッダーにCORS関連のヘッダーを追加するよう設定を変更しました. また,それに伴いプリフライトリクエストが飛んでくるため,OPTIONSメソッドでのリクエストに対する処理を`/var/www/new-api/public/index.php`に追加しました. ### /etc/httpd/conf.d/virtualhost.conf ```diff SSLEngine on SSLCertificateFile /etc/pki/tls/certs/new-diary.crt SSLCertificateKeyFile /etc/pki/tls/private/new-diary.key SSLCertificateChainFile /etc/pki/tls/certs/chain-diary.crt + Header add Access-Control-Allow-Origin https://new-diary.ictsc.net + Header add Access-Control-Allow-Methods "POST, GET, DELETE, PUT, OPTIONS" + Header add Access-Control-Expose-Headers "Location" ``` ### /var/www/new-api/public/index.php ```diff $uri = rawurldecode($uri); +if ($httpMethod === 'OPTIONS') { + header('HTTP/1.1 200 OK'); + exit(); +} $routeInfo = $dispatcher->dispatch($httpMethod, $uri); switch ($routeInfo[0]) { ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up