Node.js REST API - تعقيم URI؟

0

أرغب في طلب صفحات في خادم Node.js الخاص بي بناءً على عنوان URI المطلوب.

ومع ذلك ، أشعر بالقلق من أن هذا قد يكون مشكلة أمنية خطيرة حيث يمكن للمستخدم حقن بعض الأحرف الخبيثة في عنوان url ، مثل ../../ والوصول إلى نقطة الخادم الجذر الخاصة بي والكشف عن جميع التعليمات البرمجية.

لذا تمامًا مثل إلقاء زجاجة من الماء على حريق كبير ، قمت بإلغاء خيار الإرسال . للطلب.

هذه ليست رصاصة فضية ، ربما :)

ربما هناك بعض المعايير / أفضل الممارسات / دليل أو نقاط رئيسية حول تعقيم URI في REST API استنادًا إلى Node.js؟

تحرير - هنا يستخدم الرمز المطلوب

// app.js
app.use(require('./services/router')(app));


// router.js middleware 
function router(app) {
  return function(req, res, next) {

    try {
      // checking for . in the url
      if (req.url.indexOf(".")!=-1) cast.badRequest();
      // req.url.split('/')[2] should be customers, users or anything else
      require('../../resources/' + req.url.split('/')[2] + '/' + req.url.split('/')[2] + '-router')(app);
      next();
    } catch(err) { cast.notFound(); }

  }
}

module.exports = router;

// rides-router.js (this could be users-router.js or customers-router.js)
module.exports = function(app) {

  // GET ride - select a ride
  app.get("/v1/rides/:id", dep.verifyToken(), require('./api/v1-get-ride'));

  // POST ride - insert a new ride
  app.post("/v1/rides", dep.verifyToken(), require('./api/v1-set-ride'));

  app.use((req, res, next) => {
    cast.notFound();
  });

}

1 إجابة

1
افضل جواب

سألت كيف تفعل ذلك أكثر أمانا. توصيتي هي أن تضع كل الموارد في مصفوفة وأن تدير كل app.use() عبارات بحلقة واحدة تسحب أسماء الموارد من الصفيف عند بدء تشغيل الخادم.

لا أحب تشغيل متزامن require() أثناء الطلب وأنا لا أحب تحميل الرمز بناءً على الأحرف المحددة من قبل المستخدم. كلاهما يتم تجنبه مع توصيتي.

// add routes for all resources
const resourceList = ['rides', 'products', ...];

for (let r of resourceList) {
    app.use(`/${r}`, require(`./resources/${r}/${r}-router`));
}

يبدو هذا رمزًا أقل وآمنًا بنسبة 100٪ ولا يعمل بشكل متزامن require() أثناء الطلب.

مزايا:

  1. في القائمة البيضاء بالكامل.
  2. لا يوجد إدخال مستخدم يشارك في اختيار التعليمات البرمجية للتشغيل.
  3. لا متزامن require() أثناء معالجة الطلب.
  4. تم تثبيت جميع المسارات في وقت تهيئة الخادم.
  5. تحدث أي أخطاء في تحميل المسار (مثل ملف مسار مفقود) عند بدء تشغيل الخادم ، وليس أثناء طلب المستخدم.
:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام