![見出し画像](https://assets.st-note.com/production/uploads/images/84580045/rectangle_large_type_2_5a56dc8942db2c899b8b2eaedb6c214b.png?width=1200)
コンテンツセキュリティポリシーを設定したらPOTI-boardのお絵かき画面の時計が動かなくなりました。
XSS攻撃の影響を軽減するコンテンツセキュリティポリシー(以下CSP)を設定したところ、POTI-boardのお絵かき画面の時計が動かなくなりました。
一体何が起きたのでしょう。
![](https://assets.st-note.com/img/1660308694422-gfQ7nynGSe.png?width=1200)
↑
CSPの概要。
インラインのJavaScriptは危険だから動かなくする…としてしまうと掲示板が動かなくなってしまいますので、インラインのJavaScriptは許可していました。
それなのに時計が動かないのは一体なぜなのか…。
エラーの内容をよく観てみると…。
![](https://assets.st-note.com/img/1660309468390-wEUbvvjVvl.png?width=1200)
potiboard.php:220 Refused to evaluate a string as JavaScript
because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self' 'unsafe-inline' https://www.googletagmanager.com/gtag/".
eval()をブロックしたという事のようです。
文字列から JavaScript を実行することは、非常に大きなセキュリティリスクを伴います。
eval()という関数そのものは使用していなかったのですが、文字列をJavaScriptとして評価して実行している箇所があり、それがCSP違反になったようです。
具体的にコードをみてみましょう。
imerID=setTimeout("SetTimeCount()",250)}SetTimeCount();
"SetTimeCount()"という文字列をJavaScriptとして評価して、実行していました。
修正できなかったら、愛着のある時計ですが取り外し?と思ったのですが…。
マイクロソフトEdgeの情報ページに対応方法が詳しく載っていました。
timerID=setTimeout("SetTimeCount()",250)}SetTimeCount();
↑
evalと同じように文字列をJavaScriptとして評価しているからブロックされる。
timerID=setTimeout(function() { SetTimeCount(); },250);}SetTimeCount();
↑
ブロックされない。
20年前から入っていたJavaScriptの時計に、まさかこんな問題が潜んでいるとは思ってもみませんでした。
文字列をJavaScriptとして評価しているものの、変数に代入しているわけではないので、XSS攻撃は成立しないと思いますが、簡単に修正できる箇所なので修正しておくにこした事はないですね…。
その他のJavaScriptも、Googleのクロージャーコンパイラーで圧縮する時に文法エラーが出て圧縮できなかった箇所が数カ所ありました。
圧縮したファイルを使う使わないに関わらず、圧縮に失敗→非推奨の箇所を修正となるのはいい事です。
エラーを出しながら、それにパッチをあてていく地味な作業ですが、4年間でいろいろな箇所を修正する事ができました。
POTI-board EVOはどなたでも無償で利用できるお絵かき掲示板のPHPスクリプトです。
日々改良をかさねてアップデートしています。
POTI-boardとお絵かき掲示板交流サイトをどうぞよろしくお願いします。
この記事が気に入ったらサポートをしてみませんか?