コンテンツにスキップ

SecureJSON

SecureJSONJSONハイジャックとして知られる脆弱性クラスから保護します。古いブラウザ(主にInternet Explorer 9以前)では、悪意のあるページが被害者のJSON APIエンドポイントを指す<script>タグを含めることができました。そのエンドポイントがトップレベルのJSON配列(例:["secret","data"])を返した場合、ブラウザはそれをJavaScriptとして実行していました。Arrayコンストラクタをオーバーライドすることで、攻撃者はパースされた値を傍受し、機密データをサードパーティのサーバーに漏洩させることができました。

SecureJSONの防止方法:

レスポンスデータがJSON配列の場合、SecureJSONはレスポンスボディにパース不可能なプレフィックス(デフォルトではwhile(1);)を付加します。これにより、レスポンスが<script>タグ経由で読み込まれた場合にブラウザのJavaScriptエンジンが無限ループに入り、データへのアクセスが防止されます。正当なAPI利用者(fetchXMLHttpRequest、またはその他のHTTPクライアントを使用)はレスポンスボディを直接読み取り、パース前にプレフィックスを除去するだけで済みます。

GoogleのAPIは)]}'\nで、Facebookはfor(;;);で同様の手法を使用しています。プレフィックスはrouter.SecureJsonPrefix()でカスタマイズできます。

package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// 独自のSecure JSONプレフィックスを使用することもできます
// router.SecureJsonPrefix(")]}',\n")
router.GET("/someJSON", func(c *gin.Context) {
names := []string{"lena", "austin", "foo"}
// 出力: while(1);["lena","austin","foo"]
c.SecureJSON(http.StatusOK, names)
})
// 0.0.0.0:8080でリッスンしてサーブ
router.Run(":8080")
}