رفتن به محتوا

SecureJSON

SecureJSON از دسته‌ای از آسیب‌پذیری‌ها به نام ربودن JSON محافظت می‌کند. در مرورگرهای قدیمی‌تر (عمدتاً Internet Explorer 9 و قبل‌تر)، یک صفحه مخرب می‌تواند تگ <script> را به نقطه پایانی API JSON قربانی اشاره دهد. اگر آن نقطه پایانی یک آرایه JSON سطح بالا برگرداند (مثلاً ["secret","data"])، مرورگر آن را به عنوان JavaScript اجرا می‌کند. با بازنویسی سازنده Array، مهاجم می‌تواند مقادیر تجزیه شده را رهگیری کند و داده‌های حساس را به سرور شخص ثالث نشت دهد.

نحوه جلوگیری SecureJSON:

وقتی داده پاسخ یک آرایه JSON است، SecureJSON یک پیشوند غیرقابل تجزیه — به طور پیش‌فرض while(1); — را به بدنه پاسخ اضافه می‌کند. این باعث می‌شود موتور JavaScript مرورگر در صورت بارگذاری پاسخ از طریق تگ <script> وارد حلقه بی‌نهایت شود و از دسترسی به داده‌ها جلوگیری کند. مصرف‌کنندگان قانونی API (با استفاده از fetch، XMLHttpRequest یا هر کلاینت HTTP) بدنه پاسخ خام را می‌خوانند و می‌توانند به سادگی پیشوند را قبل از تجزیه حذف کنند.

APIهای Google از تکنیک مشابهی با )]}'\n استفاده می‌کنند و Facebook از for(;;); استفاده می‌کند. می‌توانید پیشوند را با router.SecureJsonPrefix() سفارشی کنید.

package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// You can also use your own secure json prefix
// router.SecureJsonPrefix(")]}',\n")
router.GET("/someJSON", func(c *gin.Context) {
names := []string{"lena", "austin", "foo"}
// Will output : while(1);["lena","austin","foo"]
c.SecureJSON(http.StatusOK, names)
})
// Listen and serve on 0.0.0.0:8080
router.Run(":8080")
}