45
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Google Apps Scriptを書いているやつは、今すぐすべての関数名の末尾にアンダースコアを入れろ

Last updated at Posted at 2021-06-14

2021/06/15 追記
「すべての関数名」と記事タイトルでは煽り気味にしているが、本当にすべてに設定すると機能しなくなる。この記事やドキュメントを読んだ上で取捨選択は必要である。


特定の条件を満たすとGoogle Apps Script(GAS)に書かれた関数は外部から呼び出せる。

具体的な手段は控える(ただし、上のドキュメントを読めばウェブに詳しい人は即座に実行できるだろう)が、これは HTML Service でサイトを公開していることによって引き起こされる。 HTML Service で公開された HTML からサーバー側の関数を呼び出す機能があるのだが、なんとグローバル関数は初期状態ですべて呼び出すことが可能となっている。これは大変危険な初期状態に見えるがドキュメントに明示されているので、ぶっちゃけ仕方がない。関数名の末尾にアンダースコアをつけるか、グローバルに直接置かないようにすることで対処しよう。下記がその例である。

function privateFunction_() {
  return 'sample value!!';
}

(function () {
  function sampleFunction1() {
    return 'sample value!!';
  }
})();

var obj1 = {
  sampleFunction2: function () {
    return 'sample value!!';
  }
}

class Member {
  sampleFunction3() {
    return 'sample value!!';
  }
}

Google Apps Scriptで組まれたウェブサービスにアクセスできる人はだれでも実行でき、しかもその関数名一覧も取れるために、アプリケーションによってはかなり致命的な事態を招く可能性がある。急ぎ確認したほうが良い。

ただし、この対応を行った関数は関数単体で実行してデバッグする機能だったり、トリガーだったりに使うことはできない。すなわち、 doGet とかは onEdit とかは必ず外部から実行されうるのである。トリガー関数で想定シチュエーションかどうかを何らかの方法で入念に確認する必要がある。これは仕様としてどうなんだ…?と思わざるを得ないが…。

逆に外部から実行できる関数一覧は私が確認した限りではデバッグ可能な関数と一致している。その一覧を見て、外部から呼び出されてはまずい関数が入っていないか確認しよう。

45
45
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?