من از استراتژی گذرنامه محلی-گذرنامه استفاده می کنم ، اما به طور کلی چند سؤال دارم (از عرض پوزش). آنها ممکن است سوالات بسیار تازه ای باشند بنابراین من از قبل عذرخواهی می کنم ، اما لطفاً از جنبه های سوال و کد من برای اهداف امنیتی انتقاد کنید. من می خواهم از اصل حداقل امتیاز پیروی کنم ، بنابراین تعجبم این بود که آیا باید هنگام خصوصیات در گذرنامه ، برخی از خصوصیات مخفی را از کاربر حذف کنم. به عنوان مثال ، کاربر من دارای خصوصیات هش ، نمک و تکرار است که مقادیر آن را نمی خواهم بطور تصادفی به جبهه نشت کنیم.
اگر با گذرنامه ناآشنا باشید ، داده های کاربر را در مورد درخواست در سرور قرار می دهد. هنگام استفاده از هر کاری با اتصالهای میانی اتصال (من از اکسپرس استفاده می کنم) این شی درخواست از طریق چندین درخواست کننده / واسطه های درخواست منتقل می شود تا اینکه در نهایت یکی از آنها پاسخی را به مشتری ارسال می کند. روش کاربر deserialize همان چیزی است که گذرنامه روشی را برای بی حس کردن کاربر از حالت سریالی بودن آن فراهم می کند (که در مثال زیر حالت سریال شناسه است).
- سوال اول ، اگر من از خودمزدایی کنم مزایا یا معایب اصلی چیست. کاربر من بدون این ویژگی ها (یعنی هش ، نمک و تکرار) در ویژگی های کاربر قبل از اجازه دادن به کاربر می تواند روی شی درخواست سمت سرور قرار گیرد (یعنی درخواست.سوزر)؟
به عنوان مثال به جای این:
pasport.deserializeUser (عملکرد async (شناسه ، انجام شده))
تلاش كردن {
کاربران const = منتظر sqlFetch`SELECT * از کاربران WHERE id = $ {id} `
const user = کاربران [0]؛
انجام شده (تهی ، کاربر)؛
} گرفتن (اشتباه)
انجام شده (اشتباه ، تهی)
}
})؛
من می توانم این کار را انجام دهم:
pasport.deserializeUser (عملکرد async (شناسه ، انجام شده))
تلاش كردن {
کاربران const = منتظر sqlFetch`SELECT نام کاربری ، ایمیل ، شناسه ، isAdmin از کاربران WHERE id = $ {id} `؛
const user = کاربران [0]؛
انجام شده (تهی ، کاربر)؛
} گرفتن (اشتباه)
انجام شده (اشتباه ، تهی)
}
})؛
به این ترتیب ، من هرگز به طور تصادفی هش ، نمک و تکرار آن را به مشتری نمی پردازم.
اگر می خواهم از ارسال هش ، نمک و تکرار با کاربر محصور در هنگام پاسخ دادن به سوال 1 جلوگیری کنم ، احتمالاً در زمانی که صفحه وب را برای مشتری ارسال می کنم مانند مثال در اینجا: [روتر19659005] .get ("/" ، (req ، res) =>
res.render ("فهرست" ، {
کاربر: req.user && {
شناسه: req.user.id ،
ایمیل: req.user.email ،
displayName: req.user.displayName،
isAdmin: req.user.isAdmin
،
})؛
})؛
با توجه به اینکه تعداد زیادی مسیر وجود دارد که این کار را انجام می دهند ، به نظر می رسد ممکن است در یک نقطه اشتباه پیش برود. بنابراین ، من می توانم از وسط کامپیوتر در روترهای خاص استفاده کنم تا هر router.get ، router.post و غیره که بعد از آن می آید کاربر کامل را نداشته باشد:
router.use (عملکرد (req ، res ، بعدی)) {
req.user = req.user&& {
شناسه: req.user.id ،
ایمیل: req.user.email ،
displayName: req.user.displayName،
isAdmin: req.user.isAdmin
؛
بعد()؛
})
router.get ("/" ، (req ، res) =>
res.render ("فهرست" ، {
کاربر: req.user،
})؛
})؛
-
فرضیه ای دارم که شدیداً بهم ربط دارد و می خواهد بگوید بله برای سوال یکی؛ این فرض این است که هیچگاه نیازی به استفاده از هش ، نمک و تکرار مجدد از سرور گذشته نیست و بنابراین هرگز نیازی به استفاده از شی کامل کاربر در خارج از گذرنامه ندارم (به عنوان مثال در خارج از کشور هنگام استفاده از
درخواست.برای دسترسی به کاربر بعدا) ، و بنابراین طبق اصل کمترین امتیاز نباید از کاربر کامل در جای دیگری استفاده می کردم. آیا این فرض صحیح است؟ -
همچنین ، برای همراه کردن با 2. من فکر می کنم اگر کاربر را به همراه درخواست از طریق گیرندگان مسیر خود ارسال نکنم ، در برابر آسیب پذیری های حافظه مشترک آسیب پذیر نخواهم بود (من معمولاً برنامه هایم را روی ابر قرار می دهم) بنابراین من فکر می کنم این باید یک نگرانی باشد.) آیا این یک نگرانی و فرض معتبر است؟
-
می گویند در عوض اسرار یک نشانه API بود. تفاوت با این مسئله این است که من مجوز آن را دارم که در یک نقطه از چرخه درخواست به یک API خارجی اجازه دهیم. به همان دلایلی که در بالا گفته شد (یعنی حداقل امتیاز ، آسیب پذیری حافظه مشترک) باید در ابتدای درخواست علائم کاربران را بدست آورم و احتمالاً به مسیری میاناب بروم که در آنجا اجازه دسترسی به خارج از مسیرهای API من را نمی دهم ، یا باید فقط واکشی کنم. این علامت API از DB (که یک تماس دیتابیس اضافی است) وقتی به آن احتیاج دارم شاید با واسطه مخصوص خود (اما فقط در مسیرهای روترهای API من) باشد؟ یکی دیگر از گزینه های توکن های API که شنیده ام رمزگذاری رمز API در db و رمزگشایی در زمان استفاده است؟ آیا هر یک از این 3 گزینه آخر برای نشان های API دارای مزایا یا معایب عمده ای نسبت به دیگران است؟