├── CONTRIBUTING.md ├── LICENSE ├── README-ar.md ├── README-bn.md ├── README-cs.md ├── README-de.md ├── README-el.md ├── README-es.md ├── README-fa.md ├── README-fr.md ├── README-hi.md ├── README-id.md ├── README-it.md ├── README-ja.md ├── README-ko.md ├── README-lo.md ├── README-mk.md ├── README-ml.md ├── README-mn.md ├── README-nl.md ├── README-pl.md ├── README-pt_BR.md ├── README-ru.md ├── README-th.md ├── README-tr.md ├── README-tw.md ├── README-uk.md ├── README-vi.md ├── README-zh.md └── README.md /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Contributions are **welcome** and will be fully **credited**. 4 | 5 | We accept contributions via Pull Requests on [Github](https://github.com/shieldfy/API-Security-Checklist). 6 | 7 | 8 | ## Pull Requests 9 | 10 | - **Sync** - Please make sure your repository is up to date with ours to avoid conflicts as much as possible. 11 | - **Language** - Please make sure to check your contribution for grammar mistakes and typos as much as possible. 12 | - **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. 13 | - **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](http://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting. 14 | 15 | ## Add New Translation 16 | - Fork the repository. 17 | - Translate the `README.md` file. 18 | - write the translations to a new file with naming schema (`README-[Language-code].md`), [Available languages codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes). 19 | *Example: If you want to translate for Deutsch, you would name the translated readme file as `README-de.md`.* 20 | 21 | **Stay Secure**! 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Shieldfy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README-ar.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 |
4 | 5 | # API Security Checklist 6 | قائمة تحتوي على أهم الاحتياطات الأمنية حينما تقوم بتخطيط واختبار وإطلاق الـAPI الخاصة بك 7 | 8 | 9 | --- 10 | 11 | ## المصادقة (Authentication) 12 | - [ ]       لا تستخدم `Basic Auth` لكن استخدم المعايير القياسية للمصادقة (مثال [JWT](https://jwt.io/), [OAuth](https://oauth.net/)). 13 | - [ ]       لا تعد اختراع العجلة في `المصادقة`، `توليد الرموز`، `تخزين كلمات المرور`. قم باستخدام المعايير القياسية. 14 | - [ ]       استخدم `تحديد عدد المحاولات` و`الحرمان من الدخول jail feature` في تسجيل الدخول. 15 | - [ ]       استخدم التشفير في كل البيانات الحساسة. 16 | 17 | ### JSON Web Token) JWT) 18 | - [ ]       استخدم مفتاح عشوائي ومعقد (`JWT Secret`) لتجعل هجوم التخمين بالقوة brute forcing صعبا جدا. 19 | - [ ]       لا تقم باستخراج خوارزمية التشفير من محتوى رمز الـ JWT. قم بإجبار الرمز البرمجي على استخدام خوارزمية (`HS256` أو `RS256`). 20 | - [ ]       اجعل مدة انتهاء الرمز (`TTL`, `RTTL`) قصيرة قدر الإمكان. 21 | - [ ]       لا تقم بتخزين أي بيانات حساسة داخل محتوى رمز الـ JWT, لأنه يمكن كشف هذه المحتويات بسهولة [easily](https://jwt.io/#debugger-io). 22 | - [ ]       تجنب تخزين الكثير من البيانات. عادةً ما تتم مشاركة JWT في الرؤوس ولديها حد للحجم. 23 | 24 | ## الوصول 25 | - [ ]       حدد الطلبات (Throttling) لتتجنب هجوم حجب الخدمة DDoS وهجوم التخمين بالقوة brute-force. 26 | - [ ]       استخدم HTTPS على الخادوم لتتجنب هجمات التنصت على الطلبات MITM (Man In The Middle Attack). 27 | - [ ]       استخدم `HSTS` header مع الـ SSL لتتجنب هجمات الـ SSL Strip. 28 | - [ ]       قم بإيقاف تشغيل قوائم الدليل. 29 | - [ ]       بالنسبة لواجهات برمجة التطبيقات الخاصة، اسمح بالوصول فقط من عناوين IP والمضيفين المدرجين في القائمة البيضاء. 30 | 31 | ## Authorization 32 | 33 | ### OAuth 34 | - [ ]       تحقق دائما من `redirect_uri` في الرمز البرمجي للخادوم لتسمح فقط بقائمة محددة من الروابط. 35 | - [ ]       دائما حاول أن تقوم بالتبادل والرد برمز برمجي وليس بالرمز (لا تسمح `response_type=token`). 36 | - [ ]       استخدم متغير `state` في الرابط مع مزيج عشوائي من الحروف لتمنع هجمات الـ CSRF على عملية المصادقة الخاصة بالـ OAuth. 37 | - [ ]       حدد الصلاحية والنطاق الافتراضي scope، وقم بالتحقق منه مع كل تطبيق. 38 | 39 | ## الإدخال 40 | - [ ]       استخدم الوسيلة المناسبة HTTP method حسب العملية التي تريد القيام بها : `GET (للقرائة)`, `POST (انتاج أو اضافة)`, `PUT/PATCH (لإستبدال او تحديث)`, and `DELETE (لحذف سجل)`, و قم بالرد بـ `405 Method Not Allowed` في حالة إذا كانت الوسيلة method غير مناسبة . 41 | - [ ]       قم بالتحقق من `content-type` في رأس الطلب reuest header أو ما يسمى بـ (Content Negotiation) لتسمح فقط بالتنسيقات المدعومة (مثال `application/xml`, `application/json`, إلى آخره) وقم بالرد بـ `406 Not Acceptable` إذا كان التنسيق غير ذلك. 42 | - [ ]       قم بالتحقق من `content-type` في محتوى الطلب نفسه posted data (مثال `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, إلى آخره). 43 | - [ ]       قم بالتحقق من مدخلات المستخدم لتتجنب الثغرات الشائعة (مثال `XSS`, `SQL-Injection`, `Remote Code Execution`, إلى آخره). 44 | - [ ]       لا تستخدم أي بيانات حساسة (`credentials`, `Passwords`, `security tokens`, أو `API keys`) في الرابط ولكن استخدم الطريقة القياسية وهي رأس الطلب الخاص بالمصادقة Authorization header. 45 | - [ ]       استخدم فقط التشفير من جانب الخادم. 46 | - [ ]       استخدم واجهة للـ API لتستفيد من التخزين المؤقت caching وسياسات تحديد عدد الطلبات Rate Limit policies (مثال `الحصة Quota`, `التنبية في الارتفاع المفاجئ Spike Arrest`, `وتحديد عدد الطلبات المتزامنة Concurrent Rate Limit`) 47 | 48 | ## المعالجة 49 | - [ ]       قم بفحص كل النطاقات والروابط للتحقق من كونهم محميين وراء مصادقة authentication لتتجنب المصادقة المكسورة broken authentication. 50 | - [ ]       يجب تجنب استخدام المعرف الخاص بالموارد. قم باستخدام `/me/orders` بدلا من `/user/654321/orders`. 51 | - [ ]       لا تقم باستخدام المعرف التلقائي auto-increment. قم باستخدام `UUID` بدلا منه. 52 | - [ ]       لو قمت بمعالجة ملفات XML, تأكد من أن معالجة entity parsing غير مفعلة لتتجنب هجمات `XXE` (XML external entity). 53 | - [ ]       لو قمت بمعالجة ملفات XML, تأكد من أن entity expansion غير مفعلة لتتجنب هجمات `Billion Laughs/XML bomb` من خلال هجوم exponential entity expansion. 54 | - [ ]       استخدم شبكات تسليم المحتوى CDN لرفع الملفات. 55 | - [ ]       لو كنت تتعامل مع حجم بيانات ضخم، استخدم عمليات منفصلة Workers, Queues لمعالجة البيانات في الخلفية والرد على المستخدم بسرعة لتجنب حجب الطلب HTTP Blocking. 56 | - [ ]       لا تترك وضع التصحيح DEBUG mode في حالة التشغيل. 57 | - [ ]       استخدم مكدسات غير قابلة للتنفيذ عند توفرها. 58 | 59 | ## المخرجات 60 | - [ ]       استخدم `X-Content-Type-Options: nosniff` في رأس الطلب header. 61 | - [ ]       استخدم `X-Frame-Options: deny` في رأس الطلب header. 62 | - [ ]       استخدم `Content-Security-Policy: default-src 'none'` في رأس الطلب header. 63 | - [ ]       احذف الرؤوس headers التي تدل عليك - `X-Powered-By`, `Server`, `X-AspNet-Version` إلى آخره. 64 | - [ ]       قم بإجبار إرسال `content-type` مع الرد، لو قمت بالرد بمحتويات من توع `application/json` فمن المستحسن أن يكون الرد ب`content-type` `application/json`. 65 | - [ ]       لا تقم بالرد بمعلومات وبيانات حساسة مثل `credentials`, `Passwords`, `security tokens`. 66 | - [ ]       قم بالرد بكود حالة صحيح status code طبقا للعملية التي تقوم بها. (مثال `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, إلى آخره). 67 | 68 | ## التكامل المستمر CI & النشر المستمر CD 69 | - [ ]       مراجعة التصميم الخاص بك والتنفيذ مع وحدة / التكامل اختبارات الاختبار unit/integration tests coverage. 70 | - [ ]       استخدام عملية مراجعة الرمز البرمجي وتجاهل الموافقة على الرمز البرمجي الذي قمت بكتابته. 71 | - [ ]       تأكد من أن جميع مكونات الخدمات الخاصة بك يتم فحصها بشكل ثابت بواسطة برامج الفيروسات قبل إرسالها إلى الإنتاج، بما في ذلك المكتبات الخارجية وغيرها من التبعيات. 72 | - [ ]       قم بإجراء اختبارات الأمان باستمرار (التحليل الثابت/الديناميكي) على التعليمات البرمجية الخاصة بك. 73 | - [ ]       تحقق من تبعياتك (البرنامج ونظام التشغيل) بحثًا عن نقاط الضعف المعروفة. 74 | - [ ]       تصميم حل التراجع عن عمليات النشر rollback. 75 | 76 | ## Monitoring 77 | - [ ] Use centralized logins for all services and components. 78 | - [ ] Use agents to monitor all traffic, errors, requests, and responses. 79 | - [ ] Use alerts for SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 80 | - [ ] Ensure that you aren't logging any sensitive data like credit cards, passwords, PINs, etc. 81 | - [ ] Use an IDS and/or IPS system to monitor your API requests and instances. 82 | 83 | 84 | --- 85 | 86 | ## انظر أيضا: 87 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - مجموعة من الادوات و المصادر لبناء RESTful HTTP+JSON APIs. 88 | 89 | 90 | --- 91 | 92 | # المشاركة 93 | لا تتردد في المساهمة عن طريق أخذ نسخة من هذه القائمة fork، وإجراء بعض التغييرات، وتقديم طلبات المراجعة pull request. أي أسئلة الرجاء مراسلتنا على البريد الإلكتروني `team@shieldfy.io`. 94 |
95 | -------------------------------------------------------------------------------- /README-bn.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API নিরাপত্তা তালিকা 4 | তালিকা করুন সবচেয়ে গুরুত্বপূর্ন নিরাপত্তা পাল্টা ব্যবস্থা যখন পরিকল্পনা, পরীক্ষামূলক, এবং নিষ্কৃতি করছেন আপনার API। 5 | 6 | 7 | --- 8 | 9 | ## প্রমাণীকরণ 10 | - [ ] `Basic Auth` ব্যাবহার করবেন না । এর পরিবর্তে standard প্রমাণীকরণ ব্যবহার করুন (যেমন [JWT](https://jwt.io/)). 11 | - [ ] `Authentication`, `token generation`, `password storage` এ নতুন করে চাকা উদ্ভাবন করবেন না । standards গুলোই ব্যবহার করুন । 12 | - [ ] `Max Retry` এবং জেলে দেওয়া(block) বৈশিষ্ট্য সম্পূর্ণ করুন 13 | - [ ] সংবেদনশীল তথ্য গোপন(encryption) করে ব্যবহার করন 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] একটি এলোমেলো জটিল পিন (`JWT Secret`) ব্যবহার করুন brute forcing প্রক্রিয়া কে অনেক কঠিন করতে। 17 | - [ ] header থেকে অ্যালগরিদম নির্যাস(extract) করবেন না।অ্যালগরিদম টি কে ব্যাকএন্ড(backend) এ পাঠিয়ে দিন (`HS256` অথবা `RS256`) । 18 | - [ ] টোকেন (`TTL`, `RTTL`) মেয়াদকাল যত কম করা যায় তা করেন । 19 | - [ ] সংবেদনশীল তথ্য JWT payload এ সংরক্ষণ করবেন না। এটি খুব সহজে ডিকোড করা যায় [easily](https://jwt.io/#debugger-io)। 20 | - [ ] অনেক বেশি তথ্য সংরক্ষণ করবেন না। JWT এটি সাধারণত হেডার এ ভাগ করে এবং এটার একটা আয়তন সীমা আছে। 21 | 22 | ## অ্যাক্সেস 23 | - [ ] Requests এ সীমা দিয়ে দিন (Throttling) DDoS / brute-force আক্রমণ এড়ানোর জন্য। 24 | - [ ] সার্ভার এ HTTPS এর সাথে TLS 1.2+ এবং নিরাপদ ciphers ব্যবহার করুন MITM (Man in the Middle Attack) এড়ানোর জন্য। 25 | - [ ] `HSTS` header ব্যবহার করুন SSL এর সাছে SSL Strip আক্রমণ এড়ানোর জন্য। 26 | - [ ] Directory তালিকা দেখানো বন্ধ করুন। 27 | - [ ] ব্যক্তিগত APIs এর জন্য, শুধুমাত্র সাদা তালিকাভুক্ত IPs/hosts থেকে access গ্রহণ করুন। 28 | 29 | ## অনুমোদন 30 | 31 | ### OAuth 32 | - [ ] `redirect_uri` সব সময় সার্ভার এ যাচাই করে শুধুমাত্র সাদা তালিকাভুক্ত URLs কে গ্রহণ করবেন। 33 | - [ ] সর্বদা কোড বিনিময় করার চেষ্টা করুন, টোকেন নয় (`response_type=token` গ্রহণ করবেন না)। 34 | - [ ] OAuth অনুমোদন প্রক্রিয়া কালে CSRF আক্রমণ থেকে বাচার জন্য `state` প্যারামিটারটি সবসময় এলোমেলো hash এর সাথে বেব্যহার করবেন। 35 | - [ ] ডিফল্ট scope সংজ্ঞায়িত করুন, এবং প্রতিটি আবেদনের জন্য প্যারামিটারটি যাচাই করুন. 36 | 37 | ## ইনপুট 38 | - [ ] যথাযথ HTTP পদ্ধতি ব্যবহার করুন কাজ অনুযায়ী: `GET (পড়া)`, `POST (সৃষ্টি করা)`, `PUT/PATCH (প্রতিস্থাপন/হালনাগাদ)`, and `DELETE (মুছে ফেলা)`, এবং `405 Method Not Allowed` জবাব দেওয়া যদি resource এর সাথে উপযুক্ত না হয়। 39 | - [ ] আলাপ - আলোচনা করার সময় `content-type` টি যাচাই করুন এবং আপনার সমর্থিত বিন্যাস (যেমন, `application/xml`, `application/json`, ইত্যাদি) না হলে `406 Not Acceptable` জবাব দেওয়া। 40 | - [ ] পাঠানো তথ্য `content-type` টি যাচাই করুন এবং আপনার সমর্থিত বিন্যাস এর সাথে (যেমন, `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, ইত্যাদি)। 41 | - [ ] সাধারণ এবং সচরাচর দুর্বলতা এড়াতে ব্যবহারকারীর ইনপুট যাচাই করা (যেমন., `XSS`, `SQL-Injection`, `Remote Code Execution`, ইত্যাদি)। 42 | - [ ] সংবেদনশীল তথ্য (`credentials`, `Passwords`, `security tokens`, or `API keys`) URL এ ব্যবহার করবেন না, কিন্তু standard Authorization header ব্যবহার করবেন। 43 | - [ ] শুধুমাত্র সার্ভার এ গোপন(encryption) প্রক্রিয়া ব্যবহার করবেন। 44 | - [ ] একটি API প্রবেশপথ সেবা ব্যবহার করবেন caching সক্রিয় করতে, হার সীমা নীতি (যেমন, `Quota`, `Spike Arrest`, or `Concurrent Rate Limit`) এবং গতিশীলভাবে APIs সংস্থান স্থাপন করুন। 45 | 46 | ## প্রক্রিয়াকরণ 47 | - [ ] ভাঙ্গা authentication প্রক্রিয়া এড়াতে সবগুলো endpoints প্রমাণীকরণ(authentication) সহ কাজ করছে কিনা তা যাচাই করুন। 48 | - [ ] ব্যবহারকারীর নিজের ID ব্যবহার করা উচিত নয়। `/user/654321/orders` না ব্যবহার করে এটা `/me/orders` ব্যবহার করুন। 49 | - [ ] auto-increment ID ব্যবহার না করে, `UUID` ব্যবহার করুন। 50 | - [ ] যদি আপনি XML তথ্য parsing করছেন, তাহলে নিশ্চিত হয়ে নিন যেন entity parsing চালু না থাকে `XXE` (XML external entity attack) আক্রমণ এড়ানোর জন্য। 51 | - [ ] যদি আপনি XML, YAML অথবা অন্য কোন ভাষা anchors এবং refs দিয়ে parsing করছেন, তাহলে নিশ্চিত হয়ে নিন যেন entity expansion চালু না থাকে `Billion Laughs/XML bomb` via exponential entity expansion আক্রমণ এড়ানোর জন্য। 52 | - [ ] CDN ব্যাবহার করুন ফাইল আপলোড এর জন্য। 53 | - [ ] যদি আপনি অনেক গুলো তথ্য নিয়ে কাজ করেন তাহলে, Workers এবং Queues পটভূমিতে যত সম্ভব ব্যবহার করুন এবং তাড়াতাড়ি প্রতিক্রিয়া জানান HTTP Blocking না করার জন্য। 54 | - [ ] DEBUG মোড বন্ধ করতে ভুলবেন না। 55 | - [ ] non-executable stacks ব্যবহার করবেন যখন সম্ভব। 56 | 57 | ## আউটপুট 58 | - [ ] `X-Content-Type-Options: nosniff` header পাঠান। 59 | - [ ] `X-Frame-Options: deny` header পাঠান। 60 | - [ ] `Content-Security-Policy: default-src 'none'` পাঠান। 61 | - [ ] Fingerprinting headers গুলো সরিয়ে দিন - `X-Powered-By`, `Server`, `X-AspNet-Version`, ইত্যাদি। 62 | - [ ] আপনার প্রতিক্রিয়ায় `content-type` থাকতে বাধ্য করুন. যদি আপনি `application/json` পাঠান, তাহলে আপনার `content-type` প্রতিক্রিয়া হবে `application/json`। 63 | - [ ] সংবেদনশীল তথ্য পাঠাবেন না যেমন `credentials`, `passwords`, or `security tokens`। 64 | - [ ] অপারেশন অনুযায়ী যথাযথ status code পাঠাবেন (যেমন, `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, ইত্যাদি)। 65 | 66 | ## CI & CD 67 | - [ ] আপনার পরিকল্পনা এবং বাস্তবায়ন যাচাই করুন unit/integration tests coverage এর সাথে। 68 | - [ ] কোড পুনঃমূল্যায়ন প্রক্রিয়া ব্যবহার করুন এবং নিজের অনুমোদন উপেক্ষা করুন। 69 | - [ ] নিশ্চিত করেন যেন আপনার সেবার সবগুলো উপাদান স্থিতিশীলভাবে AV সফটওয়্যার দ্বারা স্ক্যান করা থাকে production এ যাওয়ার আগেই, বিক্রেতা লাইব্রেরি এবং অন্যান্য নির্ভরতা সহ। 70 | - [ ] ক্রমাগত নিরাপত্তা পরীক্ষা চালান (স্থির/গতিশীল বিশ্লেষণ) আপনার কোডে। 71 | - [ ] আপনার নির্ভরতা চেক করুন (দুইটাই software এবং OS) পরিচিত দুর্বলতার জন্য। 72 | - [ ] স্থাপনার জন্য একটি রোলব্যাক সমাধান পরিকল্পনা করুন। 73 | 74 | ## মনিটরিং 75 | - [ ] সমস্ত সেবা এবং উপাদানগুলির জন্য কেন্দ্রীভূত লগইনগুলো ব্যবহার করুন৷ 76 | - [ ] ট্র্যাফিক, ত্রুটি, অনুরোধ এবং প্রতিক্রিয়াগুলো নিরীক্ষণ করতে এজেন্ট ব্যবহার করুন। 77 | - [ ] SMS, Slack, Email, Telegram, Kibana, Cloudwatch, ইত্যাদির জন্য সতর্কতা ব্যবহার করুন। 78 | - [ ] আপনি কোন সংবেদনশীল তথ্য লগ করছেন না তা নিশ্চিত করুন যেমন credit cards, passwords, PINs, ইত্যাদি। 79 | - [ ] IDS অথবা IPS পদ্ধতি ব্যবহার করুন API requests এবং instances মূল্যায়ন করতে। 80 | 81 | 82 | --- 83 | 84 | ## আরও দেখুন: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - RESTful HTTP+JSON APIs নির্মাণ করার একটি দরকারী সংগ্রহ। 86 | 87 | 88 | --- 89 | 90 | # অবদান 91 | নিঃসঙ্কোচে repository টি fork করে অবদান রাখুন, কিছু পরিবর্তন করে এবং পুল অনুরোধ জমা দিয়ে নির্দ্বিধায় অবদান রাখুন। কোন প্রশ্নের জন্য আমাদের একটি ইমেল পাঠান `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-cs.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # Seznam API zabezpečení 4 | Kontrolní seznam nejdůležitějších bezpečnostních opatření při návrhu, testování a uvolňování rozhraní API. 5 | 6 | 7 | --- 8 | 9 | ## Autentizace 10 | - [ ] Nepoužívejte `Basic Auth`. Místo toho použijte standardní ověřování (např. [JWT](https://jwt.io/)). 11 | - [ ] Nevymýšlejte znovu způsoby `ověření`, `generace tokenů`, `ukládání hesel`. Držte se standardů. 12 | - [ ] Používejte u loginů funkce `Maximum Pokusů` a dočasné zablokování. 13 | - [ ] Šifrujte všecha citlivá data. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Použijte náhodný a sofistikovaný klíč (`JWT Secret`), aby bylo složité token získat přes brute-force. 17 | - [ ] Nepoužívejte algoritmy posílané v hlavičce. Vynuťte použití algoritmů na backendu (`HS256` nebo `RS256`). 18 | - [ ] Zajistěte, aby platnost tokenu (`TTL`, `RTTL`) byla co nejkratší. 19 | - [ ] Neukládejte uvnitř JWT citlivá data, mohou být následně [poměrně jednoduše] dekódovány (https://jwt.io/#debugger-io). 20 | - [ ] Neukládejte v nich příliš mnoho dat. JWT se obvykle sdílí v hlavičkách a jejich velikost je omezena. 21 | 22 | ## Přístup 23 | - [ ] Omezte počet příchozích requestů (Zahlcení) aby jste předešli DDoS/brute-force útokům. 24 | - [ ] Na straně serveru používejte protokol HTTPS s protokolem TLS 1.2+ a bezpečnými šiframi, abyste se vyhnuli útoku MITM (Man in the Middle). 25 | - [ ] Použijte hlavičku `HSTS` s protokolem SSL, abyste se vyhnuli útokům SSL Strip. 26 | - [ ] Vypněte vypisování adresářů. 27 | - [ ] U privátních API povolte přístup pouze z IP adres/hostů nastavených ve whitelistu. 28 | 29 | ## Autorizace 30 | 31 | ### OAuth 32 | - [ ] Vždy ověřujte `redirect_uri` na straně serveru, abyste povolili pouze adresy URL uvedené ve whitelistu. 33 | - [ ] Vždy se snažte vyměňovat autorizační kód, ne přístupové tokeny (nepovolujte `response_type=token`). 34 | - [ ] Použijte parametr `state` s náhodným hashem, abyste zabránili CSRF v autorizačním procesu OAuth. 35 | - [ ] Definujte výchozí rozsah a ověřte parametry tohoto rozsahu pro každou aplikaci. 36 | 37 | ## Vstupy 38 | - [ ] Použijte správné metody HTTP podle operace: `GET (čtení)`, `POST (vkládání)`, `PUT/PATCH (nahrazení/update)`, a `DELETE (smazání záznamu)`, a odpovězte `405 Method Not Allowed` pokud požadovaná metoda není vhodná pro požadovaný prostředek. 39 | - [ ] Ověřte `content-type` v hlavičce požadavku Accept (Content Negotiation), abyste povolili pouze vámi podporovaný formát (např. `application/xml`, `application/json` atd.) a v případě neshody odpovězte `406 Not Acceptable`. 40 | - [ ] Ověřte typ `content-type` odesílaných dat tak, jak je přijímáte (např. `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json` atd.). 41 | - [ ] Ověřujte uživatelské vstupy, abyste se vyhnuli běžným zranitelnostem (např. `XSS`, `SQL-Injection`, `Remote Code Execution` atd.). 42 | - [ ] Nepoužívejte v URL žádné citlivé údaje (`přihlašovací údaje`, `hesla`, `security tokeny` nebo `API klíče`), ale použijte standardní Authorization hlavičku. 43 | - [ ] Používejte pouze šifrování na straně serveru. 44 | - [ ] Pomocí služby API Gateway můžete povolit ukládání do mezipaměti, zásady pro omezení rychlosti (např. `Quota`, `Spike Arrest` nebo `Concurrent Rate Limit`) a dynamické nasazování prostředků API. 45 | 46 | ## Zpracování 47 | - [ ] Zkontrolujte, zda jsou všechny koncové body chráněny určitým ověřením přístupu, aby nedošlo k porušení procesu ověřování. 48 | - [ ] Neměla by se používat jednotlivá ID uživatelů. Místo `/user/654321/orders` použijte `/me/orders`. 49 | - [ ] Nepoužívejte auto-inkrementaci u ID. Použijte místo toho `UUID`. 50 | - [ ] Pokud zpracováváte XML data, ujistěte se, že není povoleno procházení jednotlivých entit, abyste se vyhnuli `XXE` (XML external entity attack). 51 | - [ ] Pokud zpracováváte XML, YAML nebo jakýkoli jiný jazyk s kotvami a odkazy, ujistěte se, že není povoleno rozšiřování entit, abyste se vyhnuli útokům jako `Billion Laughs/XML bomb` pomocí exponenciálního rozšiřování entit. 52 | - [ ] Pro nahrávání souborů používejte síť CDN. 53 | - [ ] Pokud pracujete s obrovským množstvím dat, použijte Workery a fronty, abyste jich co nejvíce zpracovali na pozadí, rychle vrátili odpověď, a vyhnuli se tak HTTP blokaci. 54 | - [ ] Nezapomeňte vypnout DEBUG režim. 55 | - [ ] Pokud je to možné používejte nespustitelné stacky (NX). 56 | 57 | ## Výstupy 58 | - [ ] V hlavičce odpovědi posílejte `X-Content-Type-Options: nosniff`. 59 | - [ ] V hlavičce odpovědi posílejte `X-Frame-Options: deny`. 60 | - [ ] V hlavičce odpovědi posílejte `Content-Security-Policy: default-src 'none'`. 61 | - [ ] Z hlavičky odpovědi odstraňte - `X-Powered-By`, `Server`, `X-AspNet-Version`, atd. 62 | - [ ] Vynuťte v odpovědi použití `content-type`. Pokud vrátíte `application/json`, potom `content-type` vaší odpovědi bude `application/json`. 63 | - [ ] Neposílejte v odpovědích citlivá data jako `přihlašovací údaje`, `hesla`, nebo `security tokeny`. 64 | - [ ] Posílejte správný stavový kód podle toho jak byla operace dokončena. (např. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, atd.). 65 | 66 | ## CI & CD 67 | - [ ] Zkontrolujte svůj návrh a implementaci řešení jednotkovými/integračními testy. 68 | - [ ] Používejte proces kontroly kódu a to nejlépe třetí nezávislou stranou. 69 | - [ ] Zajistěte, aby všechny součásti vašich služeb byly před nasazením do produkce staticky oskenovány antivirem, včetně všech knihoven dodavatelů a dalších součástí. 70 | - [ ] Průběžně provádějte bezpečnostní testy vašeho kódu (statickou/dynamickou analýzu). 71 | - [ ] Zkontrolujte jestli používané technologie (oboje jak software tak OS) neobsahují známé zranitelnosti. 72 | - [ ] Navrhněte pro nasazený systém možnost rollbacku. 73 | 74 | ## Monitorování 75 | - [ ] Používejte centralizované přihlašovací údaje pro všechny služby a komponenty. 76 | - [ ] Používejte agenty na monitorování veškeré komunikace, errorů, requestů, a odpovědí. 77 | - [ ] Používejte upozornění pomocí SMS, Slacku, Emailu, Telegramu, Kibany, Cloudwatche, atd. 78 | - [ ] Ujistěte se, že neukládáte do logů žádné citlivé údaje, jako čísla kreditních karet, hesla, kódy PIN atd. 79 | - [ ] Ke sledování API requestů a instancí používejte systém IDS a/nebo IPS. 80 | 81 | 82 | --- 83 | 84 | ## Viz také: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Sbírka užitečných zdrojů pro vytváření rozhraní RESTful HTTP+JSON API. 86 | 87 | 88 | --- 89 | 90 | # Příspěvek 91 | Neváhejte přispět forknutím tohoto repozitáře, provedením nějakých změn a zasláním pull requestu. V případě jakýchkoli dotazů nám napište na e-mail `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-de.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API Security Checkliste 4 | Checkliste für die wichtigsten Sicherheitsmaßnahmen beim Designen, Testen und Veröffentlichen deiner API. 5 | 6 | 7 | --- 8 | 9 | ## Authentifizierung 10 | - [ ] Verwende kein `Basic Auth`. Nutze standardisierte Authentifizierungsmethoden (bspw. JWT, OAuth). 11 | - [ ] Erfinde das Rad nicht neu für `Authentication`, `Tokengenerierung` oder `Passwort speichern`. Nutze hierfür existierende Standards. 12 | - [ ] Nutze eine `limitierte Anzahl von Anmeldeversuche` und Aussperrfunktionen (Ban, IP-Block, Permanent) im Loginprozess. 13 | - [ ] Nutze Verschlüsselung für alle sensitiven Daten. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Verwende einen per Zufall generierten, komplizierten Schlüssel (`JWT Secret`), um Brute Force Attacken gegen diesen so schwer wie möglich zu machen. 17 | - [ ] Verwende den Algorithmus des Payloads ausschließlich über das Backend, sodass dieser geheim bleibt (`HS256` oder `RS256`). 18 | - [ ] Lege einen möglichst kurzen Gültigkeitszeitraum für den Token fest (`TTL`, `RTTL`). 19 | - [ ] Speichere keine sensitiven Daten im JWT Payload, denn dieser kann [einfach entkodiert werden](https://jwt.io/#debugger-io). 20 | - [ ] Vermeiden zu viele Daten zu speichern. JWT wird normalerweise in Headern geteilt und hat eine Größenbeschränkung. 21 | 22 | ## Zugriff 23 | - [ ] Limitiere alle Requests (Throttling), um DDoS / Brute-Force Attacken zu verhindern. 24 | - [ ] Nutze HTTPS serverseitig, um MITM (Man In The Middle Attack) zu verhindern. 25 | - [ ] Setze `HSTS` (HTTP Strict Transport Security) im Header bei SSL, um SSLStrip Attacken zu verhindern. 26 | - [ ] Deaktivieren Verzeichniseinträge. 27 | - [ ] Erlauben für private APIs den Zugriff nur von IPs/Hosts auf der Whitelist. 28 | 29 | ## Autorisierung 30 | 31 | ### OAuth 32 | - [ ] Überprüfe stets die `redirect_uri` serverseitig und erlaube nur URLs aus einer Whitelist. 33 | - [ ] Frage immer mit einem Access-Code (vom initialen Request) einen Access-Token ab (verbiete `response_type=token`). 34 | - [ ] Nutze den `state` Parameter immer mit einem zufälligem Hash, um CSRF auf den OAuth Authentifizierungsprozess zu verhindern. 35 | - [ ] Definiere einen Standard-Scope und validiere alle Scope Parameter für jede Applikation. 36 | 37 | ## Input 38 | - [ ] Nutze für Requests die passenden HTTP Methoden: `GET (Lesen)`, `POST (Erzeugen)`, `PUT/PATCH (Ersetzen/Aktualisieren)`, and `DELETE (Datensatz löschen)`, und gib `405 Method Not Allowed`, wenn die angeforderte Methode nicht auf die Ressource passt. 39 | - [ ] Validiere den `content-type` im "Accept" Header der Anfrage und erlaube nur unterstützte Formate (wie `application/xml`, `application/json`, usw). Gib den Response `406 Not Acceptable` zurück, wenn keine der übergebenen Content-Typen unterstützt wird. 40 | - [ ] Validiere den `Content-Type` im Header der Anfrage für übertragene Daten (bspw. POST oder PUT) wie bspw. `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, usw. 41 | - [ ] Validiere immer alle Eingaben im Request und allen Parametern um allgemeine Angriffsmöglichkeiten zu verhindern (bspw. `XSS`, `SQL-Injection`, `Remote Code Execution`, usw). 42 | - [ ] Verwende niemals sensitive Daten (`Anmeldedaten`, `Passwörter`, `Security Tokens`, oder `API-Schlüssel`) in der URL, aber nutze den standardisierten "Authorization" Header. 43 | - [ ] Verwenden nur serverseitige Verschlüsselung. 44 | - [ ] Nutze ein API Gateway Service für Caching, Rate Limit Regeln (bspw. `Quota`, `Spike Arrest`, `Concurrent Rate Limit`) und der Bereitstellung dynamischer API Ressourcen. 45 | 46 | ## Verarbeitung 47 | - [ ] Überprüfe, ob alle Endpunkte mit einer Authentifizierung geschützt sind. 48 | - [ ] Nutzereigene Ressourcen-Ids sollten vermieden werden. Verwende `/me/orders` statt `/user/654321/orders`. 49 | - [ ] Verwende keine automatisch hochzählende IDs, sondern `UUID`, damit Ressourcen nicht einfach erraten werden können. 50 | - [ ] Beim Verarbeiten einer XML-Datei, sollte Entitätsverarbeitung deaktiviert sein, um `XXE` (XML External Entity Attacken) zu verhindern. 51 | - [ ] Beim Verarbeiten einer XML-Datei, sollte Entitätsexpansion deaktiviert sein, um `Billion Laughs/XML Bombe` zu verhindern. 52 | - [ ] Nutze CDN für Dateiuploads. 53 | - [ ] Wenn du eine große Menge an Daten verarbeiten musst, nutze Worker und Queues, um so viel wie möglich im Hintergrund zu verarbeiten und schnelle Antwortzeiten zu gewährleisten. 54 | - [ ] Vergiss nicht den DEBUG Modus zu deaktivieren. 55 | - [ ] Verwenden nicht ausführbare Stacks sofern verfügbar. 56 | 57 | ## Output 58 | - [ ] Sende `X-Content-Type-Options: nosniff` im Header. 59 | - [ ] Sende `X-Frame-Options: deny` im Header. 60 | - [ ] Sende `Content-Security-Policy: default-src 'none'` im Header. 61 | - [ ] Entferne Header wie `X-Powered-By`, `Server`, `X-AspNet-Version` usw, um eventuell veraltete Softwareversionen nicht zu verraten. 62 | - [ ] Sende immer einen `Content-Type` bei Antworten. Wenn du ein JSON lieferst gib als `Content-Type` `application/json` an. 63 | - [ ] Gib niemals sensitive Daten zurück wie `Anmeldedaten`, `Passwörter` oder `Sicherheitsschlüssel`. 64 | - [ ] Verwende immer einen passenden HTTP Statuscode je nach Status der Operation (bspw. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, usw). 65 | 66 | ## Kontinuierliche Integration (CI) & Continuous Delivery (CD) 67 | - [ ] Nutze Unit- und Integrationstest und deren Abdeckung (Test Coverage), um deine Implementierungen und Design zu kontrollieren. 68 | - [ ] Nutze einen Code Review Prozess, aber bleib sachlich. 69 | - [ ] Stelle sicher, dass alle verwendeten Komponenten (Bibliotheken und alle anderen Abhängigkeiten) noch einmal statisch von einer Anti-Virus Software überprüft wurden bevor diese in die Produktionsumgebung gehen. 70 | - [ ] Führen kontinuierlich Sicherheitstests (statische/dynamische Analyse) für Ihren Code. 71 | - [ ] Überprüfen Ihre Abhängigkeiten (Software und Betriebssystem) auf bekannte Schwachstellen. 72 | - [ ] Stelle sicher, dass du im Fehlerfall auch schnell wieder den vorherigen Stand einspielen kannst (Rollback). 73 | 74 | ## Überwachung 75 | - [ ] Verwenden Sie zentralisierte Logins für alle Dienste und Komponenten. 76 | - [ ] Verwenden Sie Agenten, um den gesamten Datenverkehr, Fehler, Anfragen und Antworten zu überwachen. 77 | - [ ] Verwenden Sie Benachrichtigungen für SMS, Slack, E-Mail, Telegramm, Kibana, Cloudwatch, usw. 78 | - [ ] Stellen Sie sicher, dass Sie keine sensiblen Daten wie Kreditkarten, Passwörter, PINs, usw protokollierst. 79 | - [ ] Verwenden Sie ein IDS-System und/oder ein IPS-System um die Anforderungen und Instanzen Ihrer API zu überwachen. 80 | 81 | 82 | --- 83 | 84 | ## Siehe auch: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Eine Sammlung nützlicher Ressourcen für den Aufbau von RESTful HTTP+JSON APIs. 86 | 87 | 88 | --- 89 | 90 | # Contribution 91 | Du kannst gerne etwas beisteuern, indem du einen Fork dieses Repositorys erstellst, Änderungen vornimmst und dann einen Pull Request anlegst. Bei Fragen schick uns eine E-Mail an `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-el.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API λίστα ελέγχου ασφαλείας 4 | Λίστα με τα πιο σημαντικά μέτρα ασφαλείας στον σχεδιασμό, έλεγχο, και την έκδοση του API σας. 5 | 6 | 7 | --- 8 | 9 | ## Επικύρωση ασφαλείας (Authentication) 10 | - [ ] Μη χρησιμοποιήτε `Basic Auth`. Χρησιμοποιήστε standard authentication (π.χ. [JWT](https://jwt.io/), [OAuth](https://oauth.net/)). 11 | - [ ] Μην προσπαθήσετε να επανεφεύρετε τον τροχό για `Authentication`, `token generation`, `password storage`. Χρησιμοποιήστε ήδη υπάρχων βιβλιοθήκες. 12 | - [ ] Χρησιμοποιήστε `Max Retry` και jail features κατά τη σύνδεση (Login). 13 | - [ ] Χρησιμοποιήστε κρυπτογράφηση (encryption) για όλα τα σημαντικά δεδομένα. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Χρησιμοποιήστε τυχαίο περίπλοκο κλειδί (`JWT Secret`) για να γίνει αρκετά δύσκολο να αποκρυπτογραφηθεί με brute forcing. 17 | - [ ] Μη χρησιμοποιήτε/αφαιρήτε τον αλγόριθμο απο το payload. Ο αλγόριθμος πρέπει να πραγματοποιήτε στο backend (`HS256` ή `RS256`). 18 | - [ ] Κάντε το token να λήγει (token expiration) (`TTL`, `RTTL`) όσο πιο σύντομα γίνεται. 19 | - [ ] Μη καταχωρείτε ευαίσθητα δεδομένα στο JWT payload, μπορεί να αποκρυπτογραφηθεί εύκολα [easily](https://jwt.io/#debugger-io). 20 | - [ ] Αποφύγετε την αποθήκευση πάρα πολλών δεδομένων. JWT είναι συνήθως κοινόχρηστο σε headers και έχουν όριο μεγέθους. 21 | 22 | ## Πρόσβαση (Access) 23 | - [ ] Περιορίστε τα αιτήματα (requests) (Throttling) για να αποφύγετε επιθέσεις DDoS / brute-force. 24 | - [ ] Χρησιμοποιήστε HTTPS στο server side για να αποφύγετε επιθέσεις MITM (Man in the Middle Attack). 25 | - [ ] Χρησιμοποιήστε `HSTS` κεφαλίδα (header) με SSL για να αποφύγετε SSL Strip επιθέσεις. 26 | - [ ] Απενεργοποιήστε τις καταχωρίσεις directory. 27 | - [ ] Για ιδιωτικά API, επιτρέπεται η πρόσβαση μόνο από IP/κεντρικούς στη λίστα επιτρεπόμενων. 28 | 29 | ## Authorization 30 | 31 | ### OAuth 32 | - [ ] Πάντα να επαληθεύετε το `redirect_uri` στο server-side και επιτρέπετε μόνο whitelisted URLs. 33 | - [ ] Πάντα να προσπαθήτε να ανταλλάσετε auth code και όχι tokens (μην επιτρέπετε `response_type=token`). 34 | - [ ] Χρησιμοποιήστε `state` παράμετρο με τυχαίο περίπλοκο κλειδί (hash) για να αποτρέψετε CSRF κατα τη διάρκεια της OAuth authentication διαδικασίας. 35 | - [ ] Ορίστε το προεπιλεγμένο πεδίο (default scope), και επικυρώστε τις παραμέτρους πεδίου (scope parameters) για κάθε εφαρμογή. 36 | 37 | ## Είσοδος δεδομένων (Input) 38 | - [ ] Χρησιμοποιήστε την κατάλληλη HTTP μέθοδο σύμφωνα με τη λειτουργία που χρειάζεστε: `GET (read)`, `POST (create)`, `PUT/PATCH (replace/update)`, και `DELETE (για διαγραφή αρχείου)`, και απαντήστε με `405 Method Not Allowed` εάν η ζητούμενη μέθοδος δεν είναι κατάλληλη για την αιτούμενη εφαρμογή. 39 | - [ ] Επικυρώστε `content-type` στη ζητούμενη Accept κεφαλίδα (Content Negotiation) για να επιτρέψετε μόνο το format που υποστηρίζετε (π.χ. `application/xml`, `application/json`, κτλ.) και απαντήστε με `406 Not Acceptable` εάν δεν το υποστηρίζετε. 40 | - [ ] Επικυρώστε `content-type` δεδομένα που στέλνετε, με τον ίδιο τρόπο όπως τα δέχεστε (π.χ. `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, κτλ.). 41 | - [ ] Επικυρώστε την οποιαδήποτε είσοδο δεδομένων απο τους χρήστες, για να αποφύγετε τα κοινά κενά ασφαλείας (π.χ. `XSS`, `SQL-Injection`, `Remote Code Execution`, κτλ.). 42 | - [ ] Μη χρησιμοποιήτε ευαίσθητα δεδομένα (`credentials`, `Passwords`, `security tokens`, ή `API keys`) στο URL, αλλά χρησιμοποιήστε τη κοινή Authorization κεφαλίδα (standard Authorization header). 43 | - [ ] Χρησιμοποιήστε μόνο κρυπτογράφηση από την πλευρά του διακομιστή. 44 | - [ ] Χρησιμοποιήστε API Gateway service για να ενεργοποιήσετε caching, Rate Limit policies (π.χ. `Quota`, `Spike Arrest`, ή `Concurrent Rate Limit`) και κάντε deploy APIs resources δυναμικά. 45 | 46 | ## Επεξεργασία (Processing) 47 | - [ ] Ελέγξτε ότι όλα τα endpoints είναι προστατευμένα πίσω από επικύρωση ασφαλείας(authentication) για να αποφύγετε προβλήματα λανθασμένης επικύρωσης (broken authentication process). 48 | - [ ] Μη χρησιμοποιήτε το ID των χρηστών. Χρησιμοποιήστε `/me/orders` αντί `/user/654321/orders`. 49 | - [ ] Μη χρησιμοποιήτε την αυτόματη αύξηση των IDs. Χρησιμοποιήστε `UUID` αντι αυτου. 50 | - [ ] Εάν επεργάζεστε XML αρχεία, σιγουρευτείτε ότι το entity parsing δεν είναι ενεργοποιημένο, για να αποφύγετε `XXE` (επίθεση XML external entity). 51 | - [ ] Εάν επεργάζεστε XML αρχεία, σιγουρευτείτε ότι το entity expansion δεν είναι ενεργοποιημένο, για να αποφύγετε `Billion Laughs/XML bomb` δια μέσου exponential entity expansion επίθεσης. 52 | - [ ] Χρησιμοποιήστε CDN για την φόρτωση αρχείων (file uploads). 53 | - [ ] Εάν επεξεργάζεστε μεγάλο αριθμο δεδομένων, χρησιμοποιήστε Workers και Queues για να γίνετε η επεξεργασία στο background και να γίνεται η επιστροφή απάντησης πολύ πιο γρήγορα, αποφεύγοντας HTTP Blocking. 54 | - [ ] Μην ξεχνάτε να απενεργοποιήσετε το DEBUG mode. 55 | - [ ] Χρησιμοποιήστε μη εκτελέσιμες στοίβες όταν είναι διαθέσιμες. 56 | 57 | ## Αποστολή/Επιστροφή δεδομένων (Output) 58 | - [ ] Αποστέλετε `X-Content-Type-Options: nosniff` κεφαλίδα (header). 59 | - [ ] Αποστέλετε `X-Frame-Options: deny` κεφαλίδα (header). 60 | - [ ] Αποστέλετε `Content-Security-Policy: default-src 'none'` κεφαλίδα (header). 61 | - [ ] Αφαιρέστε fingerprinting κεφαλίδεs (headers) - `X-Powered-By`, `Server`, `X-AspNet-Version`, κτλ. 62 | - [ ] Εξαναγκάστε το `content-type` να υπάρχει στην απάντηση (response), εάν η απάντηση είναι `application/json` τότε η απάντηση `content-type` πρέπει να είναι `application/json`. 63 | - [ ] Μην επιστρέφετε ευαίσθητα δεδομένα, όπως: `credentials`, `Passwords`, ή `security tokens`. 64 | - [ ] Επιστρέψτε τον κατάλληλο κωδικό κατάστασης σύμφωνα με τη διαδικασία που ολοκληρώθηκε. (π.χ. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, κτλ.). 65 | 66 | ## CI & CD 67 | - [ ] Ελέγξτε το σχεδιασμό και την κατάσταση της εφαρμογή σας με επαρκή κάλυψη τεστ Unit / integration. 68 | - [ ] Χρησιμοποιήτε code review διαδικασίες και μη δέχεστε self-approval απο την ομάδα. 69 | - [ ] Εξασφαλίστε ότι όλα τα στοιχέια των υπηρεσιών σας περνούν απο στατικό έλεγχο με AV software πριν τα αναρτήσετε στο production, συμπεριλαμβανομένου οποιασδήποτε εξωτερικής βιβλιοθήκης που μπορει να χρησιμοποιήτε. 70 | - [ ] Εκτελείτε συνεχώς δοκιμές ασφαλείας (στατική/δυναμική ανάλυση) στον κώδικά σας. 71 | - [ ] Ελέγξτε τις εξαρτήσεις σας (τόσο το λογισμικό όσο και το λειτουργικό σύστημα) για γνωστά τρωτά σημεία. 72 | - [ ] Σχεδιάστε rollback διαδικασίες για deployments. 73 | 74 | ## Monitoring 75 | - [ ] Use centralized logins for all services and components. 76 | - [ ] Use agents to monitor all traffic, errors, requests, and responses. 77 | - [ ] Use alerts for SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Ensure that you aren't logging any sensitive data like credit cards, passwords, PINs, etc. 79 | - [ ] Use an IDS and/or IPS system to monitor your API requests and instances. 80 | 81 | 82 | --- 83 | 84 | ## Δείτε επίσης: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Λίστα με χρήσιμες πληροφορίες για τον σχεδιασμό RESTful HTTP+JSON APIs. 86 | 87 | 88 | --- 89 | 90 | # Συνεισφορά 91 | Μη διστάσετε να συμβάλλετε με το να κάνετε forking αυτό το repository, κάνοντας αλλαγές και υποβάλλοντας pull requests. Για οποιεσδήποτε ερωτήσεις στείλτε μας ένα email στο `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-es.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # Lista de seguridad en APIs 4 | Lista de las contramedidas de seguridad más importantes en cuanto al diseño, testing y publicación de tu API. 5 | 6 | 7 | --- 8 | 9 | ## Autenticación 10 | - [ ] No uses `Basic Auth` Usa autenticación estándar (e.g. JWT, OAuth). 11 | - [ ] No reinventes la rueda en `autenticación`, `generación de tokens`, `almacenamiento de contraseñas`. Usa los estándares. 12 | - [ ] Usa políticas de límite de reintentos (`Max Retry`) y funcionalidades de jailing en el Login. 13 | - [ ] Usa encriptación en toda la información que sea sensible. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Usa claves aleatorias complejas (`JWT Secret`) para dificultar los ataques por fuerza bruta. 17 | - [ ] No extraigas el algoritmo del contenido. Fuerza el algoritmo en el backend (`HS256` o `RS256`). 18 | - [ ] Haz que la expiración del token (`TTL`, `RTTL`) sea tan corta como sea posible. 19 | - [ ] No almacenes información sensible en el contenido del JWT, puede ser descodificado [fácilmente](https://jwt.io/#debugger-io). 20 | - [ ] Evita almacenar datos muy grandes o crecientes. JWT se transmite en las headers y éstas tienen un tamaño máximo. 21 | 22 | ## Acceso 23 | - [ ] Limita las peticiones (`Throttling`) para prevenir ataques DDoS y de fuerza bruta. 24 | - [ ] Usa HTTPS en el lado del servidor para evitar ataques MITM (Man In The Middle Attack). 25 | - [ ] Usa la cabecera `HSTS` con SSL para evitar SSL Strip attack. 26 | - [ ] Desactive las listados de directorios. 27 | - [ ] Para las API privadas, permita el acceso solo desde hosts/IP incluidos en la lista blanca. 28 | 29 | ## Autorización 30 | 31 | ### OAuth 32 | - [ ] Siempre valida `redirect_uri` en el lado del servidor para permitir sólo ciertas URLs. 33 | - [ ] Trata siempre de intercambiar código y no tokens (no permitas `response_type=token`). 34 | - [ ] Usa el parámetro `state` con un hash aleatorio para prevenir CSRF en el proceso de autenticación OAuth. 35 | - [ ] Define el ámbito (`scope`) por defecto, y valida los parámetros de ámbito para cada aplicación. 36 | 37 | ## Entradas 38 | - [ ] Usa el método HTTP apropiado a cada operación: `GET (lectura)`, `POST (creación)`, `PUT/PATCH (reemplazo/actualización)`, y `DELETE (borrado)`, y responde con `405 Method Not Allowed` si el método en la petición no es apropiado para el recurso. 39 | - [ ] Valida el `content-type` en la cabecera `Accept` de las peticiones (Content Negotiation), para permitir sólo los formatos soportados (e.g. `application/xml`, `application/json`, etc) y responde con `406 Not Acceptable` si no hay coincidencias. 40 | - [ ] Valida el `content-type` de información enviada en base a la que aceptes (e.g. `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, etc). 41 | - [ ] Valida las entradas que realizan los usuarios para evitar ataques comunes (e.g. `XSS`, `SQL-Injection`, `Remote Code Execution`, etc). 42 | - [ ] No utilices información sensible (`credentials`, `Passwords`, `security tokens`, o `API keys`) en la URL, en su lugar usa la cabecera estándar `Authorization`. 43 | - [ ] Use solo cifrado del lado del servidor. 44 | - [ ] Usa un servicio de API Gateway para permitir almacenamiento en caché (caching), límite de peticiones (Rate Limit), Spike Arrest y el despliegue de APIs dinámicamente. 45 | 46 | ## Procesamiento 47 | - [ ] Valida que todos los endpoints estén protegidos con autenticación para evitar romper el proceso de autenticación. 48 | - [ ] Debes evitar los recursos bajo un ID de usuario. Usa `/me/orders` en lugar de `/user/654321/orders`. 49 | - [ ] No uses IDs auto incrementales. Usa `UUID` en su lugar. 50 | - [ ] Si estas procesando XML, asegúrate de deshabilitar el procesamiento de entidades para evitar ataques `XXE` (XML external entity attack). 51 | - [ ] Si estas procesando XML, YAML o algún otro lenguaje con soporte para anchors y referencias, asegúrate de deshabilitar la expansión de entidades, para evitar un ataque `Billion Laughs/XML bomb` via expansión exponencial de entidades. 52 | - [ ] Utiliza CDN para subidas de ficheros. 53 | - [ ] Si lidias con grandes cantidades de información, utiliza Workers y Colas para procesar tanto cómo sea posible en segundo plano, y devuelve una respuesta rápido para evitar un bloqueo HTTP. 54 | - [ ] No olvides deshabilitar el modo Debug. 55 | - [ ] Utilice stacks no ejecutables cuando estén disponibles. 56 | 57 | ## Salidas 58 | - [ ] Envía la cabecera `X-Content-Type-Options: nosniff`. 59 | - [ ] Envía la cabecera `X-Frame-Options: deny`. 60 | - [ ] Envía la cabecera `Content-Security-Policy: default-src 'none'`. 61 | - [ ] Elimina cabeceras que dejen huellas - `X-Powered-By`, `Server`, `X-AspNet-Version` etc. 62 | - [ ] Fuerza `content-type` para tus respuestas, si devuelves un `json` entonces tu `content-type` es `application/json`. 63 | - [ ] No devuelvas información sensible cómo `credenciales`, `contraseñas`, `tokens de seguridad`. 64 | - [ ] Devuelve el código HTTP acorde a la operación completada. (e.g. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, etc). 65 | 66 | ## CI & CD 67 | - [ ] Audita tu diseño e implementación con tests unitarios/integración y test coverage. 68 | - [ ] Usa procesos de revisión de código y evita la auto aprobación. 69 | - [ ] Asegura que todos los componentes de tus servicios se escanean estáticamente con un software AV antes de ir a producción, incluyendo librerías de terceros y dependencias. 70 | - [ ] Ejecute continuamente pruebas de seguridad (análisis estático/dinámico) en su código. 71 | - [ ] Verifique sus dependencias (tanto software como sistema operativo) en busca de vulnerabilidades conocidas. 72 | - [ ] Diseña un proceso de `rollback` para tus `deploys`. 73 | 74 | ## Monitorear 75 | - [ ] Usa logins centralizados para todos los servicios y componentes. 76 | - [ ] Usa agentes para monitorear todo el tráfico, errores, solicitudes, y respuestas. 77 | - [ ] Usa alertas para SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Asegúrese de no registrar datos confidenciales, como tarjetas de crédito, contraseñas, PIN, etc. 79 | - [ ] Use un sistema IDS y/o IPS para monitorear las solicitudes e instancias de su API. 80 | 81 | 82 | --- 83 | 84 | ## Ver también: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Una colección de recursos útiles para la creación de APIs RESTful HTTP+JSON. 86 | 87 | 88 | --- 89 | 90 | # Contribución 91 | Siéntete libre de contribuir haciendo un fork de éste repositorio, haciendo cambios, y enviando pull requests. Para cualquier pregunta déjanos un email en `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-fa.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 |
4 | 5 | # چک‌لیست امنیتی API 6 | چک‌لیستی از مهم‌ترین کارهای لازم برای حفظ امنیت در زمان طراحی، تست و انتشار API. 7 | 8 | --- 9 | 10 | ## احراز هویت 11 | - [ ]       از `Basic Auth` یا همان `اصالت‌سنجی برای دسترسی‌های اولیه` استفاده نکنید. به جای آن از روش‌های استاندارد احراز هویت استفاده کنید (مثلا [JWT](https://jwt.io/) یا [OAuth](https://oauth.net/)). 12 | - [ ]       برای کارهایی مثل `احراز هویت`، `تولید توکن` و `ذخیره پسوورد` چرخ را دوباره اختراع نکنید. از استانداردها استفاده کنید. 13 | - [ ]       برای لاگین محدودیت‌های `تعداد ماکسیمم تلاش مجدد` و تعداد دفعات ورود را قرار بدید. 14 | - [ ]       همه‌ی داده‌های حساس را رمزگذاری کنید. 15 | 16 | ### JWT (JSON Web Token) 17 | - [ ]       از یک کلید پیچیده‌ی تصادفی برای `JWT Secret` استفاده کنید تا حمله‌ی بروت‌فورس به توکن بسیار سخت باشد. 18 | - [ ]       الگوریتم را از هدر استخراج نکنید. در بک‌اند الگوریتم را تحمیل کنید (`HS256` یا `RS256`). 19 | - [ ]       انقضای توکن (`TTL` یا `RTTL`) را تا حد ممکن کوتاه کن. 20 | - [ ]       اطلاعات حساس را در پی‌لود JWT ذخیره نکنید چون [به راحتی](https://jwt.io/#debugger-io) قابل رمزگشایی است. 21 | - [ ]       از ذخیره بیش از حد داده ها خودداری کنید. JWT معمولاً در هدر به اشتراک گذاشته می شود و محدودیت اندازه دارند. 22 | 23 | ## دسترسی 24 | - [ ]       رکوئست‌ها را محدود کنید (Throttling) تا از حملات DDos یا بروت‌فورس جلوگیری شود. 25 | - [ ]       در سمت سرور از HTTPS استفاده کنید تا از حملات مرد میانی جلوگیری شود. 26 | - [ ]       از هدر `HSTS` استفاده کنید تا از حمله‌ی SSL Strip جلوگیری شود. 27 | - [ ]       لیست های دایرکتوری را خاموش کنید. 28 | - [ ]       برای APIهای خصوصی، فقط از IPها/میزبانهای لیست سفید اجازه دسترسی داشته باشید. 29 | 30 | ## Authorization 31 | 32 | ### OAuth 33 | - [ ]       همیشه `redirect_uri` را در سمت سرور اعتبارسنجی کنید تا تنها به URLهای مجاز اجازه داده شود. 34 | - [ ]       همیشه تلاش کنید تا code را به جای token تبادل کنید (اجازه `response_type=token` را ندهید). 35 | - [ ]       از پارامتر `state` با یک هش تصادفی استفاده کنید تا از CSRF روی پروسه‌ی احراز هویت OAuth جلوگیری کنید. 36 | - [ ]       مقدار scope پیش‌فرض را تعریف کنید و پارامترهای scope را برای هر اپلیکیشن اعتبارسنجی کنید. 37 | 38 | ## ورودی 39 | - [ ]       از متد HTTP مناسب با توجه به نوع عملیات استفاده کنید: `GET` برای خواندن، `POST` برای ایجاد کردن، `PUT/PATCH` برای جایگزین یا بروزرسانی و `DELETE` برای حذف یک رکورد، و در صورتی‌که متد درخواستی برای منبع درخواست‌شده مناسب نباشد با `405 Method Not Allowed` پاسخ بدهید. 40 | - [ ]       مقدار `content-type` را در هدر Accept رکوئست (مذاکره محتوا یا Content Negotiation) اعتبارسنجی کنید تا فقط به فرمت‌های مورد پشتیبانی اجازه داده شود (مثلا `application/xml`، `application/json` و ...). و در صورت عدم تطابق با یک پاسخ `406 Not Acceptable` پاسخ دهید. 41 | - [ ]       مقدار `content-type` در داده‌ی پست‌شده را اعتبارسنجی کنید (مثلا `application/x-www-form-urlencoded`، `multipart/form-data`، `application/json` و ...). 42 | - [ ]       ورودی کاربر را اعتبارسنجی کنید تا از آسیب‌پذیری‌های معمول جلوگیری شود (مثلا `XSS`، `SQL-Injection` و `Remote Code Execution`). 43 | - [ ]       هیچ داده‌ی حساسی مثل (داده‌های اعتبارسنجی، پسوورد‌ها، توکن‌های امنیتی یا کلید‌های API) را داخل URL قرار ندهید و از هدر Authorization استاندارد استفاده کنید. 44 | - [ ]       فقط از رمزگذاری سمت سرور استفاده کنید. 45 | - [ ]       از یک سرویس API Gateway استفاده کنید تا کش‌کردن و سیاست‌های Rate Limit (مثلا `Quota`، `Spike Arrest` یا `Concurrent Rate Limit`) فعال شوند و منابع APIها را به صورت داینامیک دپلوی کنید. 46 | 47 | ## پردازش 48 | - [ ]       چک کنید که تمامی endpointها توسط احراز هویت محافظت شوند تا از پروسه‌ی احراز هویت ناقص جلوگیری شود. 49 | - [ ]       از استفاده از ID ریسورس خود کاربر اجتناب کنید. به جای `user/654321/orders` از `/me/orders` استفاده کنید. 50 | - [ ]       از IDهای auto-increment استفاده نکنید. به جای آن از `UUID` استفاده کنید. 51 | - [ ]       اگر فایل‌های XML را parse می‌کنید مطمئن شوید تا entity parsing غیرفعال باشد تا از `XXE` (XML External entity attack) جلوگیری شود. 52 | - [ ]       اگر فایل‌های XML، YAML یا هر زبان دیگری را با استفاده از anchor ها و ref ها parse می‌کنید، مطمئن شوید تا entity expansion غیرفعال باشد تا از `Billion Laughs/XML bomb` توسط exponential entity expansion attack جلوگیری شود. 53 | - [ ]       از یک CDN برای آپلودهای فایل استفاده کنید. 54 | - [ ]       اگر با مقادیر بسیار حجیمی از داده سر و کار دارید، از Workerها و Queueها استفاده کنید تا حد الامکان پردازش در بک‌گراند انجام شود و سریع پاسخ را برگردانید تا از HTTP Blocking جلوگیری شود. 55 | - [ ]       خاموش کردن حالت DEBUG را فراموش نکنید. 56 | - [ ]       در صورت وجود از پشته های غیر قابل اجرا استفاده کنید. 57 | 58 | ## خروجی 59 | - [ ]       هدر `X-Content-Type-Options: nosniff` را ارسال کنید. 60 | - [ ]       هدر `X-Frame-Options: deny` را ارسال کنید. 61 | - [ ]       هدر `'Content-Security-Policy: default-src 'none` را ارسال کنید. 62 | - [ ]       هدرهایی که به نوعی اثرانگشت برجای می‌گذارند را حذف کنید، مثلا `X-Powered-By`، `Server` و ‍`X-AspNet-Version`. 63 | - [ ]       مقدار `content-type` را برای پاسخ اجباری کنید. اگر `application/json` برمیگردانید، پس `content-type` پاسخ، `application/json` است. 64 | - [ ]       اطلاعات حساس مثل `داده‌های اعتبارسنجی`، `رمز های عبور` و `توکن‌های امنیتی` را برنگردانید. 65 | - [ ]       با توجه به عملیات انجام‌شده، status code مناسب را برگردانِد. مثلا `200 OK`، `400 Bad Request`، `401 Unauthorized` و `405 Method Not Allowed`. 66 | 67 | ## CI & CD 68 | - [ ]       طراحی و پیاده سازی خودتان را با پوشش تست‌های unit/integration بازرسی کنید. 69 | - [ ]       از یک پروسه‌ی مرور کد استفاده کنید و خود-تاییدی را نادیده بگیرید. 70 | - [ ]       مطمئن شوید تا تمامی اجزای سرویس‌هایتان، شامل کتابخانه‌های استفاده‌شده و دیگر وابستگی‌ها، قبل از انتشار در حالت production، به طور ایستا توسط نرم‌افزارهای آنتی‌ویروس اسکن شده‌اند. 71 | - [ ]       به صورت پیوسته روی کدتان تست‌های امنیتی (آنالیز ایستا و پویا)، اجرا کنید. 72 | - [ ]       وابستگی‌هایتان (نرم افزار و سیستم عامل، هردو) را برای آسیب‌پذیری‌های شناخته شده، چک کنید. 73 | - [ ]       برای دپلوی‌هایتان، یک راه‌حل با قابلیت عقبگرد (rollback) طراحی کنید. 74 | 75 | ## Monitoring 76 | - [ ]       از لاگین های متمرکز برای همه سرویس ها و مؤلفه ها استفاده کنید. 77 | - [ ]       از agent ها برای مانیتور همه ترافیک, خطاها, درخواست‌ها و پاسخ‌ها استفاده کنید. 78 | - [ ]       از alert ها برای اس ام اس, Slack, ایمیل, Telegram, Kibana, Cloudwatch و غیره استفاده کنید. 79 | - [ ]       اطمینان حاصل کنید که هیچ گونه داده حساسی مانند کارت های اعتباری، رمزهای عبور، پین ها و غیره را ثبت نمی کنید. 80 | - [ ]       از یک سیستم IDS و/یا IPS برای مانیتور درخواست ها API و نمونه های خود استفاده کنید. 81 | 82 | 83 | --- 84 | 85 | ## نگاهی بیاندازید به: 86 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - یک مجموعه از منابع مفید برای ساختن APIهای RESTful با HTTP و JSON - 87 | 88 | 89 | --- 90 | 91 | # مشارکت 92 | برای همکاری و کمک می‌توانید به راحتی این مخزن را fork کنید، تغییرات مورد نظرت را اعمال کنید و یک pull request ثب کنید. اگر سوالی داشتید به آدرس `team@shieldfy.io` ایمیل بزنید. 93 |
94 | -------------------------------------------------------------------------------- /README-fr.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API Security Checklist 4 | Checklist des points de sécurité les plus importants lors de la conception, du test et de la mise en production de votre API. 5 | 6 | 7 | --- 8 | 9 | ## Authentification 10 | - [ ] Ne pas utiliser une authentification basique http (`Basic Auth`) mais plutôt un standard d'authentification (tel que JWT, OAuth). 11 | - [ ] Ne pas réinventer la roue lors de `l'authentification`, `la génération de token`, `le stockage de mots de passe` mais utiliser les standards. 12 | - [ ] Lors de l'authentification, mettre en place les fonctionnalités de bannissement (`jail`) avec des seuils de tentatives maximales (`Max Retry`). 13 | - [ ] Chiffrer toutes les données sensibles. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Utiliser des clés aléatoires complexes (`JWT Secret`) pour rendre les attaques par force brute difficiles. 17 | - [ ] Ne pas extraire l'algorithme du payload. Imposer l'algorithme côté serveur (`HS256` ou `RS256`). 18 | - [ ] Rendre la durée de vie des tokens (`TTL`, `RTTL`) aussi courte que possible. 19 | - [ ] Ne pas stocker des informations sensibles du payload JWT, son décryptage est très [simple](https://jwt.io/#debugger-io). 20 | - [ ] Éviter de stocker trop de données. JWT est généralement partagé dans les en-têtes et ils ont une limite de taille. 21 | 22 | ## Accès 23 | - [ ] Limiter le nombre de requêtes (limitation de bande passante) pour éviter les dénis de service et les attaques par force brute. 24 | - [ ] Utiliser le protocole HTTPS côté serveur afin d'éviter les attaques de l'homme du milieu (MITM). 25 | - [ ] Utiliser les entêtes `HSTS` avec SSL pour éviter les attaques SSL Strip. 26 | - [ ] Désactiver les listes du répertoires. 27 | - [ ] Pour les API privées, n'autorisez l'accès qu'à partir d'adresses IP/hôtes sur liste blanche. 28 | 29 | ## Autorisation 30 | 31 | ### OAuth 32 | - [ ] Toujours valider la redirection d'uri (`redirect_uri`) côté serveur afin d'accéder uniquement aux URLs autorisées. 33 | - [ ] Toujours utiliser un échange de code plutôt que des tokens (ne pas autoriser `response_type=token`). 34 | - [ ] Utiliser le paramètre d'état (`state`) avec un hash aléatoire pour prévenir les CSRF sur le processus d'authentification OAuth. 35 | - [ ] Définir la portée par défaut et valider le paramètre de portée pour chaque application. 36 | 37 | ## Entrées 38 | - [ ] Utiliser la bonne méthode en fonction de l'opération, `GET (lire)`, `POST (créer)`, `PUT (remplacer/mettre à jour)` et `DELETE (pour supprimer un enregistrement)`. 39 | - [ ] Valider le `content-type` dans l'en-tête HTTP des requêtes (négociation de contenu) pour n'autoriser que les formats supportés (e.g. `application/xml`, `application/json`, etc…) et renvoyer une réponse `406 Not Acceptable` si ça ne correspond pas. 40 | - [ ] Valider le `content-type` des données postées avec celles acceptées (e.g. `application/x-www-form-urlencoded`, `multipart/form-data, application/json`, etc…). 41 | - [ ] Valider les entrées utilisateur pour éviter les vulnérabilités classiques (e.g. `XSS`, `SQL-Injection`, `Remote Code Execution`, etc…). 42 | - [ ] N'utiliser aucune donnée sensible (`identifiants`, `mots de passe`, `tokens de sécurité`, ou `clés d'API`) dans l'URL, mais utiliser les en-têtes d'autorisations standards. 43 | - [ ] Utiliser uniquement le chiffrement côté serveur. 44 | - [ ] Utiliser un service de passerelle d'API afin d'obtenir la mise en cache, une limitation de la saturation des ressources, la gestion des pics d'activités et le déploiement automatique des ressources. 45 | 46 | ## Traitement 47 | - [ ] Vérifier qu'aucun point d'entrée dans l'application n'échappe à l'authentification. 48 | - [ ] Éviter l'utilisation des identifiants de ressource utilisateur. Préférer `/me/orders` au lieu de `/user/654321/orders` 49 | - [ ] Ne pas utiliser d'identifiant auto-incrémenté mais plutôt des `UUID`. 50 | - [ ] Dans le cas du traitement de fichiers XML, être sûr que l'analyse des entités n'est pas activée par défaut afin d'éviter les failles `XXE` (XML external entity attack). 51 | - [ ] Dans le cas du traitement de fichiers XML, être sûr que l'expansion des entités n'est pas activée par défaut afin d'éviter les `Billion Laughs/XML bomb` (exponential entity expansion attack). 52 | - [ ] Utiliser les réseaux de diffusion de contenu (CDN) pour l'envoie de fichier. 53 | - [ ] Dans le cas du traitement d'importantes quantités de données, utiliser des Workers et des Queues pour retourner les réponses rapidement et éviter un blocage HTTP. 54 | - [ ] Ne pas oublier de désactiver le mode DEBUG. 55 | - [ ] Utiliser des piles non exécutables lorsqu'elles sont disponibles. 56 | 57 | ## Sorties 58 | - [ ] Envoyer l'en-tête `X-Content-Type-Options: nosniff`. 59 | - [ ] Envoyer l'en-tête `X-Frame-Options: deny`. 60 | - [ ] Envoyer l'en-tête `Content-Security-Policy: default-src 'none'`. 61 | - [ ] Supprimer les en-têtes d'empreinte - `X-Powered-By`, `Server`, `X-AspNet-Version`, etc… 62 | - [ ] Imposer le `content-type` des réponses, si la réponse est du `application/json` alors l'en-tête `content-type` est `application/json`. 63 | - [ ] Ne pas retourner de données sensibles dans les réponses `identifiants`, `mots de passe`, `tokens de sécurité`. 64 | - [ ] Retourner un code de statuts en adéquation avec l'opération effectuée. (e.g. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, etc…). 65 | 66 | ## CI & CD 67 | - [ ] Vérifiez votre conception et votre implémentation avec une couverture des tests unitaires et d'intégration. 68 | - [ ] Utilisez un processus de revue de code et ignorez l'auto-approbation. 69 | - [ ] Assurez-vous que tous les composants de vos services sont scannés par un logiciel anti-virus avant la mise en production, ainsi que les bibliothèques tierces et autres dépendances. 70 | - [ ] Exécutez en continu des tests de sécurité (analyse statique/dynamique) sur votre code. 71 | - [ ] Vérifiez vos dépendances (logiciel et système d'exploitation) pour les vulnérabilités connues. 72 | - [ ] Concevez une solution de rollback pour les déploiements. 73 | 74 | ## Surveillance 75 | - [ ] Utilisez des connexions centralisées pour tous les services et composants. 76 | - [ ] Utilisez des agents pour surveiller tout le trafic, les erreurs, les requêtes, et les réponses. 77 | - [ ] Utilisez des alertes pour SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Assurez-vous que vous n'enregistrez aucune donnée sensible comme les cartes de crédit, les mots de passe, les codes PIN, etc. 79 | - [ ] Utilisez un système IDS et/ou IPS pour surveiller vos requêtes et instances d'API. 80 | 81 | 82 | --- 83 | 84 | ## Voir également : 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Une collection de ressources utiles pour créer des API RESTful HTTP+JSON. 86 | 87 | 88 | --- 89 | 90 | # Contribution 91 | N'hésitez pas à contribuer en forkant ce dépôt, faire quelques changements, et soumettre une pull request. Pour toute question, envoyez un courriel à `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-hi.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API सुरक्षा जांच-सूची 4 | अपने API को डिजाइन करने, परीक्षण करने और जारी करने के दौरान सबसे महत्वपूर्ण सुरक्षा प्रतिवाद की जांच सूची| 5 | 6 | 7 | --- 8 | 9 | ## प्रमाणीकरण (Authentication) 10 | - [ ] `बेसिक एथ` का उपयोग मानक प्रमाणन का उपयोग न करें (जैसे [JWT](https://jwt.io/), [OAuth](https://oauth.net/))। 11 | - [ ] `प्रमाणीकरण`, `टोकन पीढ़ी`, `पासवर्ड भंडारण` में पहिया को फिर से न बदलें। मानकों का उपयोग करें। 12 | - [ ] लॉग इन में `मैक्स पुन: प्रयास` और `जेल` सुविधाओं का उपयोग करें। 13 | - [ ] सभी संवेदनशील डेटा पर एन्क्रिप्शन का उपयोग करें। 14 | 15 | ### JWT (JSON वेब टोकन) 16 | - [ ] एक यादृच्छिक जटिल कुंजी (`JWT सीक्रेट`) का प्रयोग करें ताकि brute force करने के लिए टोकन बहुत कठिन हो। 17 | - [ ] पेलोड से एल्गोरिदम न निकालें। बैकएण्ड (`HS256` या `RS256`) में एल्गोरिथम को बल दें। 18 | - [ ] टोकन की समाप्ति (`टीटीएल`, `आरटीटीएल`) को यथासंभव कम करें। 19 | - [ ] JWT पेलोड में संवेदनशील डेटा को संचित न करें, इसे [आसानी](https://jwt.io/#debugger-io) से डिकोड किया जा सकता है। 20 | - [ ] ज्यादा डाटा स्टोर करने से बचें। JWT को आमतौर पर headers में साझा किया जाता है और उनकी एक आकार सीमा होती है। 21 | 22 | ## Access 23 | - [ ] DDOS / ब्रूट-फॉरेस्ट हमलों से बचने के लिए सीमा अनुरोध (थ्रोटलिंग)। 24 | - [ ] MITM (मैन इन द मिडल अटैक) से बचने के लिए सर्वर साइड पर HTTPS का उपयोग करें। 25 | - [ ] SSL strip हमले से बचने के लिए SSL के साथ HSTS हैडर का उपयोग करें। 26 | - [ ] निर्देशिका लिस्टिंग बंद करें। 27 | - [ ] निजी API के लिए, केवल श्वेतसूची वाले IP/होस्ट से ही एक्सेस की अनुमति दें। 28 | 29 | ## Authorization 30 | 31 | ### OAuth 32 | - [ ] केवल व्हाइटलिस्ट किए गए URL को अनुमति देने के लिए हमेशा `redirect_uri` सर्वर-पक्ष को मान्य करें। 33 | - [ ] हमेशा कोड के लिए आदान-प्रदान करने की कोशिश नहीं करें और टोकन न दें (`response_type=token` की अनुमति न दें) 34 | - [ ] OAuth प्रमाणीकरण प्रक्रिया पर CSRF को रोकने के लिए एक यादृच्छिक हैश के साथ `state` पैरामीटर का उपयोग करें। 35 | - [ ] डिफ़ॉल्ट स्कोप को परिभाषित करें, और प्रत्येक एप्लिकेशन के लिए स्कोप मापदंडों को मान्य करें। 36 | 37 | ## Input 38 | - [ ] ऑपरेशन के अनुसार उचित HTTP विधि का प्रयोग करें: अनुरोधित विधि है, अगर `GET (पढ़ें)`, `पोस्ट (बनाएं)`, `पुट / पैच (प्रतिस्थापित / अद्यतन)`, और `हटाएं (रिकॉर्ड को हटाने के लिए)`, और `405 Method Not Allowed` के साथ प्रतिक्रिया न दें अनुरोधित संसाधन के लिए उचित नहीं है 39 | - [ ] अनुरोध पर `content-type` मान्य करें केवल अपने समर्थित प्रारूप (जैसे `application/xml`, `application/json`, आदि) को अनुमति देने के लिए हेडर (सामग्री वार्ता-Content Negotiation) स्वीकार करें और `406 Not Acceptable` करें यदि स्वीकार्य न हो तो। 40 | - [ ] जैसा कि आप स्वीकार करते हैं, उतनी ही पोस्ट की गई `content-type` की पुष्टि करें (जैसे `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, इत्यादि)। 41 | - [ ] सामान्य कमजोरियों (जैसे `XSS`, `SQL-Injection`, `Remote Code Execution`, आदि) से बचने के लिए उपयोगकर्ता इनपुट मान्य करें। 42 | - [ ] URL में किसी भी संवेदनशील डेटा (`credentials`, `Passwords`, `security tokens`, या `API keys`) का उपयोग न करें, लेकिन मानक प्राधिकरण शीर्ष लेख का उपयोग करें। 43 | - [ ] केवल सर्वर-साइड एन्क्रिप्शन का उपयोग करें। 44 | - [ ] कैशिंग, दर सीमा नीतियों (`Quota`, `Spike Arrest`, `Concurrent Rate Limit`) को सक्षम करने के लिए API गेटवे सेवा का उपयोग करें और गतिशील रूप से API संसाधनों की तैनाती करें। 45 | 46 | ## Processing 47 | - [ ] जांचें कि क्या सभी समापन बिंदुओं को टूटा प्रमाणीकरण प्रक्रिया से बचने के लिए प्रमाणीकरण के पीछे सुरक्षित किया गया है या नहीं। 48 | - [ ] उपयोगकर्ता के स्वयं के संसाधन आईडी से बचना चाहिए। `/user/654321/orders` के बजाय `/me/orders` का उपयोग करें। 49 | - [ ] auto-increment आईडी न करें। बजाय यूयूआईडी का प्रयोग करें। 50 | - [ ] यदि आप XML फ़ाइलों को पार्स कर रहे हैं, तो सुनिश्चित करें कि इकाई पार्सिंग XXE (XML external entity attack) से बचने के लिए सक्षम है। 51 | - [ ] यदि आप XML फ़ाइलों को पार्स कर रहे हैं, तो सुनिश्चित करें कि `Billion Laughs/XML bomb` (exponential entity expansion attack) के हमले से बचने के लिए सक्षम है। 52 | - [ ] फ़ाइल अपलोड के लिए CDN का उपयोग करें। 53 | - [ ] यदि आप बड़ी मात्रा में डेटा के साथ काम कर रहे हैं, तो Workers और Queues का उपयोग पृष्ठभूमि में यथासंभव प्रक्रिया करने के लिए और HTTP अवरोधन(Blocking) से बचने के लिए तेज़ी से return response करें। 54 | - [ ] DEBUG मोड बंद करने के लिए मत भूलना। 55 | - [ ] उपलब्ध होने पर गैर-निष्पादन योग्य stack का उपयोग करें। 56 | 57 | ## Output 58 | - [ ] `X-Content-Type-Options: nosniff` हेडर भेजें। 59 | - [ ] `X-Frame-Options: deny`हेडर भेजें। 60 | - [ ] `Content-Security-Policy: default-src 'none'`हेडर भेजें। 61 | - [ ] `X-Powered-By`, `Server`, `X-AspNet-Version` फिंगरप्रिंटिंग हेडर हटाएं। 62 | - [ ] आपकी प्रतिक्रिया के लिए `content-type` को बल दें, यदि आप `application/json` वापस करते हैं तो आपकी प्रतिक्रिया `content-type` `application/json` है। 63 | - [ ] `credentials`, `Passwords`, `security tokens` जैसे संवेदनशील डेटा वापस न करें। 64 | - [ ] ऑपरेशन के अनुसार उचित स्थिति कोड वापस करें। (जैसे `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, आदि)। 65 | 66 | ## CI & CD 67 | - [ ] unit/integration परीक्षण कवरेज के साथ अपने डिजाइन और कार्यान्वयन की जांच करें। 68 | - [ ] कोड समीक्षा प्रक्रिया का उपयोग करें और स्वयं-स्वीकृति की उपेक्षा करें। 69 | - [ ] सुनिश्चित करें कि आपकी सेवाओं के सभी components को AV सॉफ्टवेयर द्वारा स्कैन करने से पहले उत्पादक को push. vendor libraries और अन्य dependencies शामिल हैं। 70 | - [ ] अपने कोड पर लगातार सुरक्षा परीक्षण (स्थिर/गतिशील विश्लेषण) चलाएं। 71 | - [ ] ज्ञात कमजोरियों के लिए अपनी निर्भरता (सॉफ्टवेयर और ओएस दोनों) की जाँच करें। 72 | - [ ] तैनाती के लिए एक रोलबैक समाधान तैयार करें। 73 | 74 | ## Monitoring 75 | - [ ] Use centralized logins for all services and components. 76 | - [ ] Use agents to monitor all traffic, errors, requests, and responses. 77 | - [ ] Use alerts for SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Ensure that you aren't logging any sensitive data like credit cards, passwords, PINs, etc. 79 | - [ ] Use an IDS and/or IPS system to monitor your API requests and instances. 80 | 81 | 82 | --- 83 | 84 | ## यह भी देखें: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) RESTful HTTP+JSON APIs के निर्माण के लिए उपयोगी संसाधनों का संग्रह। 86 | 87 | 88 | --- 89 | 90 | # योगदान 91 | इस रिपोजिटरी contribute, कुछ बदलाव करने और pull request सबमिट करने में योगदान करने के लिए स्वतंत्र महसूस करें। किसी भी प्रश्न के लिए हमें `team@shieldfy.io` पर एक ईमेल है। 92 | -------------------------------------------------------------------------------- /README-id.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # Checklist Keamanan API 4 | Checklist penanggulangan keamanan yang paling penting ketika merancang, menguji, dan melepaskan API ke khalayak 5 | 6 | 7 | --- 8 | 9 | ## Autentikasi 10 | - [ ] Jangan gunakan `Basic Auth`. Gunakan autentikasi baku (Contoh: JWT, Oauth). 11 | - [ ] Gunakan mekanisme baku untuk `autentikasi`, `pembuatan token`, dan `penyimpanan kata sandi`. 12 | - [ ] Gunakan maksimal percobaan berulang dan fitur penjara pada Login. 13 | - [ ] Gunakan enkripsi untuk seluruh data sensitif. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Gunakan kunci acak yang rumit (`JWT Secret`) untuk membuat proses pemecahan token secara paksa menjadi sangat susah. 17 | - [ ] Jangan gunakan algoritma yang berasal dari muatan yang dikirim oleh pengguna. Paksa penggunaan algoritma di sisi peladen (`HS256` atau `RS256`). 18 | - [ ] Gunakan masa tenggat token (`TTL`, `RTTL`) yang sesingkat mungkin. 19 | - [ ] Jangan simpan data sensitif pada muatan JWT karena muatan JWT dapat diterjemahkan [dengan mudah](https://jwt.io/#debugger-io). 20 | - [ ] Hindari menyimpan terlalu banyak data. JWT biasanya dibagikan di header dan mereka memiliki batas ukuran. 21 | 22 | ## Akses 23 | - [ ] Batasi permintaan (_throttling_) di sisi peladen untuk menghindari serangan yang dapat melumpukan sistem (Contoh: DDoS, serangan paksa). 24 | - [ ] Gunakan HTTPS di sisi peladen untuk menghindari serangan pencegatan / MItM (Man In The Middle Attack). 25 | - [ ] Gunakan tajuk `HSTS` pada SSL untuk mencegah serangan SSL Strip. 26 | - [ ] Matikan daftar direktori. 27 | - [ ] Untuk API pribadi, izinkan akses hanya dari IP/host yang masuk daftar putih. 28 | 29 | ## Otorisasi 30 | 31 | ### OAuth 32 | - [ ] Selalu validasi `redirect_uri` di sisi peladen sehingga hanya URL-URL yang ada di dalam daftar putih yang boleh digunakan. 33 | - [ ] Selalu coba untuk mempertukarkan kode bukan token (jangan ijinkan `response_type=token`). 34 | - [ ] Gunakan parameter `state` dengan campuran nilai acak (_random hash_) untuk mencegah CSRF pada proses autentikasi. 35 | - [ ] Tetapkan cakupan baku dan validasi parameter cakupan untuk setiap aplikasi. 36 | 37 | ## Masuk 38 | - [ ] Gunakan metode HTTP yang sesuai dengan operasi yang digunakan, `GET untuk membaca catatan`, `POST untuk membuat catatan baru`, `PUT/PATCH untuk mengganti secara keseluruhan/mengubah sebagian catatan`, `DELETE untuk menghapus catatan` dan tanggapan `405 Method Not Allowed` jika metode permintaan tidak dikenali pada sumber daya. 39 | - [ ] Validasi `content-type` pada tajuk _Accept_ pada permintaan (Negosiasi konten) sehingga hanya mengijinkan format yang dikenali (Contoh: `application/xml`, `application/json`, dan lain sebagainya). Berikan tanggapan `406 Not Acceptable` jika nilai tajuk _Accept_ tidak dikenali. 40 | - [ ] Validasi `content-type` dari data yang dipos oleh pengguna (Contoh: `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, dan lain sebagainya). 41 | - [ ] Validasi masukan dari pengguna untuk menghindari kerentanan umum (Contoh: `XSS`, `SQL-Injection`, `Remote Code Execution`, dan lain sebagainya). 42 | - [ ] Jangan gunakan data sensitif seperti `kredensial`, `kata sandi`, `token keamanan`, atau `kunci API` pada URL. Gunakan tajuk _Authorization_ baku. 43 | - [ ] Gunakan hanya enkripsi sisi server. 44 | - [ ] Gunakan layanan pintu gerbang API (_API Gateway_) untuk memungkinan singgahan, pembatasan laju, pendeteksian lalu lintas tinggi, dan penyebaran sumber daya API secara dinamis. 45 | 46 | ## Pemrosesan 47 | - [ ] Cek apakah seluruh titik akhir terlindungi oleh autentikasi untuk menghindari proses autentikasi yang rusak. 48 | - [ ] Sumber daya ID kepunyaan pengguna sebaiknya dihindari. Lebih baik menggunakan`/me/orders` daripada `/user/654321/orders`. 49 | - [ ] Jangan gunakan ID yang bertambah secara otomatis. Sebaiknya gunakan `UUID`. 50 | - [ ] Jika hendak menguraikan berkas XML, pastikan penguraian entitas tidak diaktikan untuk menghindari serangan `XXE` (XML External Entity). 51 | - [ ] Jika hendak menguraikan berkas XML, pastikan perluasan entitas tidak diaktifkan untuk menghindari `Billion Laughs/XML bomb` melalui serangan perluasan entitas eksponensial. 52 | - [ ] Gunakan CDN untuk unggah berkas. 53 | - [ ] Jika berhubungan dengan jumlah data yang sangat besar, gunakan Pekerja dan Antrian untuk memproses sebanyak mungkin di balik layar dan kembalikan tanggapan cepat untuk menghindari pemblokiran HTTP. 54 | - [ ] Jangan lupa untuk mematikan mode DEBUG. 55 | - [ ] Gunakan stack yang tidak dapat dieksekusi jika tersedia. 56 | 57 | ## Keluaran 58 | - [ ] Kirim tajuk `X-Content-Type-Options: nosniff`. 59 | - [ ] Kirim tajuk `X-Frame-Options: deny`. 60 | - [ ] Kirim tajuk `Content-Security-Policy: default-src 'none'`. 61 | - [ ] Hapus tajuk sidik jari - `X-Powered-By`, `Server`, `X-AspNet-Version` dan lain sebagainya. 62 | - [ ] Paksa `content-type` pada tanggapan. Jika mengambalikan `application/json` maka tajuk `content-type` adalah `application/json`. 63 | - [ ] Jangan kembalikan data sensitif seperti `kredensial`, `kata sandi`, dan `token keamanan`. 64 | - [ ] Kembalikan kode status yang layak sesuai dengan operasi yang diselesaikan (Contoh: `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, dan lain sebagainya). 65 | 66 | ## CI & CD 67 | - [ ] Audit rancangan dan pelaksanaan dengan pengujian unit/integrasi. 68 | - [ ] Gunakan proses ulasan kode dan kesampingkan persetujuan sendiri. 69 | - [ ] Pastikan seluruh komponen layanan dipindai secara statis menggunakan anti virus sebelum didorong ke lingkungan produksi, termasuk pustaka-pustaka milik vendor dan ketergantungan lainnya. 70 | - [ ] Jalankan uji keamanan (analisis statis/dinamis) secara terus-menerus pada kode Anda. 71 | - [ ] Memeriksa dependensi Anda (perangkat lunak dan OS) untuk mengetahui kerentanannya. 72 | - [ ] Rancang solusi kembali ke versi sebelumnya pada proses penyebaran. 73 | 74 | ## Pemantauan 75 | - [ ] Gunakan login terpusat untuk semua layanan dan komponen. 76 | - [ ] Gunakan agen untuk memantau semua lalu lintas, kesalahan, permintaan, dan respons. 77 | - [ ] Gunakan peringatan untuk SMS, Slack, Email, Telegram, Kibana, Cloudwatch, dll. 78 | - [ ] Pastikan Anda tidak mencatat data apapun yang sensitif, seperti kartu kredit, kata sandi, PIN, dll. 79 | - [ ] Gunakan sistem IDS dan/atau IPS untuk memantau permintaan dan instans API Anda. 80 | 81 | 82 | --- 83 | 84 | ## Lihat juga: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Kumpulan sumber yang berguna untuk membangun API RESTful HTTP+JSON. 86 | 87 | 88 | --- 89 | 90 | # Kontribusi 91 | Silahkan berkontribusi dengan cara menduplikasi repositori ini, lakukan perubahan, dan kirimkan PR. Jika ada pertanyaan silakan kirim email ke `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-it.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # Checklist per la sicurezza delle API 4 | Una checklist per le più importanti contromisure da mettere in pratica quando strutturiamo, testiamo e rilasciamo le nostre API. 5 | 6 | 7 | --- 8 | 9 | ## Autenticazione 10 | - [ ] Non usare la `Basic Auth` Utilizzare piuttosto dei sistemi standard di identificazione (es. JWT, OAuth). 11 | - [ ] Non re-inventarsi sistemi di `autenticazione`, `generazione token`, `salvataggio password`. Utilizzare gli standard. 12 | - [ ] Utilizzare `Max Retry` e le jail features per il Login. 13 | - [ ] Utilizzare la cifratura per tutti i dati sensibili. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Utilizzare una chiave random complessa (`JWT Secret`) per rendere assai difficile il brute force del token. 17 | - [ ] Non ricavare l'algoritmo dal payload. Forzare l'algoritmo nel backend (`HS256` o `RS256`). 18 | - [ ] Rendere la scadenza del token (`TTL`, `RTTL`) il più breve possibile. 19 | - [ ] Non memorizzare dati sensibili nel payload JWT, può essere decodificato [facilmente](https://jwt.io/#debugger-io). 20 | - [ ] Evita di archiviare troppi dati. JWT è solitamente condiviso nelle header e hanno un limite di dimensioni. 21 | 22 | ## Accesso 23 | - [ ] Limitare le richieste (Throttling) per evitare attacchi DDoS o brute-force. 24 | - [ ] Utilizzare il protocollo HTTPS per evitare attacchi MITM (Man In The Middle Attack). 25 | - [ ] Utilizzare l'header `HSTS` per evitare attacchi SSL Strip. 26 | - [ ] Disattiva gli elenchi di directory. 27 | - [ ] Per le API private, consenti l'accesso solo da IP/host nella whitelist (lista bianca). 28 | 29 | ## Autorizzazione 30 | 31 | ### OAuth 32 | - [ ] Validare sempre il valore di `redirect_uri` lato server permettendo solo url verificati nella whitelist. 33 | - [ ] Tentare sempre lo scambio attraverso il codice e non tramite token (non permettere `response_type=token`). 34 | - [ ] Utilizzare il parametro `state` con un hash random per prevenire il CSRF durante il processo di autenticazione OAuth. 35 | - [ ] Definire lo scope di default e validare i parametri dello scope per ogni singola applicazione. 36 | 37 | ## Input 38 | - [ ] Utilizzare il metodo HTTP appropriato in base all'azione: `GET (lettura)`, `POST (scrittura)`, `PUT/PATCH (sostituzione/modifica)`, e `DELETE (cancellazione)`, e rispondere con uno status `405 Method Not Allowed` se il metodo della richiesta non è appropriato. 39 | - [ ] Validare il `content-type` rispetto all' Accept header (Content Negotiation) per consentire solo i formati supportati (es. `application/xml`, `application/json`, ecc.) e rispondere con un `406 Not Acceptable` se la risposta non coincide. 40 | - [ ] Validare il `content-type` in base alle strutture accettate (es. `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, ecc.). 41 | - [ ] Validare sempre gli input dell'utente per evitare attacchi comuni (es. `XSS`, `SQL-Injection`, `Remote Code Execution`, ecc.). 42 | - [ ] Non utilizzare mai dati sensibili (`credenziali`, `password`, `security tokens`, o `API keys`) nell'url, utilizzare piuttosto gli Authorization header. 43 | - [ ] Utilizzare solo la crittografia lato server. 44 | - [ ] Utilizzare un gateway per abilitare il caching delle API, con sistema di controllo delle chiamate (es. `Quota`, `Spike Arrest`, `Concurrent Rate Limit`). 45 | 46 | ## Processing 47 | - [ ] Verificare che tutti gli endpoints siano protetti dal sistema di autenticazione, per evitare eventuali falle. 48 | - [ ] L'ID dell'utente corrente andrebbe sempre evitato nelle url. Utilizzare ad esempio `/me/orders` piuttosto che `/user/654321/orders`. 49 | - [ ] Non ricorrere all'autoincremento di un ID. Utilizzare piuttosto un `UUID`. 50 | - [ ] Se stai effettuando il parsing di un file XML, controlla che l'entity parsing non sia attiva per evitare `XXE` (XML external entity attack). 51 | - [ ] Se stai effettuando il parsing di un file XML, controlla che l'entity expansion non sia attiva per evitare il `Billion Laughs/XML bomb`. 52 | - [ ] Utilizzare una CDN per l'upload dei file. 53 | - [ ] Se stai gestendo grandi moli di dati, utilizza Workers e Queues per processare i dati in background evitando che la chiamata HTTP vada in blocco. 54 | - [ ] Ricordarsi sempre di disattivare le eventuali modalità di DEBUG. 55 | - [ ] Utilizzare stack non eseguibili quando disponibili. 56 | 57 | ## Output 58 | - [ ] Inviare l'header `X-Content-Type-Options: nosniff`. 59 | - [ ] Inviare l'header `X-Frame-Options: deny`. 60 | - [ ] Inviare l'header `Content-Security-Policy: default-src 'none'`. 61 | - [ ] Rimuovere header che permettono il riconoscimento - `X-Powered-By`, `Server`, `X-AspNet-Version` ecc. 62 | - [ ] Forzare il `content-type` nella chiamata di risposta: se per esempio viene ritornato un `application/json` forzare il `content-type` a `application/json`. 63 | - [ ] Non ritornare mai dati sensibili come `credenziali`, `password`, `security tokens`. 64 | - [ ] Ritornare sempre lo status code corretto in base all'esito della chiamata. (es. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, ecc). 65 | 66 | ## CI & CD 67 | - [ ] Verificare il design attraverso gli unit/integration tests. 68 | - [ ] Definire e utilizzare una procedura di code review per il rilascio, evitando l'auto approvazione. 69 | - [ ] Verificare che tutti i componenti dei servizi siano controllati da software AV prima di essere messi in produzione, incluse le librerie di terze parti. 70 | - [ ] Esegui continuamente test di sicurezza (analisi statica/dinamica) sul tuo codice. 71 | - [ ] Controlla le tue dipendenze (sia software che sistema operativo) per le vulnerabilità note. 72 | - [ ] Definire una strategia di rollback per il deploy. 73 | 74 | ## Monitoraggio 75 | - [ ] Utilizza accessi centralizzati per tutti i servizi e i componenti. 76 | - [ ] Utilizza gli agenti per monitorare tutto il traffico, gli errori, le richieste, e le risposte. 77 | - [ ] Utilizza gli avvisi per SMS, Slack, Email, Telegram, Kibana, Cloudwatch, ecc. 78 | - [ ] Assicurati di non registrare dati sensibili come carte di credito, password, PIN, ecc. 79 | - [ ] Utilizza un sistema IDS e/o IPS per monitorare le richieste e le istanze della tua API. 80 | 81 | 82 | --- 83 | 84 | ## Guarda anche: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Una collezione di risorse utili per la creazione di API RESTful HTTP+JSON. 86 | 87 | 88 | --- 89 | 90 | # Contribuire 91 | Siate liberi di contribuire a questo progetto facendo un fork, modificandolo e inviando una pull request. Per qualsiasi dubbio inviare un'email all'indirizzo: `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-ja.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # APIセキュリティチェックリスト 4 | APIを設計、テスト、リリースするときの最も重要なセキュリティ対策のチェックリスト 5 | 6 | 7 | --- 8 | 9 | ## 認証 10 | - [ ] `Basic認証`を利用せず、標準的な認証を利用する(例: [JWT](https://jwt.io/)、[OAuth](https://oauth.net/))。 11 | - [ ] `認証`、`トークンの生成`、`パスワードの保管`において「車輪の再発明」をしないこと。すでに標準化されているものを利用する。 12 | - [ ] ログインにおいては`最大リトライ回数(Max Retry)`とjail機能を利用する。 13 | - [ ] 全ての機微情報において暗号化を活用する。 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] ランダムで複雑なキー(`JWT Secret`)を使用する。これはブルートフォース攻撃を困難にするため。 17 | - [ ] ペイロードからアルゴリズムを抽出しないこと。アルゴリズムは必ずバックエンド処理のみとする(`HS256`または`RS256`)。 18 | - [ ] トークンの有効期限(`TTL`, `RTTL`)を可能な限り短くする。 19 | - [ ] JWTのペイロードに機密情報を格納してはいけない。それは[簡単に](https://jwt.io/#debugger-io)復号できる。 20 | - [ ] あまり多くのデータを保存するに避けるください。JWTは通常header「ヘッダー」に共有され、サイズ制限があります。 21 | 22 | ## アクセス 23 | - [ ] DDoSやブルートフォース攻撃を回避するため、リクエストを制限(スロットリング)する。 24 | - [ ] MITM(Man in the Middle Attack)を防ぐため、サーバサイドではHTTPSを使用する。 25 | - [ ] SSL Strip attackを防ぐため、SSL化とともに`HSTS`ヘッダを設定する。 26 | - [ ] ディレクトリ・リストをオフにしてください。 27 | - [ ] プライベートAPIの場合、ホワイト・リストに登録されたIP/ホストからのアクセスのみを許可します。 28 | 29 | ## 認可 30 | 31 | ### OAuth 32 | - [ ] サーバサイドで常に`redirect_uri`を検証し、ホワイトリストに含まれるURLのみを許可する。 33 | - [ ] 常にtokenではなくcodeを交換するようにする(`response_type=token`を許可しない)。 34 | - [ ] `state`パラメータをランダムなハッシュと共に利用し、OAuth認証プロセスでのCSRFを防ぐ。 35 | - [ ] デフォルトのscopeを定義し、アプリケーション毎にscopeパラメータを検証する。 36 | 37 | ## 入力 38 | - [ ] 操作に応じて適切なHTTPメソッドを利用する。`GET(読み込み)`, `POST(作成)`, `PUT/PATCH(置き換え/更新)`, `DELETE(単一レコードの削除)`。リクエストメソッドがリソースに対して適切ではない場合、`405 Method Not Allowed`を返す。 39 | - [ ] リクエストのAcceptヘッダ(コンテンツネゴシエーション)の`content-type`を検証する。サポートしているフォーマット(例: `application/xml`, `application/json`等)は許可し、そうでない場合は`406 Not Acceptable`を返す。 40 | - [ ] POSTされたデータの`content-type`が受け入れ可能(例: `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`等)かどうかを検証する。 41 | - [ ] ユーザーの入力に一般的な脆弱性が含まれていないことを検証する(例: `XSS`, `SQLインジェクション`, `リモートコード実行`等)。 42 | - [ ] URLの中に機密情報(`認証情報`, `パスワード`, `セキュリティトークン`)を利用せず、標準的な認証ヘッダを使用する。 43 | - [ ] サーバー側の暗号化のみを使用してください。 44 | - [ ] キャッシュ、Rate Limit policies(例: `Quota`, `Spike Arrest`, `Concurrent Rate Limit`)を有効化し、APIリソースのデプロイを動的に行うため、APIゲートウェイサービスを利用する。 45 | 46 | ## 処理 47 | - [ ] 壊れた認証プロセスを回避するため、全てのエンドポイントが認証により守られていることを確かめる。 48 | - [ ] ユーザーに紐付いたリソースIDを使用してはならない。`/user/654321/orders`の代わりに`/me/orders`を利用する。 49 | - [ ] オートインクリメントなIDを利用せず、代わりに`UUID`を利用する。 50 | - [ ] XMLファイルをパースする場合、`XXE`(XML external entity attack)を回避するため、entity parsingが有効でないことを確認する。 51 | - [ ] XMLファイルをパースする場合、exponential entity expansion attackによる`Billion Laughs/XML bomb`攻撃を回避するためentity expansion が有効でないことを確認する。 52 | - [ ] ファイルアップロードにはCDNを利用する。 53 | - [ ] 大量のデータを扱う場合、バックグラウンドでWorkerプロセスやキューを出来る限り使用し、レスポンスを速く返すことでHTTPブロッキングを避ける。 54 | - [ ] デバッグ・モードを無効にすることを忘れないでください。 55 | - [ ] 可能な場合は、実行不可能なスタックを使用してください。 56 | 57 | ## 出力 58 | - [ ] `X-Content-Type-Options: nosniff`をヘッダに付与する。 59 | - [ ] `X-Frame-Options: deny`をヘッダに付与する。 60 | - [ ] `Content-Security-Policy: default-src 'none'`をヘッダに付与する。 61 | - [ ] フィンガープリントヘッダを削除する - `X-Powered-By`, `Server`, `X-AspNet-Version`等。 62 | - [ ] `content-type`を必ず付与する。もし`application/json`を返す場合、`content-type`は`application/json`にする。 63 | - [ ] `認証情報`, `パスワード`, `セキュリティトークン`といった機密情報を返さない。 64 | - [ ] 処理の終了時に適切なステータスコードを返す(例: `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`等)。 65 | 66 | ## CI & CD (継続的インテグレーションと継続的デリバリー) 67 | - [ ] ユニットテスト/結合テストのカバレッジで、設計と実装を継続的に検査する。 68 | - [ ] コードレビューのプロセスを採用し、自身による承認を無視する。 69 | - [ ] プロダクションへプッシュする前に、ベンダのライブラリ、その他の依存関係を含め、サービスの全ての要素をアンチウイルスソフトで静的スキャンする。 70 | - [ ] コードに対してセキュリティ・テスト(静的/動的分析)を継続的に実行して。 71 | - [ ] 既知の脆弱性について、依存関係(ソフトウェアとOSの両方)を確認して。 72 | - [ ] デプロイのロールバックを用意する。 73 | 74 | ## モニタリング 75 | - [ ] すべてのサービスとコンポーネントに集中ログインを使用します。 76 | - [ ] すべてのトラフィック、エラー、リクエスト、およびレスポンスを監視ために、エージェントを使用します。 77 | - [ ] SMS、Slack、Email、Telegram、Kibana、Cloudwatch、などのアラートを使用します。 78 | - [ ] クレジット・カード、パスワード、PIN、などの機密データをログに記録していないことを確認します。 79 | - [ ] APIリクエストとインスタンスを監視ためにIDSやIPSシステムを使用します。 80 | 81 | 82 | --- 83 | 84 | ## 参照: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - RESTful HTTP+JSON APIを構築するための有用なリソースの集まり。 86 | 87 | 88 | --- 89 | 90 | # コントリビューション 91 | このリポジトリをforkして、変更し、プルリクエストを送信し、自由にコントリビューションしてください。何か質問があれば `team@shieldfy.io` まで電子メールを送ってください。 92 | -------------------------------------------------------------------------------- /README-ko.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API 보안 점검표 4 | API를 설계하고, 테스트하고, 배포할 때 고려해야 할 중요한 보안 대책에 대한 점검 목록입니다. 5 | 6 | 7 | --- 8 | 9 | ## 인증 (Authentication) 10 | - [ ] `Basic Auth`를 사용하지 말고 표준 인증방식을 사용하세요. (예로, JWT, OAuth 등) 11 | - [ ] `인증`, `토큰 생성`, `패스워드 저장`은 직접 개발하지 말고 표준을 사용하세요. 12 | - [ ] 로그인에서 `Max Retry`와 격리 기능을 사용하세요. 13 | - [ ] 민감한 데이터는 모두 암호화하세요. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] 무작위 대입 공격을 어렵게 하기 위해 랜덤하고 복잡한 키값 (`JWT Secret`)을 사용하세요. 17 | - [ ] 요청 페이로드에서 알고리즘을 가져오지 마세요. 알고리즘은 백엔드에서 강제로 적용하세요. (`HS256` 혹은 `RS256`) 18 | - [ ] 토큰 만료 기간 (`TTL`, `RTTL`)은 되도록 짧게 설정하세요. 19 | - [ ] JWT 페이로드는 [디코딩이 쉽기](https://jwt.io/#debugger-io) 때문에 민감한 데이터는 저장하지 마세요. 20 | - [ ] 너무 많은 데이터를 저장하지 마십시오. JWT는 일반적으로 header서 공유되며 크기 제한이 있습니다. 21 | 22 | ## 접근 (Access) 23 | - [ ] DDoS나 무작위 대입 공격을 피하려면 요청 수를 제한하세요. (Throttling) 24 | - [ ] MITM (중간자 공격)을 피하려면 서버 단에서 HTTPS를 사용하세요. 25 | - [ ] SSL Strip 공격을 피하려면 `HSTS` 헤더를 SSL과 함께 사용하세요. 26 | - [ ] 디렉토리 목록을 끕니다. 27 | - [ ] 프라이빗 API의 경우, 화이트리스트에 있는 IP/호스트에서만 액세스를 허용합니다. 28 | 29 | ## 권한 부여 (Authorization) 30 | 31 | ### OAuth 32 | - [ ] 허용된 URL만 받기 위해서는 서버 단에서 `redirect_uri`의 유효성을 항상 검증하세요. 33 | - [ ] 항상 토큰 대신 코드를 주고받으세요. (`response_type=token`을 허용하지 마세요) 34 | - [ ] OAuth 인증 프로세스에서 CSRF를 방지하기 위해 랜덤 해쉬값을 가진 `state` 파라미터를 사용하세요. 35 | - [ ] 디폴트 스코프를 정의하고 각 애플리케이션마다 스코프 파라미터의 유효성을 검증하세요. 36 | 37 | ## 입력 및 요청 (Input) 38 | - [ ] 각 요청의 연산에 맞는 적절한 HTTP 메서드를 사용하세요. `GET (읽기)`, `POST (생성)`, `PUT (대체/갱신)`, `DELETE (삭제)`. 그리고 요청 메소드가 리소스에 적합하지 않은 경우 `405 Method Not Allowed`로 응답하세요. 39 | - [ ] 여러분이 지원하는 포맷 (예를 들어 `application/xml`이나 `application/json` 등)만을 허용하려면 요청의 Accept 헤더에서 `content-type`의 유효성을 검사하고 일치하지 않으면 `406 Not Acceptable`로 응답하세요. 40 | - [ ] 요청받은 POST 데이터의 `content-type`을 검증하세요. (예를 들어 `application/x-www-form-urlencoded`나 `multipart/form-data` 또는 `application/json` 등) 41 | - [ ] 일반적인 취약점들을 피하기 위해선 사용자 입력의 유효성을 검증하세요. (예를 들어 `XSS`, `SQL-Injection` 또는 `Remote Code Execution` 등) 42 | - [ ] URL에는 그 어떤 민감한 데이터 (`자격 인증 (credentials)`, `패스워드`, `보안 토큰` 또는 `API 키`)도 포함하고 있어서는 안 되며 이러한 것들은 표준 인증 방식의 헤더를 사용하세요. 43 | - [ ] 서버 측 암호화만 사용하십시오. 44 | - [ ] 캐싱과 속도 제한 정책을 제공하는 API 게이트웨이 서비스 (예를 들어 `Quota`, `Spike Arrest`, `Concurrent Rate Limit`)를 사용하고, API 리소스를 동적으로 배포하세요. 45 | 46 | ## 서버 처리 47 | - [ ] 인증 프로세스가 손상되는 것을 피하기 위해 모든 엔드포인트가 인증 프로세스 뒤에서 보호되고 있는지 확인하세요. 48 | - [ ] 사용자 소유의 리소스 식별자는 피해야 합니다. `/user/654321/orders` 대신 `/me/orders`를 사용하세요. 49 | - [ ] 자동 증가 (auto-increment) 식별자 대신 `UUID`를 사용하세요. 50 | - [ ] XML 파일을 파싱하고 있다면, `XXE` (XML 외부 엔티티 공격, XML external entity attack)를 피하기 위해 엔티티 파싱을 비활성화하세요. 51 | - [ ] XML 파일을 파싱하고 있다면, 지수적 엔티티 확장 공격을 통한 빌리언 러프/XML 폭탄을 피하기 위해 엔티티 확장을 비활성화하세요. 52 | - [ ] 파일 업로드에는 CDN을 사용하세요. 53 | - [ ] 거대한 양의 데이터를 다루고 있다면, 워커나 큐를 사용하여 가능한 한 백그라운드에서 처리하고, HTTP 블로킹을 피하기 위해 응답을 빠르게 반환하세요. 54 | - [ ] 디버그 모드를 꺼놓는 일을 절대 잊지 마세요. 55 | - [ ] 가능한 경우 실행 불가능한 스택을 사용하십시오. 56 | 57 | ## 반환 및 응답 (Output) 58 | - [ ] `X-Content-Type-Options: nosniff` 헤더를 반환하세요. 59 | - [ ] `X-Frame-Options: deny` 헤더를 반환하세요. 60 | - [ ] `Content-Security-Policy: default-src 'none'` 헤더를 반환하세요. 61 | - [ ] `X-Powered-By`, `Server`, `X-AspNet-Version` 등의 디지털 지문 (fingerprinting) 성격의 헤더는 제거하세요. 62 | - [ ] 응답에 `content-type`을 강제하세요. 만약 `application/json` 데이터를 반환하고 있다면 응답의 `content-type`은 `application/json`입니다. 63 | - [ ] `자격 인증 (credentials)`, `패스워드`, `보안 토큰`과 같은 민감한 데이터는 반환하지 마세요. 64 | - [ ] 각 작업에 맞는 적절한 상태 코드를 반환하세요. (예를 들어 `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed` 등) 65 | 66 | ## CI & CD 67 | - [ ] 단위/통합 테스트 범위로 설계 및 구현을 검토하세요. 68 | - [ ] 코드 리뷰 절차를 사용하고 자체 승인을 무시하세요. 69 | - [ ] 제품 출시전에 백신 소프트웨어로 공급 업체의 라이브러리 및 기타 종속적인 것을 포함한 서비스의 모든 구성 요소들을 정적으로 검사했는지 확인하세요. 70 | - [ ] 코드에 대한 보안 테스트(정적/동적 분석)를 지속해서 실행합니다. 71 | - [ ] 알려진 취약점이 있는지 종속성(소프트웨어 및 OS 모두)을 확인하십시오. 72 | - [ ] 배포에 대한 롤백 솔루션을 설계하세요. 73 | 74 | ## 모니터링 (Monitoring) 75 | - [ ] 모든 서비스 및 구성 요소에 대해 중앙 집중식 로그인을 사용합니다. 76 | - [ ] 에이전트를 사용하여 모든 트래픽, 오류, 요청 및 응답을 모니터링합니다. 77 | - [ ] SMS, Slack, 이메일, Telegram, Kibana, Cloudwatch, 등에 대한 알림을 사용합니다. 78 | - [ ] 신용 카드, 비밀번호, PIN, 등과 같은 민감한 데이터를 기록하고 있지 않은지 확인하십시오. 79 | - [ ] IDS 및/또는 IPS 시스템을 사용하여 API 요청 및 인스턴스를 모니터링합니다. 80 | 81 | 82 | --- 83 | 84 | ## 참조 : 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - RESTful HTTP+JSON API를 만드는 데 유용한 자원의 콜렉션. 86 | 87 | 88 | --- 89 | 90 | # 기여하기 91 | 포크, 변경, pull request를 보내 자유롭게 기여하세요. 질문은 `team@shieldfy.io`로 이메일을 보내주세요. 92 | -------------------------------------------------------------------------------- /README-lo.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API Security Checklist 4 | Checklist ທີ່ຕ້ອງໃຫ້ຄວາມສຳຄັນເມື່ອມີການສ້າງ API ໃນຊ່ວງການອອກແບບ ທົດສອບລະບົບ ແລະ ການປ່ອຍໃຫ້ຄົນນອກໃຊ້ 5 | 6 | 7 | --- 8 | 9 | ## Authentication (ການພິສູດຕົວຕົນ) 10 | - [ ] ບໍ່ຄວນໃຊ້ `Basic Auth` (ການ authen ປົກກະຕິດ້ວຍ username password) ສຳລັບການພິສູດຕົວຕົນ ແຕ່ໃຫ້ໃຊ້ຮູບແບບມາດຕະຖານສາກົນແທນ(ຕົວຢ່າງ, JWT, OAuth). 11 | - [ ] ບໍ່ຕ້ອງເສຍເວລາສ້າງວິທີ Authentication ໃໝ່ຂຶ້ນມາ ໃຫ້ໃຊ້ທີ່ມີຢູ່ໃນມາດຕະຖານໄປເລີຍ. 12 | - [ ] ໃຫ້ມີການຈຳກັດຈຳນວນຄັ້ງໃນການພະຍາຍາມ authen ແລະ ສ້າງລະບົບລ໋ອກກໍລະນີພະຍາຍາມເກີນກຳນົດ. 13 | - [ ] ຂໍ້ມູນທີ່ສຳຄັນຄວນມີການເຂົ້າລະຫັດສະເໝີ. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] key ໃນການ generate token ຄວນມີຄວາມສັບຊ້ອນສູງ ເພື່ອປ້ອງກັນການ brute force ຫາຕົວເຂົ້າລະຫັດ. 17 | - [ ] ບໍ່ຄວນມີການແກະຂໍ້ມູນ ຫຼື ຂັ້ນຕອນການຖອດຂໍ້ມູນໃນຝັ່ງ client. ໃຫ້ມີສະເພາະໃນ server ເທົ່ານັ້ນ ໂດຍອາດໃຊ້ວິທີເຂົ້າລະຫັດດ້ວຍ HS256 ຫຼື RS256 ແທນ. 18 | - [ ] ພະຍາຍາມໃຫ້ token ໝົດອາຍຸໄວທີ່ສຸດເທົ່າທີ່ຈະເປັນໄປໄດ້ (`TTL`, `RTTL`). 19 | - [ ] ບໍ່ຄວນເກັບຂໍ້ມູນທີ່ສຳຄັນໃນ payload ຂອງ JWT ເພາະອາດຈະຖືກແກະໄດ້ [ງ່າຍ](https://jwt.io/#debugger-io). 20 | - [ ] ຫຼີກເວັ້ນການເກັບຮັກສາຂໍ້ມູນຫຼາຍເກີນໄປ. JWT ມັກຈະຖືກແບ່ງປັນໃນ headers ແລະພວກເຂົາມີຂອບເຂດຈໍາກັດ. 21 | 22 | ## Access 23 | - [ ] ຈຳກັດຈຳນວນສູງສຸດຂອງ request ເພື່ອປ້ອງກັນ DDoS / Bruteforce. 24 | - [ ] ໃຊ້ https ເພື່ອປ້ອງກັນ MITM (Man In The Middle Attack). 25 | - [ ] ໃຊ້ `HSTS` header ກັບ SSL ເພື່ອປ້ອງກັນ SSL Strip attack. 26 | - [ ] ປິດລາຍຊື່ໄດເລກະທໍລີ. 27 | - [ ] ສໍາລັບ APIs ສ່ວນຕົວ, ອະນຸຍາດໃຫ້ເຂົ້າເຖິງພຽງແຕ່ຈາກ IPs/hosts ບັນຊີຂາວເທົ່ານັ້ນ. 28 | 29 | ## Authorization 30 | 31 | ### OAuth 32 | - [ ] ມີການ validate `redirect_uri` ໃນຝັ່ງ server ໂດຍຍອມຮັບ uri ສະເພາະທີ່ມີຢູ່ໃນລີສທີ່ເຮົາເຊື່ອຖືເທົ່ານັ້ນ (whitelist). 33 | - [ ] ບັງຄັບໃຫ້ມີການໃຊ້ response_type ເປັນ code ສະເໝີ (ພະຍາຍາມລ່ຽງບໍ່ໃຊ້ `response_type=token`). 34 | - [ ] ໂຕແປ `state` ໃຫ້ໃຊ້ random hash ເພື່ອປ້ອງກັນ CSRF (Cross Site Request Forgery) ໃນຕອນ OAuth authentication. 35 | - [ ] ກຳນົດ scope ແລະ ມີການ validate scope ໂຕແປສຳລັບແຕ່ລະແອັບ. 36 | 37 | ## Input 38 | - [ ] ໃຊ້ຄຳສັ່ງ HTTP ຕາມ operation ທີ່ເຮັດ ເຊັ່ນ `GET (read)`, `POST (create)`, `PUT/PATCH (replace/update)` and `DELETE (to delete a record)` ແລະ ສົ່ງກັບດ້ວຍ `405 Method Not Allowed` ຖ້າບໍ່ມີການຮອງຮັບ request ດ້ວຍ method ນັ້ນໃນລະບົບ. 39 | - [ ] Validate `content-type` ໃນ header ຂາ request (Content Negotiation) ໂດຍຍອມໃຫ້ສົ່ງມາສະເພາະ format ທີ່ກຳນົດ (ຕົວຢ່າງ, `application/xml`, `application/json` ... ໆລໆ) ແລະ ຕອບກັບດ້ວຍ `406 Not Acceptable` ຖ້າ format ທີ່ສົ່ງມາບໍ່ຖືກ. 40 | - [ ] Validate `content-type` ຂອງ data ທີ່ຮັບມາທຸກຄັ້ງ(ຕົວຢ່າງ, `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json` ... ໆລໆ). 41 | - [ ] Validate ຂໍ້ມູນ user ໃສ່ເຂົ້າມາທຸກຄັ້ງເພື່ອປ້ອງກັນຊ່ອງໂຫວ່ທີ່ຖືກກັນຫຼາຍໆ (ຕົວຢ່າງ, `XSS`, `SQL-Injection`, `Remote Code Execution` ... ໆລໆ). 42 | - [ ] ຫ້າມເອົາຂໍ້ມູນທີ່ສຳຄັນໄປໄວ້ໃນ URL (ເຊັ່ນ /servicexxx?creditcardnum=1234) ແຕ່ໃຫ້ໄປໃສ່ໄວ້ໃນ authorization header ແທນ (`credentials`, `Passwords`, `security tokens`, ຫຼື `API keys`). 43 | - [ ] ໃຊ້ພຽງແຕ່ການເຂົ້າລະຫັດຂ້າງເຊີບເວີ. 44 | - [ ] ເຮັດ API Gateway ເພື່ອໃຫ້ສາມາດເຮັດ caching, Rate Limit, Spike Arrest, ແລະ ຈັດການຊັບພະຍາກອນສຳລັບ API ໄດ້ຢ່າງຍືດຍຸ່ນ. 45 | 46 | ## Processing 47 | - [ ] ກວດເບິ່ງວ່າ endpoints ທຸກຈຸດຢູ່ພາຍໃຕ້ authentication ເພື່ອປ້ອງກັນຊ່ອງໂຫວ່ທີ່ເຮັດໃຫ້ຄົນອື່ນມາເອີ້ນໃຊ້ໂດຍບໍ່ຈຳເປັນຕ້ອງພິສູດຕົວຕົນ. 48 | - [ ] ບໍ່ຄວນນຳ resource ID ຂອງ user ໄປໃຊ້ (`/user/654321/orders`) ແຕ່ໃຫ້ໄປໃຊ້ແບບ `/me/orders` ແທນ ເພື່ອປ້ອງກັນ user ປ່ຽນໄປໃຊ້ຂອງຄົນອື່ນ. 49 | - [ ] ເລກ ID ຂອງ user ບໍ່ຄວນມີການສ້າງແບບໄລ່ລຳດັບໄປເລື້ອຍໆ ແຕ່ໃຫ້ສ້າງ UUID ແທນ. 50 | - [ ] ຖ້າມີການ parsing ຟາຍ XML, ໃຫ້ປິດສ່ວນຂອງ Entity parsing ໄວ້ເພື່ອຫຼີກລ່ຽງທີ່ຈະຖືກຊ່ອງໂຫວ່ຕ່າງໆເຊັ່ນ (XML external entity attack, Billion Laughs/XML bomb). 51 | - [ ] If you are parsing XML files, make sure entity expansion is not enabled to avoid `Billion Laughs/XML bomb` via exponential entity expansion attack. 52 | - [ ] ໃຊ້ CDN ເມື່ອຈຳເປັນຕ້ອງມີການ upload ຟາຍຈາກ client. 53 | - [ ] ຫາກຕ້ອງເຈິກັບຂໍ້ມູນຂະໜາດໃຫຍ່ ໃຫ້ໃຊ້ Workers ກັບ ຄິວໃນການຈັດການເພື່ອໃຫ້ມີການຕອບຂໍ້ມູນກັບໄດ້ຢ່າງວ່ອງໄວຈະໄດ້ບໍ່ເກີດຄວາມສ່ຽງຂຶ້ນ. 54 | - [ ] ຢ່າລືມປິດໂໝດ DEBUG ໃນ code ຫາກເຮັດໄວ້. 55 | - [ ] ໃຊ້ stacks ທີ່ບໍ່ສາມາດປະຕິບັດໄດ້ເມື່ອມີ. 56 | 57 | ## Output 58 | - [ ] ຕັ້ງ `X-Content-Type-Options: nosniff` ໃນ header. 59 | - [ ] ຕັ້ງ`X-Frame-Options: deny` ໃນ header. 60 | - [ ] ຕັ້ງ `Content-Security-Policy: default-src 'none'` ໃນ header. 61 | - [ ] ເອົາ fingerprinting headers ອອກ - `X-Powered-By`, `Server`, `X-AspNet-Version` ໆລໆ. 62 | - [ ] ກຳນົດ content-type ໃນ response ເຊັ່ນຖ້າຕ້ອງການຂໍ້ມູນທີ່ເປັນ json ກັບໄປ ກໍເຊັດ `content-type` ເປັນ `application/json` ໄປເລີຍ. 63 | - [ ] ບໍ່ຕ້ອງສົ່ງຂໍ້ມູນສຳຄັນກັບໄປຫາ client (`credentials`, `Passwords`, `security tokens`). 64 | - [ ] ຕອບ status code ທີ່ກົງກັບ operation ກັບໄປ (ຕົວຢ່າງ, `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed` ... ໆລໆ). 65 | 66 | ## CI & CD 67 | - [ ] ກວດສອບ design ກັບ implementation ໃນຂັ້ນ unit/integration test ຢ່າງຄອບຄຸມ. 68 | - [ ] ໃຫ້ໃຊ້ code review process ບໍ່ແມ່ນວ່າໂຕເອງພໍໃຈກໍໂອເຄແລ້ວ. 69 | - [ ] ໝັ້ນໃຈວ່າທຸກຢ່າງ service ປອດໄວລັດແລ້ວກ່ອນຈະນຳຂຶ້ນ production ລວມໄປເຖິງ lib ຂອງພວກ vendor ກັບ dependencies ອື່ນໆ ອີກດ້ວຍ. 70 | - [ ] ດໍາເນີນການທົດສອບຄວາມປອດໄພຢ່າງຕໍ່ເນື່ອງ (ການວິເຄາະແບບຄົງທີ່ ແລະແບບເຄື່ອນໄຫວ) ໃນລະຫັດຂອງທ່ານ. 71 | - [ ] ກວດເບິ່ງຄວາມເພິ່ງພາອາໄສຂອງທ່ານ (ທັງຊອບແວ ແລະ OS) ສໍາລັບຊ່ອງໂຫວ່ທີ່ຮູ້ຈັກ. 72 | - [ ] ອອກແບບວິທີ rollback ໄວ້ກ່ອນຈະນຳຂຶ້ນໄປ ເພາະເວລາເກີດບັນຈະໄດ້ຍ້ອນກັບມາໃຊ້ version ເກົ່າໄປກ່ອນໄດ້ (ອາດເຈິໄດ້ຫຼາຍໃນຕອນພັດທະນາ feature ໃໝ່ໆ). 73 | 74 | ## Monitoring 75 | - [ ] Use centralized logins for all services and components. 76 | - [ ] Use agents to monitor all traffic, errors, requests, and responses. 77 | - [ ] Use alerts for SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Ensure that you aren't logging any sensitive data like credit cards, passwords, PINs, etc. 79 | - [ ] Use an IDS and/or IPS system to monitor your API requests and instances. 80 | 81 | 82 | --- 83 | 84 | ## ເບິ່ງສິ່ງນີ້ດ້ວຍ: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - ຊຸດແຫຼ່ງຂໍ້ມູນທີ່ເປັນປະໂຫຍດໃນການສ້າງ API RESTful HTTP+JSON. 86 | 87 | 88 | --- 89 | 90 | # Contribution 91 | Feel free to contribute by forking this repository, making some changes, and submitting pull requests. For any questions drop us an email at `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-mk.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API Безбедносна контролна листа 4 | Безбедносна контролна листа од најважните безбедносни контрамерки при дизајнирање, тестирање и пуштање во употреба на вашето API. 5 | 6 | 7 | --- 8 | 9 | ## Автентикација 10 | - [ ] Не користете `Basic Auth` Користете стандардна автентикација (п.р. [JWT](https://jwt.io/), [OAuth](https://oauth.net/)). 11 | - [ ] Не измислувајте топла вода за `Authentication`, `generation token`, `password storage`. Користете ги стандардите. 12 | - [ ] Користете `Max Retry` и затворските функции во Login. 13 | - [ ] Користете енкрипција на сите чувствителни податоци. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Користете случајно генериран и комплициран клуч (`JWT Secret`) за да направите што можно потешко погодување на токенот со испробување на секоја можна комбинација. 17 | - [ ] Не го извлекувајте алгоритмот од носивост. Присилете го алгоритмот во задниот дел (`HS256` или `RS256`). 18 | - [ ] Направете токенот да истече (`TTL`, `RTTL`) што е можно побрзо. 19 | - [ ] Не чувајте чувствителни податоци во JWR payload, може да се декодира [лесно](https://jwt.io/#debugger-io). 20 | - [ ] Избегнувајте да складирате премногу податоци. JWT обично се дели во header и тие имаат ограничување на големината. 21 | 22 | ## Пристап 23 | - [ ] Ограничете ги барањата (забавување) за да избегнете напади DDoS / brute-force. 24 | - [ ] Користете HTTPS на страната на серверот за да избегнете MITM (Man In The Middle Attack). 25 | - [ ] Користете `HSTS` насловот со SSL за да избегнете SSL Strip напад. 26 | - [ ] Исклучете ги списоците на директориуми. 27 | - [ ] За приватни API, дозволете пристап само од IP-а/домаќини на белата листа. 28 | 29 | ## Authorization 30 | 31 | ### OAuth 32 | - [ ] Секогаш проверувајте ја `redirect_uri` од страна на серверот за да дозволите само бела листа на адреси. 33 | - [ ] Секогаш обидувајте се да разменувате за код, а не токени (не дозволувајте `response_type = token`). 34 | - [ ] Користете `state` параметар со случаен хаш за да се спречи CSRF на процесот на автентикација на OAuth. 35 | - [ ] Дефинирајте го основниот опсег и проверете ги параметрите на опсегот за секоја апликација. 36 | 37 | ## Влез 38 | - [ ] Користете ја соодветната HTTP-метод според операцијата: "GET (read)", "POST (создади)", "PUT / PATCH (замени / ажурирај)" и "DELETE (за бришење на запис) 405 Метод не е дозволено` ако бараниот метод не е соодветен за бараниот ресурс. 39 | - [ ] Потврдете `content-type` на барање Accept header (Content Negotiation) за да го дозволите само вашиот поддржан формат (на пр.`application/xml`, `application/json`, итн) И да одговори со 406 Not Acceptable` одговор ако не се совпаѓа. 40 | - [ ] Потврдете ги `content-type` на објавените податоци што ги прифаќате (на пр., `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, итн.). 41 | - [ ] Потврдете го корисничкиот влез за да избегнете вообичаени слабости (п.р. `XSS`, `SQL-Injection`, `Remote Code Execution`, итн). 42 | - [ ] Не користете чувствителни податоци(`credentials`, `Passwords`, `security tokens`, или `API keys`) во URL-то, но користете стандарден заглавие за авторизација. 43 | - [ ] Користете само шифрирање од страна на серверот. 44 | - [ ] Користете API Gateway-услуга за да овозможите кеширање, политики за ограничување на тарифите (пр. `Quota`, `Spike Arrest`, `Concurrent Rate Limit`) и динамички да ги распоредите ресурсите за API-то. 45 | 46 | ## Processing 47 | - [ ] Проверете дали сите крајните точки се заштитени зад автентичност за да се избегне скршен процес на автентикација. 48 | - [ ] Треба да се избегнува идентификација на сопствени ресурси на сопственикот. Користете `/ me / orders` наместо` / user / 654321 / orders`. 49 | - [ ] Не автоматско зголемување на ID-ите. Наместо тоа, употребете `UUID`. 50 | - [ ] Ако ги анализирате XML-датотеките, проверете дали парсирањето на ентитетот не е овозможено за да се избегне `XXE` (напад на надворешен ентитет на XML). 51 | - [ ] Ако анализирате XML-датотеки, проверете дали проширувањето на ентитетот не е овозможено за да се избегне `Billion Laughs / XML бомба` преку експоненцијален напад на експанзија на ентитетот. 52 | - [ ] Користете CDN за закачување на фајлови. 53 | - [ ] Ако се занимавате со огромни количини на податоци, користете Workers and Queues за да процесирате што е можно повеќе во позадина и да го вратите одговорот брзо за да избегнете блокирање на HTTP. 54 | - [ ] Не заборавајте да го исклучите режимот DEBUG. 55 | - [ ] Користете неизвршни stack кога е достапно. 56 | 57 | ## Излез 58 | - [ ] Праќај `X-Content-Type-Options: nosniff` хедер. 59 | - [ ] Праќај `X-Frame-Options: deny` хедер. 60 | - [ ] Праќај `Content-Security-Policy: default-src 'none'` хедер. 61 | - [ ] Отстранете ги хедерите кој издаваат отповеќе податоци - `X-Powered-By`, `Server`, `X-AspNet-Version` итн. 62 | - [ ] Присилувај `content-type` " за твојот одговор, ако се вратиш `application/json` тогаш твојот одговор `content-type` е `application/json`. 63 | - [ ] Не враќајте чувствителни податоци како `credentials`, `Passwords`, `security tokens`. 64 | - [ ] Врати го соодветниот код за статусот според завршената операција. (п.р. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, итн). 65 | 66 | ## CI & CD 67 | - [ ] Ревизија на вашиот дизајн и имплементација со покриеност тестови за единица / интеграција. 68 | - [ ] Користете процес на прегледување на кодот и не дозволувајте самоодобрување. 69 | - [ ] Осигурајте се дека сите компоненти на вашите услуги се статички скенирани од AV-софтверот пред да се изврши притисок за производство, вклучувајќи библиотеки на продавачи и други зависности. 70 | - [ ] Континуирано извршувајте безбедносни тестови (статичка/динамичка анализа) на вашиот код. 71 | - [ ] Проверете ги вашите зависности (и софтвер и ОС) за познати пропусти. 72 | - [ ] Дизајн на rollback за во продукција. 73 | 74 | ## Monitoring 75 | - [ ] Use centralized logins for all services and components. 76 | - [ ] Use agents to monitor all traffic, errors, requests, and responses. 77 | - [ ] Use alerts for SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Ensure that you aren't logging any sensitive data like credit cards, passwords, PINs, etc. 79 | - [ ] Use an IDS and/or IPS system to monitor your API requests and instances. 80 | 81 | 82 | --- 83 | 84 | ## Исто така види: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - A collection of useful resources for building RESTful HTTP+JSON APIs. 86 | 87 | 88 | --- 89 | 90 | # Contribution 91 | Feel free to contribute by forking this repository, making some changes, and submitting pull requests. For any questions drop us an email at `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-ml.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API സുരക്ഷാ ചെക്ക്‌ലിസ്റ്റ് 4 | നിങ്ങളുടെ API ഡിസൈൻ ചെയ്യുമ്പോഴും ടെസ്റ്റ് ചെയ്യുമ്പോഴും റിലീസ് ചെയ്യുമ്പോഴും പാലിക്കേണ്ട ഏറ്റവും പ്രധാനപ്പെട്ട സുരക്ഷാ പ്രതിരോധ നടപടികളുടെ ചെക്ക്‌ലിസ്റ്റ്. 5 | 6 | 7 | --- 8 | 9 | ## ഒതെന്റിക്കേഷൻ 10 | - [ ] `Basic Auth` ഉപയോഗിക്കരുത്. പകരം സ്റ്റാൻഡേർഡ് ഓതെന്റിക്കേഷൻ ഉപയോഗിക്കുക (e.g. [JWT](https://jwt.io/), [OAuth](https://oauth.net/)). 11 | - [ ] `Authentication`, `token generation`, `password storage` എന്നിവയിൽ മുമ്പ് സൃഷ്ടിച്ച അടിസ്ഥാന രീതിയുടെ ആവർത്തനം ഉണ്ടാകരുത്. മാനദണ്ഡങ്ങൾ പാലിക്കുക. 12 | - [ ] ലോഗിനിൽ `Max Retry` യും ജയിൽ ഫീച്ചേഴ്സും ഉപയോഗിക്കുക. 13 | - [ ] എല്ലാ സെൻസിറ്റീവ് ഡാറ്റയിലും എൻക്രിപ്ഷൻ ഉപയോഗിക്കുക. 14 | 15 | ### JWT (JSON വെബ് ടോക്കൺ) 16 | - [ ] ഒരു റാൻഡം കോംപ്ലിക്കേറ്റഡ് കീ ( `JWT Secret`) ഉപയോഗിച്ച് ടോക്കണിനെ ബ്രൂട്ട് ഫോഴ്‌സ് ചെയ്യുന്നത് ബുദ്ധിമുട്ടുള്ളതാക്കാം. 17 | - [ ] ഹെയ്ഡറിൽ നിന്ന് അൽഗോരിതം വേര്തിരിച്ചെടുക്കരുത്. അൽഗോരിതത്തെ ബെക്കൻഡിൽ തന്നെ നിലനിർത്തുക (`HS256` അല്ലെങ്കിൽ `RS256`). 18 | - [ ] ടോക്കൺ കാലഹരണപ്പെടൽ (` TTL`, `RTTL`) കഴിയുന്നത്ര ചെറുതാക്കുക. 19 | - [ ] സെൻസിറ്റീവ് ഡാറ്റ JWT പേലോഡിൽ സൂക്ഷിക്കരുത്, അത് [എളുപ്പത്തിൽ](https://jwt.io/#debugger-io) ഡീകോഡ് ചെയ്യാം . 20 | - [ ] വളരെയധികം ഡാറ്റ സൂക്ഷിക്കുന്നത് ഒഴിവാക്കുക. JWT സാധാരണയായി headerകളിൽ പങ്കിടുന്നു, അവയ്‌ക്ക് വലുപ്പ പരിധിയുണ്ട്. 21 | 22 | ## ആക്സസ് 23 | - [ ] DDoS / ബ്രൂട്ട്-ഫോഴ്സ് ആക്രമണങ്ങൾ ഒഴിവാക്കാൻ റിക്വറ്റുകൾ (ത്രോട്ടിലിംഗ്) പരിമിതപ്പെടുത്തുക. 24 | - [ ] MITM (മാൻ ഇൻ ദ മിഡിൽ അറ്റാക്ക്) ഒഴിവാക്കാൻ സെർവർ സൈഡിൽ HTTPS ഉപയോഗിക്കുക. 25 | - [ ] SSL സ്ട്രിപ്പ് ആക്രമണം ഒഴിവാക്കാൻ SSL-നൊപ്പം `HSTS` ഹെഡർ ഉപയോഗിക്കുക. 26 | - [ ] ഡയറക്ടറി ലിസ്റ്റിംഗുകൾ ഓഫാക്കുക. 27 | - [ ] സ്വകാര്യ API-കൾക്കായി, വൈറ്റ്‌ലിസ്റ്റ് ചെയ്‌ത IP-കൾ/ഹോസ്റ്റുകളിൽ നിന്ന് മാത്രം ആക്‌സസ് അനുവദിക്കുക. 28 | 29 | ## Authorization 30 | 31 | ### OAuth 32 | - [ ] വൈറ്റ്‌ലിസ്റ്റ് ചെയ്‌ത URL-കൾ മാത്രം അനുവദിക്കുന്നതിന് സെർവർ സൈഡിൽ എല്ലായ്‌പ്പോഴും `redirect_uri` സാധൂകരിക്കുക. 33 | - [ ] എപ്പോഴും ടോക്കണുകൾ കൈമാറാതെ പകരം കോഡുകൾ കൈമാറാൻ ശ്രമിക്കുക (`response_type=token` അനുവദിക്കരുത്). 34 | - [ ] `state` പരാമീറ്ററിനോടൊപ്പം ഒരു റാൻഡം ഹാഷ് ഉപയോഗിച്ച് OAuth ഓതെന്റിക്കേഷൻ പ്രോസസ്സിലെ `CSRF` തടയാനാവും. 35 | - [ ] ഓരോ ആപ്ലിക്കേഷനും ഡിഫോൾട്ട് സ്കോപ്പ് നിർവചിക്കുകയും സ്കോപ്പ് പാരാമീറ്ററുകൾ സാധൂകരിക്കുകയും ചെയ്യുക. 36 | 37 | ## ഇൻപുട്ട് 38 | - [ ] പ്രവർത്തനത്തിനനുസരിച്ച് ശരിയായ HTTP രീതി ഉപയോഗിക്കുക: `GET (read)`, `POST (create)`, `PUT/PATCH (replace/update)`, and `DELETE (to delete a record)`, അഭ്യർത്ഥിച്ച ഉറവിടത്തിന് അഭ്യർത്ഥിച്ച രീതി അനുയോജ്യമല്ലെങ്കിൽ `405 Method Not Allowed` എന്ന് പ്രതികരിക്കുക. 39 | - [ ] Accept ഹെഡ്‍ർ (കണ്ടെന്റ് നെഗോഷിയേഷൻ) അവശ്യപെടുന്നതിനനുസരിച്ചു `content-type` വാലിഡേറ്റ് ചെയ്യുകയും സപ്പോർട്ട് ചെയ്യുന്ന ഫോർമാറ്റുകൾ മാത്രം അനുവദിക്കുകയും (ഉദാ. `application/xml`, `application/json`, മുതലായവ) പൊരുത്തപ്പെടുന്നില്ലെങ്കിൽ `406 Not Acceptable` എന്ന റെസ്പോൻഡ്‌സ് ഉപയോഗിച്ച് പ്രതികരിക്കുകയും ചെയ്യുക. 40 | - [ ] പോസ്റ്റ് ചെയ്‌ത ടാറ്റായുടെ `content-type` നിങ്ങൾ അനുവദിക്കുന്നതതിനനുസരിച് വാലിഡേറ്റ് ചെയ്യുക. (ഉദാ: `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, മുതലായവ). 41 | - [ ] പൊതുവായ വൾനറബിലിറ്റികൾ ഒഴിവാക്കാൻ യൂസർ ഇൻപുട്ട് സാധൂകരിക്കുക (ഉദാ: `XSS`, `SQL-ഇൻജെക്ഷൻ`, `റിമോട്ട് കോഡ് എക്സിക്യൂഷൻ`, മുതലായവ). 42 | - [ ] സെർവർ സൈഡ് എൻക്രിപ്ഷൻ മാത്രം ഉപയോഗിക്കുക. 43 | - [ ] സെർവർ സൈഡ് എൻക്രിപ്ഷൻ മാത്രം ഉപയോഗിക്കുക. 44 | - [ ] കാഷിംഗ്, നിരക്ക് പരിധി നയങ്ങൾ (ഉദാ. `Quota`, `Spike Arrest`, `Concurrent Rate Limit`) എന്നിവ പ്രവർത്തനക്ഷമമാക്കുന്നതിനും API-കളുടെ ഉറവിടങ്ങൾ ചലനാത്മകമായി വിന്യസിക്കുന്നതിനും ഒരു API ഗേറ്റ്‌വേ സേവനം ഉപയോഗിക്കുക. 45 | 46 | ## പ്രോസസ്സിംഗ് 47 | - [ ] തകർന്ന ഓതെന്റിക്കേഷൻ പ്രക്രിയ ഒഴിവാക്കാൻ എല്ലാ എൻഡ് പോയിന്റുകളും ഓതെന്റിക്കേഷൻന് പിന്നിൽ പരിരക്ഷിച്ചിട്ടുണ്ടോയെന്ന് പരിശോധിക്കുക. 48 | - [ ] ഉപയോക്താവിന്റെ സ്വന്തം റിസോഴ്സ് ഐഡി ഒഴിവാക്കണം. `/me/orders` പകരം `/user/654321/orders` ഉപയോഗിക്കുക. 49 | - [ ] ഐഡികൾ ഓട്ടോ-ഇൻക്രിമെന്റ് ചെയ്യരുത്. പകരം `UUID` ഉപയോഗിക്കുക. 50 | - [ ] നിങ്ങൾ XML ഫയലുകൾ പാഴ്‌സ് ചെയ്യുകയാണെങ്കിൽ, `XXE` (XML ബാഹ്യ എന്റിറ്റി ആക്രമണം) ഒഴിവാക്കുവാൻ എന്റിറ്റി പാഴ്‌സിംഗ് പ്രവർത്തനക്ഷമമാക്കിയിട്ടില്ലെന്ന് ഉറപ്പാക്കുക. 51 | - [ ] നിങ്ങൾ XML ഫയലുകൾ പാഴ്‌സ് ചെയ്യുകയാണെങ്കിൽ, `Billion Laughs/XML bomb` വഴി എക്‌സ്‌പോണൻഷ്യൽ എന്റിറ്റി എക്സ്പാൻഷൻ അറ്റാക്ക് ഒഴിവാക്കാൻ എന്റിറ്റി വിപുലീകരണം പ്രവർത്തനക്ഷമമാക്കിയിട്ടില്ലെന്ന് ഉറപ്പാക്കുക. 52 | - [ ] ഫയൽ അപ്‌ലോഡുകൾക്കായി ഒരു CDN ഉപയോഗിക്കുക. 53 | - [ ] നിങ്ങൾ വലിയ അളവിലുള്ള ഡാറ്റയാണ് കൈകാര്യം ചെയ്യുന്നതെങ്കിൽ, HTTP തടയൽ ഒഴിവാക്കുന്നതിന് പശ്ചാത്തലത്തിൽ കഴിയുന്നത്ര പ്രോസസ്സ് ചെയ്യാനും പ്രതികരണം വേഗത്തിൽ തിരികെ നൽകാനും വർക്കേഴ്സും ക്യൂകളും ഉപയോഗിക്കുക. 54 | - [ ] ഡീബഗ് മോഡ് ഓഫ് ചെയ്യാൻ മറക്കരുത്. 55 | - [ ] ലഭ്യമാകുമ്പോൾ എക്സിക്യൂട്ടബിൾ അല്ലാത്ത stackകൾ ഉപയോഗിക്കുക. 56 | 57 | ## ഔട്ട്പുട്ട് 58 | - [ ] `X-Content-Type-Options: nosniff` ഹെഡ്‍ർ അയയ്ക്കുക. 59 | - [ ] `X-Frame-Options: deny` ഹെഡ്‍ർ അയയ്ക്കുക. 60 | - [ ] `Content-Security-Policy: default-src 'none'` ഹെഡ്‍ർ അയയ്ക്കുക. 61 | - [ ] ഫിംഗർപ്രിന്റിങ് ഹെൽഡറുകൾ നീക്കം ചെയ്യുക - `X-Powered-By`, `Server`, `X-AspNet-Version` മുതലായവ. 62 | - [ ] `content-type` നെ നിങ്ങളുടെ പ്രതികരണത്തിനായി നിർബന്ധിക്കുക. നിങ്ങളുടെ പ്രതികരണം `application/json` ആണെങ്കിൽ, നിങ്ങളുടെ `content-type` പ്രതികരണവും `application/json` ആയിരിക്കും. 63 | - [ ] `Credentials`, `passwords` അല്ലെങ്കിൽ `security tokens` പോലുള്ള സെൻസിറ്റീവ് ഡാറ്റ നൽകരുത്. 64 | - [ ] പൂർത്തിയാക്കിയ പ്രവർത്തനത്തിനനുസരിച്ച് ശരിയായ സ്റ്റാറ്റസ് കോഡ് തിരികെ നൽകുക. (ഉദാ: `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, മുതലായവ). 65 | 66 | ## CI & CD 67 | - [ ] unit/integration tests കോവേജ് ഉപയോഗിച്ച് നിങ്ങളുടെ ഡിസൈനും ഇമ്പലമെന്റാഷനും ഔഡിഡ് ചെയ്യുക. 68 | - [ ] ഒരു കോഡ് റിവ്യൂ പ്രക്രിയ ഉപയോഗിക്കുക, സ്വയം അംഗീകാരം അവഗണിക്കുക. 69 | - [ ] വെണ്ടർ ലൈബ്രറികളും മറ്റ് ഡിപൻഡൻസികളും ഉൾപ്പെടെ ഉൽപ്പാദനത്തിലേക്ക് നീങ്ങുന്നതിന് മുമ്പ് നിങ്ങളുടെ സേവനങ്ങളുടെ എല്ലാ ഘടകങ്ങളും എവി സോഫ്‌റ്റ്‌വെയർ സ്ഥിരമായി സ്കാൻ ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക. 70 | - [ ] നിങ്ങളുടെ കോഡിൽ സുരക്ഷാ പരിശോധനകൾ (സ്റ്റാറ്റിക്/ഡൈനാമിക് അനാലിസിസ്) തുടർച്ചയായി പ്രവർത്തിപ്പിക്കുക. 71 | - [ ] അറിയപ്പെടുന്ന കേടുപാടുകൾക്കായി നിങ്ങളുടെ ഡിപൻഡൻസികൾ (സോഫ്‌റ്റ്‌വെയറും ഒഎസും) പരിശോധിക്കുക. 72 | - [ ] ഡിപ്ലോയ്‌മെന്റിനായി ഒരു റോൾബാക്ക് പരിഹാരം രൂപകൽപ്പന ചെയ്യുക. 73 | 74 | ## Monitoring 75 | - [ ] Use centralized logins for all services and components. 76 | - [ ] Use agents to monitor all traffic, errors, requests, and responses. 77 | - [ ] Use alerts for SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Ensure that you aren't logging any sensitive data like credit cards, passwords, PINs, etc. 79 | - [ ] Use an IDS and/or IPS system to monitor your API requests and instances. 80 | 81 | 82 | --- 83 | 84 | ## ഇതും കാണുക: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - RESTful HTTP+JSON API-കൾ നിർമ്മിക്കുന്നതിനുള്ള ഉപയോഗപ്രദമായ വിഭവങ്ങളുടെ ഒരു ശേഖരം. 86 | 87 | 88 | --- 89 | 90 | # സംഭാവന 91 | ഈ ശേഖരം ഫോർക്ക് ചെയ്തും ചില മാറ്റങ്ങൾ വരുത്തിയും പുൾ അഭ്യർത്ഥനകൾ സമർപ്പിച്ചും സംഭാവന ചെയ്യാൻ മടിക്കേണ്ടതില്ല. എന്തെങ്കിലും ചോദ്യങ്ങൾക്ക് ഞങ്ങൾക്ക് ഒരു ഇമെയിൽ അയയ്ക്കുക `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-mn.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API Аюулгүйн жагсаалт 4 | API гаргах, загварчлах, тестлэхэд аюулгүйн талаас авах сөрөг арга хэмжээний жагсаалт. 5 | 6 | 7 | --- 8 | 9 | ## Authentication 10 | - [ ] `Basic Auth` бүү ашигла, Стандарт authentication ашигла (Жнь. [JWT](https://jwt.io/), [OAuth](https://oauth.net/)). 11 | - [ ] `Authentication` -ын `token generation`, `password storage` зэргийг бүү дахин шинээр хий, стандарт ашигла. 12 | - [ ] Нэвтрэх(Login) үед `Max Retry` ашиглан хорилт хий. 13 | - [ ] Чухал өгөгдлүүдийг encrupt хий. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Санамсаргүй үүссэн түлхүүр (`JWT Secret`) ашиглаж token -ыг brute force -оос хамгаал. 17 | - [ ] Payload -аас алгоритмаа бүү задал. Backend дээрээ хий (`HS256` эсвэл `RS256`). 18 | - [ ] Токен дуусах хугацаа (`TTL`, `RTTL`) аль болох бага болго. 19 | - [ ] Чухал өгөгдлийг JWT payload -д бүү хадгал, decode хийхэд [амархан](https://jwt.io/#debugger-io). 20 | - [ ] Хэт их мэдээлэл хадгалахаас зайлсхий. JWT нь ихэвчлэн headers хэсэгт хуваагддаг бөгөөд тэдгээр нь хэмжээ хязгаартай байдаг. 21 | 22 | ## Access 23 | - [ ] Хүсэлтийн тоог хязгаарлаж (Throttling) DDoS / brute-force дайралтаас хамгаална. 24 | - [ ] HTTPS ашиглаж сервер талдаа MITM (Man In The Middle Attack) дайралтаас хамгаална. 25 | - [ ] `HSTS` header -ыг SSL дээр ашиглаж SSL Strip дайралтаас хамгаална. 26 | - [ ] Лавлах жагсаалтыг унтраа. 27 | - [ ] Хувийн API-уудын хувьд зөвхөн зөвшөөрөгдсөн жагсаалтад орсон IP/хостоос хандахыг зөвшөөрнө үү. 28 | 29 | ## Authorization 30 | 31 | ### OAuth 32 | - [ ] `redirect_uri` -ыг үргэлж сервер талд шалган зөвшөөрөгдсөн URL эсэхийг шалга. 33 | - [ ] Аль болох токен биш код солилц (`response_type=token` -ыг зөвшөөрч болохгүй). 34 | - [ ] OAuth authentication -ын үед `state` параметрийг санамсаргүй үүссэн hash ашиглан CSRF ээс сэргийлнэ. 35 | - [ ] Хувьсагчид анхны утга заавал оноож өг, утгыг байнга шалга. 36 | 37 | ## Input 38 | - [ ] Яг зөв HTTP хүсэлтийг ашигла: `GET (унших)`, `POST (үүсгэх)`, `PUT/PATCH (орлуулах/солих)`, мөн `DELETE (устгах)`, бас `405 Method Not Allowed` -ыг хүсэлтийн төрөл тодорхойгүй үед ашигла. 39 | - [ ] `content-type` -ыг хүсэлтийн header (Content Negotiation) дээр шалгаж зөвхөн дэмжигдсэн төрлийг зөвшөөр (Жнь. `application/xml`, `application/json`, гэх мэт) бас төрөл нь таарахгүй бол `406 Not Acceptable` хариу буцаа. 40 | - [ ] `content-type` -ыг post хийх өгөгдөл дээр шалга (Жнь. `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, г.м). 41 | - [ ] Хэрэглэгчээс гараас оруулсан утгыг шалгаж түгээмэл нүхнүүдээс сэргийлнэ. (Жнь. `XSS`, `SQL-Injection`, `Remote Code Execution`, г.м). 42 | - [ ] Чухал өгөгдлүүдийг (`credentials`, `Passwords`, `security tokens`, эсвэл `API keys`) URL ээр бүү явуул, оронд нь стандарт Authorization header ашигла. 43 | - [ ] Зөвхөн сервер талын шифрлэлтийг ашиглана уу. 44 | - [ ] API Gateway үйлчилгээ ашиглан Rate Limit Policies (Жнь. `Quota`, `Spike Arrest`, `Concurrent Rate Limit`) болон cache хийх, мөн API deploy хийхэд ашигла. 45 | 46 | ## Processing 47 | - [ ] Нэвтрэх явцад алдаа гарахаас сэргийлж бүх endpoint -уудыг нэвтрэх шаардлагатай эсэхийг шалгах. 48 | - [ ] Хэрэглэгчийн ID ашиглахаас зайлсхийх. `/user/654321/orders` үүний оронд `/me/orders` ашиглах. 49 | - [ ] Автоматаар нэмэгдэх ID бүү ашигла. `UUID` ашигла. 50 | - [ ] XML файл parse хийх үед entity parse бүү хий ингэснээр `XXE` (XML external entity attack) -аас сэргийлнэ. 51 | - [ ] XML файл parse хийх үед entity expansion бүү хий ингэснэр `Billion Laughs/XML bomb` дайралтаас сэргийлнэ. 52 | - [ ] Файл upload хийхэд CDN ашигла. 53 | - [ ] Их хэмжээний өгөгдөлтэй ажиллах үед Workers болон Queue ашиглан үйлдлийг аль болох background -д ажиллуулж хариуг хурдан явуулах нь HTTP Blocking -оос сэргийлнэ. 54 | - [ ] DEBUG горимыг унтраах. 55 | - [ ] Боломжтой үед гүйцэтгэх боломжгүй stack ашигла. 56 | 57 | ## Output 58 | - [ ] `X-Content-Type-Options: nosniff` header дээр явуул. 59 | - [ ] `X-Frame-Options: deny` header дээр явуул. 60 | - [ ] `Content-Security-Policy: default-src 'none'` header дээр явуул. 61 | - [ ] Ул мөр үлдээх `X-Powered-By`, `Server`, `X-AspNet-Version` header үүдыг устга. 62 | - [ ] `content-type` -ыг хүсэлтийн хариуд нь харгалзан буцаах, Хэрвээ `application/json` хүсэлт явсан бол хариуд нь `content-type` нь `application/json` байх. 63 | - [ ] Чухал өгөгдлүүд `credentials`, `Passwords`, `security tokens` бүү буцаа. 64 | - [ ] Тухайн ажилд тохирсон статус код илгээх. (Жнь. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, г.м). 65 | 66 | ## CI & CD 67 | - [ ] unit/integration тест ашиглан системийн загварчлал, хэрэгжилтийг шалгах. 68 | - [ ] Код шалгалт ашигла, мөн өөрөө өөрийгөө ч шалга. 69 | - [ ] Бүх тусдаа хэсгүүд бүр vendor сан, бусад нэмэлт сангууд бүгдийг нь AV програмаар статикаар шалга. 70 | - [ ] Код дээрээ аюулгүй байдлын тестийг (статик/динамик анализ) тасралтгүй ажиллуул. 71 | - [ ] Мэдэгдэж буй сул талуудыг өөрийн хамаарлыг (програм хангамж болон үйлдлийн систем) шалгана уу. 72 | - [ ] Ямар ч үед deploy хийхэд амар шийдэл гаргах. 73 | 74 | ## Monitoring 75 | - [ ] Use centralized logins for all services and components. 76 | - [ ] Use agents to monitor all traffic, errors, requests, and responses. 77 | - [ ] Use alerts for SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Ensure that you aren't logging any sensitive data like credit cards, passwords, PINs, etc. 79 | - [ ] Use an IDS and/or IPS system to monitor your API requests and instances. 80 | 81 | 82 | --- 83 | 84 | ## Мөн үзнэ үү: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - RESTful HTTP+JSON API-г бүтээхэд хэрэгтэй нөөцүүдийн цуглуулга. 86 | 87 | 88 | --- 89 | 90 | # Оролцоо 91 | Энэ рэпод оролцох бол fork хийж өөрчлөлтөө оруулаад pull request үүсгэнэ үү. Асуулт байвал бидэнтэй холбогдоорой `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-nl.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API Security Checklist 4 | Checklist met de belangrijkste tegenmaatregelen bij het ontwerpen, testen en uitbrengen van een API. 5 | 6 | 7 | --- 8 | 9 | ## Authenticatie 10 | - [ ] Gebruik geen `Basic Auth` Gebruik industrie standaarden (v.b. JWT, OAuth). 11 | - [ ] Vind het wiel niet opnieuw uit voor `Authenticatie`, `Genereren van Tokens` en `Opslaan van Wachtwoorden`. Gebruik de standaarden. 12 | - [ ] Gebruik `Max Retry` en Jail features in de login. 13 | - [ ] Encrypt alle gevoelige data. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Gebruik random ingewikkelde keys (`JWT Secret`) om brute forcing lastiger te maken. 17 | - [ ] Haal het algoritme niet uit de payload. Dwing het algoritme af in de backend (`HS256` of `RS256`). 18 | - [ ] Zet de token vervaltijd (`TTL`, `RTTL`) zo kort mogelijk. 19 | - [ ] Sla geen gevoelige data op in de JWT payload, deze is [makkelijk](https://jwt.io/#debugger-io) te decoderen. 20 | - [ ] Vermijd het opslaan van te veel gegevens. JWT wordt meestal gedeeld in headers en ze hebben een maximale grootte. 21 | 22 | ## Toegang 23 | - [ ] Limiteer het aantal requests om DDoS en/of Bruteforce aanvallen te ontkrachten. 24 | - [ ] Gebruik HTTPS aan de server zijde om MITM (Man In The Middle Attacks) tegen te gaan. 25 | - [ ] Gebruik de `HSTS` header i.c.m SSL om een SSL Strip attack te ontkrachten. 26 | - [ ] Schakel directoryvermeldingen uit. 27 | - [ ] Sta voor privé-API's alleen toegang toe vanaf op de witte lijst geplaatste IP's/hosts. 28 | 29 | ## Authorization 30 | 31 | ### OAuth 32 | - [ ] Valideer **ALTIJD** de `redirect_uri` op de server om alleen toegestane URL te accepteren. 33 | - [ ] Probeer altijd een exchange voor code, niet voor tokens (sta `response_type=token` niet toe). 34 | - [ ] Gebruik de `state` parameter met een random hash om CSRF op een OAuth authentication process te voorkomen. 35 | - [ ] Definieer een standaard scope, en valideer deze scope parameter voor elke applicatie. 36 | 37 | ## Invoer 38 | - [ ] Gebruik de correcte HTTP methode voor de operatie, `GET (lezen)`, `POST (schrijven)`, `PUT (vervangen/updaten)` and `DELETE (verwijderen)`. 39 | - [ ] Valideer de `content-type` header bij een request Accept header (Content Negotiation) om alleen de ondersteunde formaten toe te staan (b.v. `application/xml`, `application/json` ... enz) en stuur een `406 Not Acceptable` response als de `content-type` niet ondersteund is. 40 | - [ ] Valideer de `content-type` header van gestuurde data (b.v. `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json` ... enz). 41 | - [ ] Valideer de gebruiker invoer om veel voorkomende kwetsbaarheden te voorkomen (v.b. `XSS`, `SQL-Injection`, `Remote Code Execution` ... enz). 42 | - [ ] Gebruik geen gevoelige data (`credentials`, `Wachtwoorden`, `security tokens`, of `API keys`) in de URL, maar gebruik de standaard Authorization header. 43 | - [ ] Gebruik alleen versleuteling aan de serverzijde. 44 | - [ ] Gebruik een API Gateway service voor caching, policies (b.v. `Quota`, `Spike Arrest`, `Concurrent Rate Limit`) en voor het dynamisch deployen van API middelen. 45 | 46 | ## Processing 47 | - [ ] Controleer dat alle endpoints zijn beschermd achter de authenticatie om het omzeilen van authenticatie te voorkomen. 48 | - [ ] Gebruik `/me/orders` i.p.v. `/user/654321/orders` om het 'lekken' van id's te voorkomen. 49 | - [ ] Gebruik geen auto increment id's. Maak gebruik van `UUID`. 50 | - [ ] Als je XML files parsed, controleer dat entity parsing niet aan staat om `XXE` (XML external entity attack) te voorkomen. 51 | - [ ] Als je XML files parsed, controleer dat entity expansion niet aan staat om `Billion Laughs/XML bomb` te voorkomen via `exponential entity expansion attack`. 52 | - [ ] Gebruik CDN voor het uploaden van bestanden. 53 | - [ ] Als er met grote/mega hoeveelheden data gewerkt wordt, gebruik dan Workers en Queues om snel een response te geven en HTTP Blocking te voorkomen. 54 | - [ ] Vergeet niet om de DEBUG mode uit te zetten. 55 | - [ ] Gebruik niet-uitvoerbare stacks indien beschikbaar. 56 | 57 | ## Output 58 | - [ ] Stel de `X-Content-Type-Options: nosniff` header in. 59 | - [ ] Stel de `X-Frame-Options: deny` header in. 60 | - [ ] Stel de `Content-Security-Policy: default-src 'none'` header in. 61 | - [ ] Verwijder vingerafdruk headers - `X-Powered-By`, `Server`, `X-AspNet-Version` enz. 62 | - [ ] Dwing `content-type` headers af voor de response. Als je `application/json` antwoordt, dan is de `content-type` : `application/json`. 63 | - [ ] Stuur geen gevoelige data terug: `Gebruikersnamen`, `Wachtwoorden`, `security tokens`. 64 | - [ ] Geef de correcte HTTP antwoord code terug op basis van de uitgevoerde operatie (v.b. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed` ... enz). 65 | 66 | ## CI & CD 67 | - [ ] Controleer het ontwerp en de implementatie met unit/integration test dekking. 68 | - [ ] Gebruik een code review traject en controleer niet zelf je eigen code. 69 | - [ ] Scan de API voor het naar productie zetten door AV software, niet alleen eigen code maar ook de libraries en andere gebruikte dependencies. 70 | - [ ] Voer continu beveiligingstests (statische/dynamische analyse) uit op uw code. 71 | - [ ] Controleer uw afhankelijkheden (zowel software en besturingssysteem) op bekende kwetsbaarheden. 72 | - [ ] Ontwikkel een terugrol oplossing. 73 | 74 | ## Monitoring 75 | - [ ] Gebruik gecentraliseerde aanmeldingen voor alle services en componenten. 76 | - [ ] Gebruik agents om al het verkeer, fouten, verzoeken en reacties te monitoren. 77 | - [ ] Gebruik waarschuwingen voor SMS, Slack, E-mail, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Zorg ervoor dat u geen gevoelige gegevens registreert, zoals creditcards, wachtwoorden, pincodes, enz. 79 | - [ ] Gebruik een IDS- en/of IPS-systeem om uw API-verzoeken en instanties te monitoren. 80 | 81 | 82 | --- 83 | 84 | ## Zie ook: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Een verzameling nuttige bronnen voor het bouwen van RESTful HTTP+JSON API's. 86 | 87 | 88 | --- 89 | 90 | Translation by | Vertaling door :[S.Holzhauer](https://github.com/SHolzhauer) 91 | 92 | # Contribution 93 | Voel u vrij om bij te helpen door deze repository te fork, wijzigingen aan te brengen, en pull requests in te dienen. Voor vragen kunt u ons mailen op `team@shieldfy.io`. 94 | -------------------------------------------------------------------------------- /README-pl.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # Lista kontrolna bezpieczeństwa API 4 | Lista kontrolna najważniejszych metod zabezpieczenia podczas projektowania, testowania oraz wypuszczania własnego API. 5 | 6 | 7 | --- 8 | 9 | ## Uwierzytelnianie 10 | - [ ] Nie używaj `Basic Auth`. Użyj standardów uwierzytelniania (np. [JWT](https://jwt.io/), [OAuth](https://oauth.net/)). 11 | - [ ] Nie wynajduj koła na nowo podczas `Uwierzytelniania`, `generowanie tokenów`, `przechowywania haseł`. Użyj sprawdzonych standardów. 12 | - [ ] Dodaj `Maksymalną ilość prób` oraz inne opcje ograniczające podczas Logowania. 13 | - [ ] Szyfruj wszystkie wrażliwe (ważne) dane. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Użyj losowego, skomplikowanego klucza (`JWT Secret`) aby uczynić token bezpieczniejszym przeciw atakom typu `brute force`. 17 | - [ ] Algorytmy trzymaj w backendzie, nie upubliczniaj algorytmów. 18 | - [ ] Ustaw wygaszanie tokenów (`TTL`, `RTTL`) najkrótsze jak to możliwe. 19 | - [ ] Nie przechowuj wrażliwych danych w payloadzie `JWT`, mogą być one [łatwo zdekodowane](https://jwt.io/#debugger-io). 20 | - [ ] Unikaj przechowywania zbyt dużej ilości danych. JWT jest zwykle udostępniany w nagłówkach i ma limit rozmiaru. 21 | 22 | ## Dostęp 23 | - [ ] Ustaw limit zapytań (Throttling) aby uniknąć ataku DDoS / brute-force. 24 | - [ ] Użyj HTTPS aby uniknąć MITM (Man In The Middle Attack) - Ataku polegającego na pośrednictwie w wymianie informacji pomiędzy dwoma punktami np. klientem i serwerem. 25 | - [ ] Użyj nagłówka `HSTS` z SSL aby uniknąć SSL Strip attack. 26 | - [ ] Wyłącz wykazy katalogów. 27 | - [ ] W przypadku prywatnych API, zezwalaj na dostęp tylko z adresów IP/hostów umieszczonych na białej liście. 28 | 29 | ## Authorization 30 | 31 | ### OAuth 32 | - [ ] Zawsze waliduj `redirect_uri` po stronie serwera aby zezwolić tylko URL-om z dozwolonej listy (`whitelist`). 33 | - [ ] Zawsze próbuj wymienić kodem nie tokenami (nie zezwalaj na `response_type=token`). 34 | - [ ] Użyj parametru `state` z losowym hashem aby zabezpieczyć proces OAuth przed atakiem CSRF. 35 | - [ ] Zdefiniuj oraz waliduj zakres parametrów dla każdej aplikacji. 36 | 37 | ## Wejście 38 | - [ ] Użyj odpowiedniej metody protokołu HTTP dla danej operacji: `GET (odczyt)`, `POST (tworzenie)`, `PUT/PATCH (zmiana)`, and `DELETE (usuwanie)`, i odpowiadaj `405 Method Not Allowed` jeżeli metoda zapytania jest niepoprawna. 39 | - [ ] Waliduj `content-type` podczas zapytań i zezwalaj jedynie na wymagane typy danych (np. `application/xml`, `application/json`) oraz odpowiadaj `406 Not Acceptable` jeżeli nie pasują. 40 | - [ ] Waliduj `content-type` informacji przekazywanych metodą POST (np. `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`). 41 | - [ ] Waliduj informacje wprowadzane przez użytkownika, aby uniknąć zagrożeń (np.. `XSS`, `SQL-Injection`, `Zdalne Wykonanie Skryptu`). 42 | - [ ] Nie używaj żadnych wrażliwych danych w URL, zamiast tego użyj standardowego nagłówka Autoryzującego. 43 | - [ ] Użyj tylko szyfrowania po stronie serwera. 44 | - [ ] Użyj usługi API Gateway aby włączyć caching oraz np. `Quota`, `Spike Arrest`, `Concurrent Rate Limit`. 45 | 46 | ## Przetwarzanie 47 | - [ ] Sprawdź czy wszystkie endpointy są zabezpieczone uwierzytelnianiem aby uniknąć niautoryzowanego dostępu. 48 | - [ ] Unikaj ukazywania ID użytkownika. Użyj np. `/me/orders` zamiast `/users/654321/orders/`. 49 | - [ ] Nie używaj auto inkrementacji w polu ID. Zamiast tego użyj `UUID`. 50 | - [ ] Jeżeli parsujesz pliki XML, upewnij się, że jesteś odporny na `XXE` (XML external entity attack) oraz `Billion Laughs/XML bomb`. 51 | - [ ] Użyj CDN do przechowywania wysyłanych plików. 52 | - [ ] Jeżeli pracujesz z dużą ilością danych, użyj procesów Workers oraz kolejkowania Queues aby przetworzyć jak najwięcej w tle i zwrócić informacje szybko aby uniknąć blokowania HTTP. 53 | - [ ] Nie zapomnij o wyłączeniu trybu debugowania. 54 | - [ ] Użyj niewykonywalnych stacks jeśli są dostępne. 55 | 56 | ## Wyjście 57 | - [ ] Wyślij nagłówek `X-Content-Type-Options: nosniff`. 58 | - [ ] Wyślij nagłówek `X-Frame-Options: deny`. 59 | - [ ] Wyślij nagłówek `Content-Security-Policy: default-src 'none'`. 60 | - [ ] Usuń nagłówki cyfrowego odcisku palca (digital fingerprint) - `X-Powered-By`, `Server`, `X-AspNet-Version`. 61 | - [ ] Wymuś `content-type` podczas zwracania danych. Jeżeli zwracasz `application/json` wtedy twój `content-type` to `application/json`. 62 | - [ ] Nie zwracaj ważnych informacji jak `dane uwierzytelniające`, `hasła`, `tokeny bezpieczeństwa`. 63 | - [ ] Zwróc odpowiedni status w zależności od operacji. (np. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`). 64 | 65 | ## CI & CD 66 | - [ ] Przetestuj wszystkie rozwiązania stosując testy jednostkowe. 67 | - [ ] Oddaj kod do przejrzenia innym, poddaj go `code review`. 68 | - [ ] Upewnij się, że wszystkie komponenty twojej usługi są skanowane przez oprogramowanie antywirusowe przed wejściem na produkcje. Uwzględnij także zewnętrzne biblioteki. 69 | - [ ] Ciągle uruchamiaj testy bezpieczeństwa (analiza statyczna/dynamiczna) w swoim kodzie. 70 | - [ ] Sprawdź swoje zależności (zarówno oprogramowanie i system operacyjny) pod kątem znanych luk w zabezpieczeniach. 71 | - [ ] Stwórz możliwość szybkiego wycofania udostępnionego wdrożenia. 72 | 73 | ## Monitorowanie 74 | - [ ] Użyj ze scentralizowanych logowań dla wszystkich usług i komponentów. 75 | - [ ] Użyj agentów do monitorowania całego ruchu, błędów, żądań i odpowiedzi. 76 | - [ ] Użyj alertów dla SMS, Slack, Email, Telegram, Kibana, Cloudwatch, itp. 77 | - [ ] Upewnij się, że nie rejestrujesz żadnych poufnych danych, takich jak karty kredytowe, hasła, kody PIN, itp. 78 | - [ ] Użyj systemu IDS i/lub IPS do monitorowania żądań i instancji API. 79 | 80 | 81 | --- 82 | 83 | ## Zobacz także: 84 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - [ENG] Zbiór wartościowych narzędzi do tworzenia REST HTTP+JSON API. 85 | 86 | 87 | --- 88 | 89 | # Contribution 90 | Feel free to contribute by forking this repository, making some changes, and submitting pull requests. For any questions drop us an email at `team@shieldfy.io`. 91 | -------------------------------------------------------------------------------- /README-pt_BR.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API Security Checklist 4 | Lista das mais importantes medidas de segurança para o desenvolvimento, teste e publicação da sua API. 5 | 6 | 7 | --- 8 | 9 | ## Autenticação (_Authentication_) 10 | - [ ] Não use `Basic Auth`. Use padrões de autenticação (exemplo: JWT, OAuth). 11 | - [ ] Não reinvente a roda nos quesitos `Autenticação`, `geração de tokens` e `armazenamento de senhas`. Use os padrões recomendados para cada caso. 12 | - [ ] Implemente funcionalidades de limite (_`Max Retry`_) e bloqueio de tentativas de autenticação. 13 | - [ ] Use criptografia em todos os dados confidenciais. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Use uma chave de segurança aleatória e complicada (`JWT Secret`) para tornar ataques de força bruta menos eficientes. 17 | - [ ] Não utilize o algoritmo de criptografia informado no cabeçalho do payload. Force o uso de um algoritmo específico no _back-end_ (`HS256` ou `RS256`). 18 | - [ ] Defina o tempo de vida do _token_ (`TTL`, `RTTL`) o menor possível. 19 | - [ ] Não armazene informações confidenciais no JWT, pois elas podem ser [facilmente decodificadas](https://jwt.io/#debugger-io). 20 | - [ ] Evite armazenar muitos dados. JWT geralmente é compartilhado em headers e eles têm um limite de tamanho. 21 | 22 | ## Acesso (_Access_) 23 | - [ ] Limite a quantidade de requisições (_Throttling_) para evitar ataques DDoS e de força bruta. 24 | - [ ] Use HTTPS no seu servidor para evitar ataques MITM (_Man In The Middle Attack_). 25 | - [ ] Use cabeçalho `HSTS` com SSL para evitar ataques _SSL Strip_. 26 | - [ ] Desative as listagens de diretórios. 27 | - [ ] Para APIs privadas, permita o acesso apenas de IPs/hosts da lista branca (whitelist). 28 | 29 | ## Autorização (_Authorization_) 30 | 31 | ### OAuth 32 | - [ ] Sempre valide o `redirect_uri` no seu servidor através de uma lista de URLs conhecidas (previamente cadastradas). 33 | - [ ] Tente sempre retornar códigos de negociação, não o _token_ de acesso (não permita `response_type=token`). 34 | - [ ] Utilize o parâmetro `state` com um _hash_ aleatório para previnir CSRF no processo de autenticação OAuth. 35 | - [ ] Defina escopo de dados, e valide o parâmetro `scope` para cada aplicação. 36 | 37 | ## Requisição (_Input_) 38 | - [ ] Utilize o método HTTP apropriado para cada operação, `GET (obter)`, `POST (criar)`, `PUT/PATCH (trocar/atualizar)` e `DELETE (apagar)`. 39 | - [ ] Valide o tipo de conteúdo informado no cabeçalho `Accept` da requisição (_Content Negotiation_) para permitir apenas os formatos suportados pela sua API (ex. `application/xml`, `application/json` ... etc), respondendo com o status `406 Not Acceptable` se ele não for suportado. 40 | - [ ] Valide o tipo de conteúdo do conteúdo da requisição informado no cabeçalho `Content-Type` da requisição para permitir apenas os formatos suportados pela sua API (ex. `application/x-www-form-urlencoded`, `multipart/form-data, application/json` ... etc). 41 | - [ ] Valide o conteúdo da requisição para evitar as vulnerabilidades mais comuns (ex. `XSS`, `SQL-Injection`, `Remote Code Execution` ... etc). 42 | - [ ] Não utilize nenhuma informação sensível (credenciais, senhas, _tokens_ de autenticação) na URL. Use o cabeçalho `Authorization` da requisição. 43 | - [ ] Use apenas criptografia do lado do servidor. 44 | - [ ] Use um serviço _gateway_ para a sua API para habilitar _cache_, limitar acessos sucessivos (ex. por quantidade máxima permitida (_Quota_), por limitar tráfego em situações de estresse (_spike arrest_) ou por limitar o número de conexões simultâneas na sua API (_Concurrent Rate Limit_)), e facilitar o _deploy_ de novas funcionalidades. 45 | 46 | ## Processamento (_Processing_) 47 | - [ ] Verifique continuamente os _endpoints_ protegidos por autenticação para evitar falhas na proteção de acesso aos dados. 48 | - [ ] Não utilize a identificação do próprio usuário. Use `/me/orders` no lugar de `/user/654321/orders`. 49 | - [ ] Não utilize ID's incrementais. Use UUID. 50 | - [ ] Se você estiver processando arquivos XML, verifique que _entity parsing_ não está ativada para evitar ataques de XML externo (XXE - _XML external entity attack_). 51 | - [ ] Se você estiver processando arquivos XML, verifique que _entity expansion_ não está ativada para evitar _Billion Laughs/XML bomb_ através de ataques exponenciais de expansão de XML. 52 | - [ ] Use CDN para _uploads_ de arquivos. 53 | - [ ] Se você estiver trabalhando com uma grande quantidade de dados, use _workers_ e _queues_ (fila de processos) para retornar uma resposta rapidamente e evitar o bloqueio de requisições HTTP. 54 | - [ ] Não se esqueça de desativar o modo de depuração (_DEBUG mode OFF_). 55 | - [ ] Use stacks não executáveis quando disponíveis. 56 | 57 | ## Resposta (_Output_) 58 | - [ ] Envie o cabeçalho `X-Content-Type-Options: nosniff`. 59 | - [ ] Envie o cabeçalho `X-Frame-Options: deny`. 60 | - [ ] Envie o cabeçalho `Content-Security-Policy: default-src 'none'`. 61 | - [ ] Remova os cabeçalhos de identificação dos _softwares_ do servidor - `X-Powered-By`, `Server`, `X-AspNet-Version`. 62 | - [ ] Envie um cabeçalho `Content-Type` na sua resposta com o valor apropriado (ex. se você retorna um JSON, então envie um `Content-Type: application/json`). 63 | - [ ] Não retorne dados sensíveis como senhas, credenciais e tokens de autenticação. 64 | - [ ] Utilize o código de resposta apropriado para cada operação. Ex. `200 OK` (respondido com sucesso), `201 Created` (novo recurso criado), `400 Bad Request` (requisição inválida), `401 Unauthorized` (não autenticado), `405 Method Not Allowed` (método HTTP não permitido) ... etc. 65 | 66 | ## CI & CD 67 | - [ ] Monitore a especificação e implementação do escopo da sua API através de testes unitários e de integração. 68 | - [ ] Use um processo de revisão de código, ignorando sistemas de auto-aprovação. 69 | - [ ] Certifique-se de que todos os componentes de seus serviços sejam validados por _softwares_ AV (anti-vírus, anti-_malware_) antes de enviar para produção, incluindo as dependências de terceiros utilizadas. 70 | - [ ] Execute continuamente testes de segurança (análise estática/dinâmica) em seu código. 71 | - [ ] Verifique suas dependências (software e sistema operacional) para vulnerabilidades conhecidas. 72 | - [ ] Implemente funcionalidade de reversão de _deploy_ (_rollback_). 73 | 74 | ## Monitoramento (_Monitoring_) 75 | - [ ] Use logins centralizados para todos os serviços e componentes. 76 | - [ ] Use agentes para monitorar todo o tráfego, erros, solicitações, e respostas. 77 | - [ ] Use alertas para SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Verifique se você não está registrando dados confidenciais, como cartões de crédito, senhas, PINs, etc. 79 | - [ ] Use um sistema IDS e/ou IPS para monitorar as solicitações e instâncias de sua API. 80 | 81 | 82 | --- 83 | 84 | ## Veja também: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Uma coleção de recursos úteis para a construção de API RESTful HTTP+JSON. 86 | 87 | 88 | --- 89 | 90 | # Contribuindo 91 | Sinta-se livre para contribuir, fazendo um fork deste repositório, fazendo algumas alterações e enviando um PR. Dúvidas, envie um e-mail para `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-ru.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # Контрольный список безопасности API 4 | Чеклист наиболее важных контрмер по безопасности при разработке, тестировании и выпуске вашего API. 5 | 6 | 7 | --- 8 | 9 | ## Аутентификация 10 | - [ ] Не используйте `Basic Auth`. Используйте стандартную проверку подлинности (например: JWT, OAuth). 11 | - [ ] Не изобретайте велосипед для `аутентификации`, `создании токенов`, `хранения паролей`. Используйте стандарты, проверенные библиотеки. 12 | - [ ] Используйте `Max Retry` и функции jail во время аутентификации. 13 | - [ ] Используйте шифрование для всех конфиденциальных данных. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Используйте случайный сложный ключ (`JWT Secret`), чтобы сделать брут форс токена бесполезным. 17 | - [ ] Не полагайтесь на переданное в заголовках название алгоритма, лучше закрепите его константой на сервере (`HS256` или `RS256`). 18 | - [ ] Сделайте срок действия токена (`TTL`, `RTTL`) как можно короче. 19 | - [ ] Не храните конфиденциальные данные в JWT, его можно [легко декодировать.](https://jwt.io/#debugger-io). 20 | - [ ] Избегайте хранения слишком большого количества данных. JWT обычно используется в header, и они имеют ограничение по размеру. 21 | 22 | ## Доступ 23 | - [ ] Установите ограничение на кол-во запросов в минуту (Throttling, RPM-Limit), чтобы избежать DDoS / Brute Force атак. 24 | - [ ] Используйте HTTPS на стороне сервера, чтобы избежать [MITM](https://ru.wikipedia.org/wiki/Атака_посредника) (Man In The Middle Attack / атака "человек посередине"). 25 | - [ ] Используйте заголовок `HSTS` (HTTP Strict Transport Security) с SSL, чтобы избежать атаки SSL Strip (перехват SSL соединений). 26 | - [ ] Отключите списки каталогов. 27 | - [ ] Для частных API, разрешите доступ только с IP-адресов/хостов из белого списка. 28 | 29 | ## Авторизация 30 | 31 | ### OAuth 32 | - [ ] Всегда проверяйте `redirect_uri` на стороне сервера, чтобы разрешать только URL-адреса из белых списков (whitelist). 33 | - [ ] Всегда старайтесь использовать одноразовый code, а не токены (не использовать `response_type=token`). 34 | - [ ] Используйте параметр `state` со случайным хешем, чтобы предотвратить CSRF в процессе аутентификации OAuth. 35 | - [ ] Определите scope по умолчанию, а также проверяйте параметры для каждого приложения. 36 | 37 | ## Запрос 38 | - [ ] Используйте соответствующий HTTP-метод в соответствии с операцией: `GET (чтение)`, `POST (создание)`, `PUT / PATCH (замена / обновление)` и `DELETE (удаление)`, а также ответьте `405 Method Not Allowed`, если запрошенный метод не подходит для запрашиваемого ресурса. 39 | - [ ] Проверяй тип данных в заголовке `Accept`, чтобы разрешить только поддерживаемые форматы (например, `application/xml`, `application/json` и т.д.) И отвечайте `406 Not Acceptable`, если тип не поддерживается. 40 | - [ ] Проверяйте, сможете ли вы обработать тип получаемых данных (например, `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json` и т.д.). 41 | - [ ] Проверьте пользовательский ввод во избежание распространенных уязвимостей (например: `XSS`, `SQL-инъекций`, `удаленное выполнение кода` и т.д.). 42 | - [ ] Не передавайте конфиденциальные данные (`учетные данные`, `пароли`, `токены` или `ключи API`) в URL-адресе, вместо него используйте стандартный заголовок `Authorization`. 43 | - [ ] Используйте только шифрование на стороне сервера. 44 | - [ ] Используйте единый API-шлюз, чтобы можно было настроить кеширование, ограничение на кол-во запросов, Spike Arrest, а также динамическое развертывание API. 45 | 46 | ## Обработка 47 | - [ ] Проверьте, защищены ли все точки входа аутентификацией, чтобы не нарушить процедуру проверки подлинности. 48 | - [ ] Следует избегать ID собственного ресурса. Используйте `/me/orders` вместо `/user/654321/orders`. 49 | - [ ] Не используйте автоинкремент для ID. Вместо этого используйте `UUID`. 50 | - [ ] Если вы разбираете XML-файлы, убедитесь, что парсинг сущностей выключен, чтобы избежать `XXE` (XML external entity). 51 | - [ ] Если вы разбираете XML-файлы, убедитесь, что расширение сущности выключено, чтобы избежать `Billion Laughs / XML bomb` через атаку экспоненциального расширения сущностей. 52 | - [ ] Используйте CDN для загрузки файлов. 53 | - [ ] Если вы имеете дело с огромным количеством данных, используйте Workers and Queues, чтобы обрабатывать как можно больше в фоновом режиме и быстро возвращать ответ, чтобы избежать блокирования HTTP. 54 | - [ ] Не забудьте выключить режим отладки (debug). 55 | - [ ] Используйте неисполняемые stack когда они доступны. 56 | 57 | ## Ответ 58 | - [ ] Отправляйте заголовок `X-Content-Type-Options: nosniff`. 59 | - [ ] Отправляйте заголовок `X-Frame-Options: deny`. 60 | - [ ] Отправляйте заголовок `Content-Security-Policy: default-src 'none'`. 61 | - [ ] Удалите заголовки, которые могут помочь злоумышленнику в исследовании вашего ресурса на уязвимости - `X-Powered-By`, `Server`, `X-AspNet-Version` и т.д. 62 | - [ ] Зафиксируйте `Content-Type` для вашего ответа, если вы возвращаете `application/json`, тогда запрос должен быть в `application/json`. 63 | - [ ] Не возвращайте конфиденциальные данные, такие как `учетные данные`, `пароли`, `токены`. 64 | - [ ] Возвращайте код состояния в соответствии с итогами обработки. (Например: `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed` и т.д.). 65 | 66 | ## Непрерывная интеграция и Непрерывная доставка (CI & CD) 67 | - [ ] Проверяйте ваш проект во время CI/CD. Покрывайте код unit/интеграционными тестами. 68 | - [ ] Используйте процесс проверки кода (Code Review) коллегами. Не апрувьте сами себя (no Self-Approval). 69 | - [ ] Убедитесь, что ваше приложение сканируются с помощью антивирусов перед отправкой в прод, включая библиотеки и другие зависимости. 70 | - [ ] Постоянно запускайте тесты безопасности (статический/динамический анализ) вашего кода. 71 | - [ ] Проверьте свои зависимости (как программное обеспечение и ОС) на наличие известных уязвимостей. 72 | - [ ] Сделайте возможным быстрый откат на предыдущую версию. 73 | 74 | ## Мониторинг 75 | - [ ] Используйте централизованные входы для всех служб и компонентов. 76 | - [ ] Используйте агенты для мониторинга всего трафика, ошибок, запросов, и ответов. 77 | - [ ] Используйте оповещения для SMS, Slack, электронной почты, Telegram, Kibana, Cloudwatch, и т.д. 78 | - [ ] Убедитесь, что вы не регистрируете какие-либо конфиденциальные данные, такие как кредитные карты, пароли, PIN-коды, и т.д. 79 | - [ ] Используйте систему IDS и/или IPS для мониторинга запросов и экземпляров API. 80 | 81 | 82 | --- 83 | 84 | ## Смотрите также: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Сбор полезных ресурсов для создания RESTful HTTP+JSON API. 86 | 87 | 88 | --- 89 | 90 | # Вклад 91 | Не стесняйтесь вносить вклад, открывая этот репозиторий, внося некоторые изменения и отправляя `Pull Requests`. По любым вопросам напишите нам письмо по адресу `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-th.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API Security Checklist 4 | Checklist ที่ต้องให้ความสำคัญเมื่อมีการสร้าง API ในช่วงการออกแบบ ทดสอบระบบ และการปล่อยให้คนนอกใช้ 5 | 6 | 7 | --- 8 | 9 | ## Authentication (การพิสูจน์ตัวตน) 10 | - [ ] ไม่ควรใช้ `Basic Auth` (การ authen ปกติด้วยusername password) สำหรับการพิสูจน์ตัวตน แต่ให้ใช้รูปแบบมาตรฐานสากลแทน(e.g. JWT, OAuth). 11 | - [ ] ไม่ต้องเสียเวลาสร้างวิธี Authentication ใหม่ขึ้นมา ให้ใช้ที่มีอยู่ในมาตรฐานไปเลย 12 | - [ ] ให้มีการจำกัดจำนวนครั้งในการพยายาม authen และสร้างระบบล็อคกรณีพยายามเกินกำหนด 13 | - [ ] ข้อมูลที่สำคัญควรมีการเข้ารหัสเสมอ 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] key ในการ generate token ควรมีความซับซ้อนสูง เพื่อป้องกันการ brute force หาตัวเข้ารหัส 17 | - [ ] ไม่ควรมีการแกะข้อมูลหรือขั้นตอนการถอดข้อมูลในฝั่ง client. ให้มีเฉพาะในฝั่ง server เท่านั้น โดยอาจใช้วิธีเข้ารหัสด้วย HS256 หรือ RS256 เอา 18 | - [ ] พยายามให้ token หมดอายุให้ไวที่สุดเท่าที่จะเป็นไปได้ (`TTL`, `RTTL`) 19 | - [ ] ไม่ควรเก็บข้อมูลสำคัญใน payload ของ JWT เพราะอาจถูกแกะได้ [ง่าย](https://jwt.io/#debugger-io). 20 | - [ ] หลีกเลี่ยงการจัดเก็บข้อมูลมากเกินไป. JWT มักใช้ร่วมกันใน header และมีขนาดจำกัด. 21 | 22 | ## Access 23 | - [ ] จำกัดจำนวนสูงสุดของ request เพื่อป้องกัน DDoS / Bruteforce. 24 | - [ ] ใช้ https เพื่อป้องกัน MITM (Man In The Middle Attack). 25 | - [ ] ใช้ `HSTS` header กับ SSL เพื่อป้องกัน SSL Strip attack. 26 | - [ ] ปิดรายการไดเรกทอรี. 27 | - [ ] สำหรับ API ส่วนตัว อนุญาตการเข้าถึงจาก IP/โฮสต์ที่อนุญาตพิเศษเท่านั้น. 28 | 29 | ## Authorization 30 | 31 | ### OAuth 32 | - [ ] มีการ validate `redirect_uri` ในฝั่ง server โดยยอมรับuriเฉพาะที่มีอยู่ในลิสต์ที่เราเชื่อถือเท่านั้น (whitelist). 33 | - [ ] บังคับให้มีการใช้ response_type เป็น code เสมอ (พยายามเลี่ยง `response_type=token`). 34 | - [ ] ตัวแปร `state` ให้ใช้ random hash เพื่อป้องกัน CSRF (Cross Site Request Forgery) ในช่วง OAuth authentication. 35 | - [ ] กำหนด scope และมีการ validate scope ตัวแปรสำหรับแต่ละแอป. 36 | 37 | ## Input 38 | - [ ] ใช้คำสั่ง HTTP ตาม operation ที่ทำ เช่น `GET (read)`, `POST (create)`, `PUT/PATCH (replace/update)` and `DELETE (to delete a record)` และตอบกลับด้วย `405 Method Not Allowed` ถ้าไม่มีการรองรับ request ด้วย method นั้นในระบบ. 39 | - [ ] Validate `content-type` ใน header ขา request (Content Negotiation) โดยยอมให้ส่งมาเฉพาะ format ที่กำหนด (e.g. `application/xml`, `application/json`... และอื่นๆ) และตอบกลับด้วย `406 Not Acceptable` ถ้า format ที่ส่งมาไม่ถูก. 40 | - [ ] Validate `content-type` ของ data ที่รับมาทุกครั้ง(e.g. `application/x-www-form-urlencoded`, `multipart/form-data ,application/json`... ). 41 | - [ ] Validate ข้อมูลที่ user ใส่เข้ามาทุกครั้งเพื่อป้องกันช่องโหว่ที่โดนกันบ่อยๆ (e.g. `XSS`, `SQL-Injection`, `Remote Code Execution` ... etc). 42 | - [ ] ห้ามเอาข้อมูลสำคัญไปใส่ไว้ใน URL (เช่น /servicexxx?creditcardnum=1234) แต่ให้ไปแปะไว้ใน authorization header แทน (`credentials`, `Passwords`, `security tokens`, หรือ `API keys`) 43 | - [ ] ใช้การเข้ารหัสฝั่งเซิร์ฟเวอร์เท่านั้น. 44 | - [ ] ทำ API Gateway เพื่อให้สามารถทำ caching, Rate Limit, Spike Arrest, และการจัดสรรค์ทรัพยากรสำหรับ API ได้อย่างยืดหยุ่น. 45 | 46 | ## Processing 47 | - [ ] ตรวจดูว่า endpoints ทุกจุดอยู่ภายใต้ authentication เพื่อป้องกันช่องโหว่ที่ทำให้คนอื่นมาเรียกใช้โดยไม่จำเป็นต้องพิสูจน์ตัวตน. 48 | - [ ] ไม่ควรนำ resource ID ของ user ไปใช้ (`/user/654321/orders`) แต่ให้ไปใช้แบบ `/me/orders` แทน เพื่อป้องกัน user เปลี่ยนไปใช้ของคนอื่น. 49 | - [ ] เลข ID ของ user ไม่ควรมีการสร้างแบบไล่ลำดับเพิ่มไปเรื่อยๆ แต่ให้สร้าง UUID แทน. 50 | - [ ] ถ้ามีการ parsing ไฟล์ XML, ให้ปิดส่วนของ Entity parsing ไว้เพื่อเลี่ยงที่จะโดนช่องโหว่ต่างๆเช่น (XML external entity attack, Billion Laughs/XML bomb). 51 | - [ ] ใช้ CDN เมื่อจำเป็นต้องมีการ upload ไฟล์จาก client. 52 | - [ ] หากต้องเผชิญกับข้อมูลขนาดใหญ่ ให้ใช้ Workers กับ คิวในการจัดการเพื่อให้มีการตอบข้อมูลกลับได้อย่างรวดเร็วจะได้ไม่เกิดคอขวดขึ้น. 53 | - [ ] อย่าลืมปิดโหมด DEBUG ใน code หากทำไว้. 54 | - [ ] ใช้ stack ที่ไม่สามารถเรียกใช้งานได้เมื่อมี. 55 | 56 | ## Output 57 | - [ ] ตั้ง `X-Content-Type-Options: nosniff` ใน header. 58 | - [ ] ตั้ง `X-Frame-Options: deny` ใน header. 59 | - [ ] ตั้ง `Content-Security-Policy: default-src 'none'` ในheader. 60 | - [ ] เอา fingerprinting headers ออก - `X-Powered-By`, `Server`, `X-AspNet-Version` etc. 61 | - [ ] กำหนด content-type ใน response เช่นถ้าต้องการส่งข้อมูลที่เป็น json กลับไป ก็เซ็ต `content-type` เป็น `application/json` ไปเลย 62 | - [ ] ไม่ต้องส่งข้อมูลส่งข้อมูลสำคัญกลับไปหา client (`credentials`, `Passwords`, `security tokens`). 63 | - [ ] ตอบ status code ที่ตรงกับ operation กลับไป (e.g. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed` ... etc). 64 | 65 | ## CI & CD 66 | - [ ] ตรวจสอบ design กับ implementation ในขั้น unit/integration test อย่างครอบคลุม 67 | - [ ] ให้ใช้ code review process ไม่ใช่ว่าตัวเองพอใจก็โอเคแล้ว 68 | - [ ] มั่นใจว่าทุกอย่างใน service ปลอดไวรัสแล้วก่อนจะนำขึ้น production รวมถึง lib ของพวก vendor กับ dependencies อื่นๆด้วย 69 | - [ ] เรียกใช้การทดสอบความปลอดภัยอย่างต่อเนื่อง (การวิเคราะห์แบบสแตติก/ไดนามิก) ในโค้ดของคุณ. 70 | - [ ] ตรวจสอบการพึ่งพาของคุณ (ทั้งซอฟต์แวร์และระบบปฏิบัติการ) เพื่อหาช่องโหว่ที่ทราบ. 71 | - [ ] ออกแบบวิธี rollback ไว้ด้วยก่อนจะนำขึ้นไป เพราะเวลาเกิดปัญหาจะได้ย้อนกลับมาใช้ version เก่าไปก่อนได้ (อาจพบได้บ่อยตอนพัฒนา feature ใหม่ๆ) 72 | 73 | ## Monitoring 74 | - [ ] Use centralized logins for all services and components. 75 | - [ ] Use agents to monitor all traffic, errors, requests, and responses. 76 | - [ ] Use alerts for SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 77 | - [ ] Ensure that you aren't logging any sensitive data like credit cards, passwords, PINs, etc. 78 | - [ ] Use an IDS and/or IPS system to monitor your API requests and instances. 79 | 80 | 81 | --- 82 | 83 | ## ดูสิ่งนี้ด้วย: 84 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - ชุดของแหล่งข้อมูลที่เป็นประโยชน์สำหรับการสร้าง API RESTful HTTP+JSON. 85 | 86 | 87 | --- 88 | 89 | # Contribution 90 | Feel free to contribute by forking this repository, making some changes, and submitting pull requests. For any questions drop us an email at `team@shieldfy.io`. 91 | -------------------------------------------------------------------------------- /README-tr.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API Güvenlik Kontrol Listesi 4 | 5 | API'nizi tasarlarken, test ederken ve yayınlarken en önemli güvenlik önlemlerinin kontrol listesi. 6 | 7 | --- 8 | 9 | ## Kimlik Doğrulama 10 | - [ ] `Basic Auth` kullanmayın. Bunun yerine standardlaşmış kimlik doğrulama çözümlerini (örneğin [JWT](https://jwt.io/), [OAuth](https://oauth.net/) gibi) kullanmalısınız. 11 | - [ ] `Kimlik doğrulama`, `token oluşturma`, `şifreleri kaydetme` için tekerleği yeniden icat etmeye çalışmayın. Standartları kullanın. 12 | - [ ] `Deneme sayısını` sınırlayarak giriş hakkını kısıtlayın. 13 | - [ ] Tüm hassas verilerde şifreleme kullanın. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] (`JWT Secret`) gibi rastgele, karmaşık ve zor bir anahtar kullanarak kaba kuvvet ile token çözmeyi olabildiğince zorlaştırın. 17 | - [ ] Algoritmayı gelen veri üzerinden belirlemeyin. Arka uçta olmasını sağlayın. (`HS256` veya `RS256`). 18 | - [ ] Token'in son kullanma tarihini (`TTL`, `RTTL`) olabildiğince kısa yapın. 19 | - [ ] Hassas verilerinizi JWT payload içine koymayın, [Kolayca](https://jwt.io/#debugger-io) çözülebilir. 20 | - [ ] Çok fazla veri depolamaktan kaçının. JWT genellikle header'larda paylaşılır ve bunların bir boyut sınırı vardır. 21 | 22 | ## Erişim 23 | - [ ] DDoS ya da kaba kuvvet saldırılarından korunmak için istekleri sınırlamalısınız. 24 | - [ ] MITM (Man In The Middle Attack) saldırılarında korunmak için sunucu tarafında HTTPS kullanın. 25 | - [ ] SSL Strip saldırılarından korunmak için `HSTS` header'ı SSL ile kullan. 26 | - [ ] Dizin listelerini kapatın. 27 | - [ ] Özel API'ler için, yalnızca beyaz listedeki IP'lerden/host'lardan erişime izin verin. 28 | 29 | ## Yetki 30 | 31 | ### OAuth 32 | - [ ] Yalnızca beyaz listeye eklenen URL'lere izin vermek için sunucu tarafındaki `redirect_uri` bilgisini her zaman doğrulayın. 33 | - [ ] Her zaman code değiştirmeyi deneyin token değiştirmeyi değil (`response_type=token` kullanımına izin vermeyin). 34 | - [ ] OAuth kimlik doğrulama işlemi sırasında CSRF'yi önlemek için `state` parametresini rasgele hashleyerek kullanın. 35 | - [ ] Varsayılan kapsamı tanımlayın ve her uygulama için kapsam parametrelerini doğrulayın. 36 | 37 | ## Girdi 38 | - [ ] İşleme göre uygun HTTP yöntemini kullanın: `GET (okumak)`, `POST (oluşturmak)`, `PUT/PATCH (değiştirmek/güncellemk)`, ve `DELETE (bir kaydı silmek için)`, eğer istenen yöntem istenen kaynak için uygun değilse `405 Method Not Allowed` mesajı ile cevap verin. 39 | - [ ] Accept header gelen `content-type` beklediğiniz ve izin verdiğiniz formatta olup olmadığını kontrol edin. (ör. `application/xml`, `application/json`, v.b.) Format uyuşmuyorsa `406 Not Acceptable` mesajı ile cevap verin. 40 | - [ ] Gönderilen verileri doğrularken gelen verinin `content-type` değerini doğrulayın (ör. `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, v.b.). 41 | - [ ] Genel güvenlik açıklarını önlemek için kullanıcıdan gelen her veriyi doğrulayın (ör. `XSS`, `SQL-Injection`, `Remote Code Execution`, v.b.). 42 | - [ ] URL'de hassas veriler (`credentials`, `Passwords`, `security tokens`, veya `API keys`) kullanmayın, ancak standart Authorization header kullanın. 43 | - [ ] Yalnızca sunucu tarafı şifreleme kullanın. 44 | - [ ] Önbelleklemeyi ve hız sınır politikalarını (ör. `Quota`, `Spike Arrest`, `Concurrent Rate Limit`) etkinleştirmek için ve API kaynaklarını dinamik olarak dağıtmak için bir API Gateway hizmeti kullanın. 45 | 46 | ## İşleme 47 | - [ ] Kimlik doğrulama işleminin atlatılmasını önlemek için, tüm iştem uç noktalarının kimlik doğrulama arkasında korunup korunmadığını kontrol edin. 48 | - [ ] Kullanıcı için kendi kaynak ID'si kullanılmasından kaçınılmalıdır. `/me/orders` yerine `/user/654321/orders` kullanın. 49 | - [ ] Otomotik artan ID'ler kullanmayın. Yerine `UUID` kullanın. 50 | - [ ] Eğer XML dosyarını (parse) ayrıştırıyorsanız, varlık ayrıştırmasını önlemek için etkin olmadığını doğrulayın `XXE` (XML external entity attack). 51 | - [ ] Eğer XML dosyarını (parse) ayrıştırıyorsanız, `Billion Laughs/XML bomb` varlık genişletme saldırısı yoluyla,varlığın genişlemesinin önlemek için etkinleştirilmediğinden emin olun. 52 | - [ ] Dosya yüklemeleri için bir CDN kullanın. 53 | - [ ] Büyük miktarda veri ile uğraşıyorsanız, HTTP tıkanmasını engellemeyi önlemek için işleyici (Worker) ve kuyrukları (Queues) yapılarını arka planda işlem yapmak ve yanıtı hızlı bir şekilde yanıtlamak için mümkün oluğu kadar kullanın. 54 | - [ ] DEBUG modunu kapatmayı unutmayın! 55 | - [ ] Varsa yürütülemez yığınları kullanın. 56 | 57 | ## Çıktı 58 | - [ ] `X-Content-Type-Options: nosniff` header'ı gönderin. 59 | - [ ] `X-Frame-Options: deny` header'ı gönderin. 60 | - [ ] `Content-Security-Policy: default-src 'none'` header'ı gönderin. 61 | - [ ] Parmak izi header'larını kaldırın - `X-Powered-By`, `Server`, `X-AspNet-Version` v.b. 62 | - [ ] İsteğe verilen cevapta `content-type` kullanmaya zorlayın, eğer veriyi `application/json` olarak döndürürseniz, `content-type` karşılığı `application/json` olmalı. 63 | - [ ] `kimlik bilgileri` , `şifreleri` veya `güvenlik token'ları` gibi hassas verileri sonuç içinde göndermeyin. 64 | - [ ] İşlem tamamlandıktan sonra uygun durum kodunu döndürün. (ör. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, v.b.). 65 | 66 | ## CI & CD 67 | - [ ] unit/integration testi kapsamı ölçümleri ile tasarımınızı ve uygulamanızı denetleyin. 68 | - [ ] Bir kod inceleme süreci kullanın ve kendi onayınızı dikkate almayın. 69 | - [ ] Kodunuzu canlıya göndemreden önce harici kitaplıkları ve diğer bağımlılıklar da dahil olmak üzere hizmetlerinizin tüm bileşenlerinin AntiVirus yazılımıyla statik olarak tarandığından emin olun. 70 | - [ ] Kodunuz üzerinde sürekli olarak güvenlik testleri (statik/dinamik analiz) çalıştırın. 71 | - [ ] Bilinen güvenlik açıkları için bağımlılıklarınızı (hem yazılım hem de işletim sistemi) kontrol edin. 72 | - [ ] Dağıtımlar için bir geriye dönme çözümü tasarlayın. 73 | 74 | ## İzleme 75 | - [ ] Tüm hizmetler ve bileşenler için merkezi login kullanın. 76 | - [ ] Tüm trafiği, hataları, istekleri ve yanıtları izlemek için aracıları kullanın. 77 | - [ ] SMS, Slack, E-posta, Telegram, Kibana, Cloudwatch, vb. için uyarıları kullanın. 78 | - [ ] Kredi kartları, parolalar, PIN'ler, vb. hassas verileri günlüğe kaydetmediğinizden emin olun. 79 | - [ ] API isteklerinizi ve örneklerinizi izlemek için bir IDS ve/veya IPS sistemi kullanın. 80 | 81 | 82 | --- 83 | 84 | ## Ek kaynaklar: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - RESTful HTTP+JSON API'leri oluşturmak için kullanışlı kaynakların bir koleksiyonu. 86 | 87 | 88 | --- 89 | 90 | # katkı 91 | Bu depoyu forklayarak, bazı değişiklikler yaparak ve pull requests göndererek katkıda bulunmaktan çekinmeyin. Herhangi bir sorunuz için bize bir e-posta bırakın: `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-tw.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # 開發安全的 API 所需要核對的清單 4 | 以下是當你在設計, 測試以及發佈你的 API 的時候所需要核對的重要安全措施. 5 | 6 | 7 | --- 8 | 9 | ## 身份認證 10 | - [ ] 不要使用 `Basic Auth`, 使用標準的認證協議取而代之 (如 JWT, OAuth). 11 | - [ ] 不要再造 `Authentication`, `token generating`, `password storing` 這些輪子, 使用標準的. 12 | - [ ] 在登錄中使用 `Max Retry` 和自動封禁功能. 13 | - [ ] 加密所有的敏感數據. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] 使用隨機複雜的密鑰 (`JWT Secret`) 以增加暴力破解的難度. 17 | - [ ] 不要在請求體中直接提取數據, 要對數據進行加密 (`HS256` 或 `RS256`). 18 | - [ ] 使 token 的過期時間儘量的短 (`TTL`, `RTTL`). 19 | - [ ] 不要在 JWT 的請求體中存放敏感數據, 它是[可破解的](https://jwt.io/#debugger-io). 20 | - [ ] 避免存儲過多的數據。 JWT 通常在標頭中共享,並且它們有大小限制。 21 | 22 | ## 訪問 23 | - [ ] 限制流量來防止 DDoS 攻擊和暴力攻擊. 24 | - [ ] 在服務端使用 HTTPS 協議來防止 MITM 攻擊. 25 | - [ ] 使用 `HSTS` 協議防止 SSLStrip 攻擊. 26 | - [ ] 關閉目錄列表。 27 | - [ ] 對於私有 API,僅允許從列入白名單的 IP/主機進行訪問。 28 | 29 | ## Authorization 30 | 31 | ### OAuth 授權或認證協議 32 | - [ ] 始終在後台驗證 `redirect_uri`, 只允許白名單的 URL. 33 | - [ ] 每次交換令牌的時候不要加 token (不允許 `response_type=token`). 34 | - [ ] 使用 `state` 參數並填充隨機的哈希數來防止跨站請求偽造(CSRF). 35 | - [ ] 對不同的應用分別定義默認的作用域和各自有效的作用域參數. 36 | 37 | ## 輸入 38 | - [ ] 使用與操作相符的 HTTP 操作函數, `GET (讀取)`, `POST (創建)`, `PUT (替換/更新)` 以及 `DELETE (刪除記錄)`, 如果請求的方法不適用於請求的資源則返回 `405 Method Not Allowed`. 39 | - [ ] 在請求頭中的 `content-type` 欄位使用內容驗證來只允許支持的格式 (如 `application/xml`, `application/json` 等等) 並在不滿足條件的時候返回 `406 Not Acceptable`. 40 | - [ ] 驗證 `content-type` 的發佈數據和你收到的一樣 (如 `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json` 等等). 41 | - [ ] 驗證用戶輸入來避免一些普通的易受攻擊缺陷 (如 `XSS`, `SQL-注入`, `遠程代碼執行` 等等). 42 | - [ ] 不要在 URL 中使用任何敏感的數據 (`credentials`, `Passwords`, `security tokens`, 或 `API keys`), 而是使用標準的認證請求頭. 43 | - [ ] 僅使用服務器端加密。 44 | - [ ] 使用一個 API Gateway 服務來啟用緩存、訪問速率限制 (如 `Quota`, `Spike Arrest`, `Concurrent Rate Limit`) 以及動態地部署 APIs resources. 45 | 46 | ## 處理 47 | - [ ] 檢查是否所有的終端都在身份認證之後, 以避免被破壞了的認證體系. 48 | - [ ] 避免使用特有的資源 id. 使用 `/me/orders` 替代 `/user/654321/orders` 49 | - [ ] 使用 `UUID` 代替自增長的 id. 50 | - [ ] 如果需要解析 XML 文件, 確保實體解析(entity parsing)是關閉的以避免 `XXE` 攻擊. 51 | - [ ] 如果需要解析 XML 文件, 確保實體擴展(entity expansion)是關閉的以避免通過指數實體擴展攻擊實現的 `Billion Laughs/XML bomb`. 52 | - [ ] 在文件上傳中使用 CDN. 53 | - [ ] 如果需要處理大量的數據, 使用 Workers 和 Queues 來快速響應, 從而避免 HTTP 阻塞. 54 | - [ ] 不要忘了把 DEBUG 模式關掉. 55 | - [ ] 可用時使用不可執行的堆棧。 56 | 57 | ## 輸出 58 | - [ ] 發送 `X-Content-Type-Options: nosniff` 頭. 59 | - [ ] 發送 `X-Frame-Options: deny` 頭. 60 | - [ ] 發送 `Content-Security-Policy: default-src 'none'` 頭. 61 | - [ ] 刪除指紋頭 - `X-Powered-By`, `Server`, `X-AspNet-Version` 等等. 62 | - [ ] 在響應中強制使用 `content-type`, 如果你的類型是 `application/json` 那麼你的 `content-type` 就是 `application/json`. 63 | - [ ] 不要返回敏感的數據, 如 `credentials`, `Passwords`, `security tokens`. 64 | - [ ] 在操作結束時返回恰當的狀態碼. (如 `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed` 等等). 65 | 66 | ## 持續整合和持續部署 67 | - [ ] 使用單元測試和整合測試來審計你的設計和實現. 68 | - [ ] 引入代碼審查流程, 不要自行批准更改. 69 | - [ ] 在推送到生產環境之前確保服務的所有組件都用殺毒軟件靜態地掃瞄過, 包括第三方庫和其它依賴. 70 | - [ ] 對您的代碼持續運行安全測試(靜態/動態分析)。 71 | - [ ] 檢查您的依賴項(軟件和操作系統)是否存在已知漏洞。 72 | - [ ] 為部署設計一個回滾方案. 73 | 74 | ## Monitoring 75 | - [ ] Use centralized logins for all services and components. 76 | - [ ] Use agents to monitor all traffic, errors, requests, and responses. 77 | - [ ] Use alerts for SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Ensure that you aren't logging any sensitive data like credit cards, passwords, PINs, etc. 79 | - [ ] Use an IDS and/or IPS system to monitor your API requests and instances. 80 | 81 | 82 | --- 83 | 84 | ## 也可以看看: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - 用於構建RESTful HTTP+JSON API的有用資源集合。 86 | 87 | 88 | --- 89 | 90 | # 貢獻 91 | 為此存儲庫創建一個 fork, 進行修改, 並提交 pull request 來貢獻. 如果您有任何問題, 請發送郵件至 `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-uk.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # Контрольний список безпеки API 4 | Контрольний список найбільш важливих контрзаходів безпеки при розробці, тестуванні та випуску вашого API. 5 | 6 | 7 | --- 8 | 9 | ## Аутентифікація 10 | - [ ] Не використовуйте `Basic Auth` Використовуйте стандартну перевірку справжності (наприклад: JWT, OAuth). 11 | - [ ] Не "винаходьте колесо" в `аутентіфікаціі`, `створенні токенів`, `зберіганні паролей`. Використовуйте стандарти. 12 | - [ ] Використовуйте `Max Retry` і функції jail в Login. 13 | - [ ] Користуйтеся шифруванням для всіх конфіденційних даних. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Використовуйте випадковий складний ключ (`JWT Secret`), щоб зробити брут форс токена дуже складним. 17 | - [ ] Не виймайте алгоритм з корисного навантаження. Внесіть алгоритм в бекенда (`HS256` або` RS256`). 18 | - [ ] Зробіть термін дії токена (`TTL`, `RTTL`) якомога коротшим. 19 | - [ ] Не зберігайте конфіденційні дані в корисне навантаження JWT, її можна [легко декодувати.](Https://jwt.io/#debugger-io). 20 | - [ ] Уникайте зберігання занадто великої кількості даних. JWT зазвичай спільно використовується в header, і вони мають обмеження на розмір. 21 | 22 | ## Доступ 23 | - [ ] Обмежте запити (Throttling), щоб уникнути DDoS атак / грубої сили (Brute Force). 24 | - [ ] Використовуйте HTTPS на стороні сервера, щоб уникнути MITM (Man In The Middle Attack / Атака посередника). 25 | - [ ] Використовуйте заголовок `HSTS` (HTTP Strict Transport Security) з SSL, щоб уникнути атаки SSL Strip (перехоплення SSL з'єднань). 26 | - [ ] Вимкніть списки каталогів. 27 | - [ ] Для приватних API, дозвольте доступ лише з IP-адрес/хостів із білого списку. 28 | 29 | ## Авторизація 30 | 31 | ### OAuth 32 | - [ ] Завжди перевіряйте `redirect_uri` на стороні сервера, щоб дозволяти тільки URL-адреси з білими списками. 33 | - [ ] Завжди намагайтеся обмінювати код, а не токени (не дозволяти `response_type = token`). 34 | - [ ] Використовуйте параметр `стану` з випадковим хешем, щоб запобігти CSRF в процесі аутентифікації OAuth. 35 | - [ ] Визначте область за замовчуванням і перевірте параметри області для кожної програми. 36 | 37 | ## Введення 38 | - [ ] Використовуйте відповідний HTTP-метод відповідно до операції: `GET (читання),` POST (створення) `,` PUT / PATCH (заміна / оновлення) `і` DELETE (для видалення запису) `, а також дайте відповідь` 405 Method Not Allowed`, якщо запитаний метод не підходить для запитуваного ресурсу. 39 | - [ ] Підтвердіть `тип вмісту` за запитом "Прийняти заголовок" (Консолідація контенту), щоб дозволити тільки підтримуваний формат (наприклад: `application/xml`, `application/json` і т.д.) І відповідайте з неприпустимим відповіддю 406, якщо він не узгоджений. 40 | - [ ] Перевіряйте вміст опублікованих даних `типу контенту` в міру їх прийняття (наприклад,` application/x-www-form-urlencoded`, `multipart/form-data`, `application/json` і т.д.). 41 | - [ ] Перевірте користувальницьке введення щоб уникнути поширених вразливостей (наприклад: `XSS`, `SQL-ін'єкцій`, `віддалене виконання коду` і т.д.). 42 | - [ ] Не використовуйте конфіденційні дані (`облікові дані`, `паролі`, `маркери безпеки` або `ключі API`) в URL-адресі, але використовуйте стандартний заголовок авторизації. 43 | - [ ] Використовуйте лише шифрування на стороні сервера. 44 | - [ ] Використовуйте службу шлюзу API, щоб активувати кешування, обмеження швидкості, спайк-арешт і динамічне розгортання ресурсів API. 45 | 46 | ## Обробка 47 | - [ ] Перевірте, чи захищені всі кінцеві точки за аутентифікацією, щоб не порушити процедуру перевірки автентичності. 48 | - [ ] Слід уникати ідентифікатора користувача власного ресурсу. Використовуйте `/me/orders` замість `/user/654321/orders`. 49 | - [ ] Не використовуйте автоінкремент для ID. Замість цього використовуйте `UUID`. 50 | - [ ] Якщо ви розбираєте XML-файли, переконайтеся, що синтаксичний аналіз сутностей не включений, щоб уникнути `атаки на зовнішній об'єкт XML` (XML external entity). 51 | - [ ] Якщо ви розбираєте XML-файли, переконайтеся, що розширення суті не включено, щоб уникнути `Billion Laughs / XML bomb` за допомогою експоненційної атаки розширення сутностей. 52 | - [ ] Використовуйте CDN для завантаження файлів. 53 | - [ ] Якщо ви маєте справу з величезною кількістю даних, використовуйте Workers and Queues, щоб обробляти якомога більше в фоновому режимі і швидко повертати відповідь, щоб уникнути блокування HTTP. 54 | - [ ] Не забудьте вимкнути режим DEBUG. 55 | - [ ] Використовуйте невиконувані stack якщо вони доступні. 56 | 57 | ## Виведення 58 | - [ ] Надсилайте заголовок `X-Content-Type-Options: nosniff`. 59 | - [ ] Надсилайте заголовок `X-Frame-Options: deny`. 60 | - [ ] Надсилайте заголовок `Content-Security-Policy: default-src 'none'`. 61 | - [ ] Видаліть заголовки відбитків пальців - `X-Powered-By`,` Server`, `X-AspNet-Version` і т.д. 62 | - [ ] Примусите `тип вмісту` для вашої відповіді, якщо ви повернете` application/json`, тоді ваш тип вмісту відповіді буде `application/json`. 63 | - [ ] Не повертайте конфіденційні дані, такі як `облікові дані`, `паролі`, `токени безпеки`. 64 | - [ ] Завжди повертайте код стану відповідно до завершеною роботою. (Наприклад: `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed` і т.д.). 65 | 66 | ## Безперервна інтеграція і Безперервне постачання (CI & CD) 67 | - [ ] Аудит вашого дизайну і реалізації з охопленням модулів / інтеграційних тестів. 68 | - [ ] Використовуйте процес перевірки коду і ігноруйте самоокупність. 69 | - [ ] Переконайтеся, що всі компоненти ваших служб статично скануються за допомогою антивірусів перед відправкою на виробництво, включаючи бібліотеки постачальників та інші залежності. 70 | - [ ] Постійно запускайте тести безпеки (статичний/динамічний аналіз) вашого коду. 71 | - [ ] Перевірте свої залежності (як програмне забезпечення, так і ОС) на відомі вразливості. 72 | - [ ] Створіть рішення відкату для розгортання. 73 | 74 | ## Моніторинг 75 | - [ ] Використовуйте централізований вхід для всіх служб і компонентів. 76 | - [ ] Використовуйте агентів для моніторингу всього трафіку, помилок, запитів і відповідей. 77 | - [ ] Використовуйте сповіщення для SMS, Slack, Email, Telegram, Kibana, Cloudwatch, тощо. 78 | - [ ] Переконайтеся, що ви не реєструєте жодних конфіденційних даних, таких як кредитні картки, паролі, PIN-коди, тощо. 79 | - [ ] Використовуйте систему IDS та/або IPS для моніторингу запитів і екземплярів API. 80 | 81 | 82 | --- 83 | 84 | ## Дивись також: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Набір корисних ресурсів для створення RESTful HTTP+JSON API. 86 | 87 | 88 | --- 89 | 90 | # Вклад 91 | Не соромтеся робити внесок, відкриваючи цей репозиторій, вносячи деякі зміни і відправляючи `Pull Requests`. З будь-яких питань напишіть нам лист за адресою `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-vi.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) 2 | 3 | # Danh sách các giải pháp an toàn cho API 4 | Những giải pháp an toàn và cách khắc phục khi thiết kế, kiểm tra và phát hành API cho ứng dụng của bạn. 5 | 6 | 7 | --- 8 | 9 | ## Xác thực (Authentication) 10 | - [ ] Không sử dụng `Basic Auth`. Sử dụng giao thức xác thực tiêu chuẩn (chẳng hạn [JWT](https://jwt.io/) hay [OAuth](https://oauth.net/)). 11 | - [ ] Không tự thiết kế lại các giải pháp `Authentication`, `token generation`, `password storage`. Hãy sử dụng các giải pháp tiêu chuẩn. 12 | - [ ] Sử dụng `Max Retry` và chức năng Auto Block ở trang Login. 13 | - [ ] Mã hóa các dữ liệu nhạy cảm. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Sử dụng khóa ngẫu nhiên (`JWT Secret`) để tăng sự khó khăn của việc tấn công Brute Force. 17 | - [ ] Không sử dụng các thuật toán có trong `Payload` của người dùng. Bắt buộc sử dụng thuật toán phía backend (`HS256` hoặc `RS256`). 18 | - [ ] Đặt thời hạn token (`TTL`, `RTTL`) càng ngắn càng tốt. 19 | - [ ] Không lưu các thông tin nhạy cảm trong JWT, nó có thể [dễ dàng](https://jwt.io/#debugger-io) được giải mã. 20 | - [ ] Tránh lưu trữ quá nhiều dữ liệu. JWT thường được chia sẻ trong header và chúng có giới hạn về kích thước. 21 | 22 | ## Quyền 23 | - [ ] Giới hạn request (Throttling) để phòng tránh các tấn công DDoS / brute-force. 24 | - [ ] Sử dụng giao thức HTTPS ở phía server để tránh MITM (Man In The Middle Attack). 25 | - [ ] Sử dụng `HSTS` header với SSL để tránh tấn công SSL Strip. 26 | - [ ] Tắt danh sách thư mục. 27 | - [ ] Đối với các API riêng tư, chỉ cho phép truy cập từ các IP / máy chủ có trong danh sách cho phép / danh sách trắng / whitelist. 28 | 29 | ## Ủy quyền (Authorization) 30 | 31 | ### OAuth Ủy quyền hoặc chứng thực giao thức 32 | - [ ] Luôn xác nhận `redirect_uri` phía server để chỉ cho phép redirect đến các URL tin cậy. 33 | - [ ] Ưu tiên sử dụng `response_type=code` thay vì `response_type=token`). 34 | - [ ] Sử dụng tham số `state` cùng một giá trị hash ngẫu nhiên để chống lại tấn công CSRF trong quá trình xác thực OAuth. 35 | - [ ] Định nghĩa phạm vi mặc định, và xác nhận các tham số phạm vi cho mỗi ứng dụng. 36 | 37 | ## Input 38 | - [ ] Sử dụng các HTTP method phù hợp với từng hành động: `GET (đọc)`, `POST (tạo mới)`, `PUT/PATCH (cập nhật/sửa)`, `DELETE (để xóa bản ghi)`, và phản hồi `405 Method Not Allowed` nếu HTTP method không phù hợp với tài nguyên được request. 39 | - [ ] Xác nhận dữ liệu `content-type` ở mỗi tiêu đề (Content Negotiation) chỉ cho phép những định dạng được hỗ trợ (chẳng hạn như. `application/xml`, `application/json`, vv) và phản hồi `406 Not Acceptable` nếu không khớp. 40 | - [ ] Xác nhận dữ liệu `content-type` được chấp nhận khi gửi lên (chẳng hạn như. `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`...). 41 | - [ ] Kiểm tra dữ liệu truyền lên từ người dùng để tránh các lỗ hổng phổ biến (chẳng hạn như `XSS`, `SQL-Injection`, `Remote Code Execution`...). 42 | - [ ] Không sử dụng các dữ liệu nhạy cảm như (`credentials`, `Passwords`, `security tokens`, hoặc `API keys`) tại URL, sử dụng header Authorization để xác thực. 43 | - [ ] Chỉ sử dụng mã hóa phía máy chủ. 44 | - [ ] Sử dụng API Gateway để kích hoạt cache, Rate Limit policies (chẳng hạng như. `Quota`, `Spike Arrest`, `Concurrent Rate Limit`) và deploy APIs resources linh động hơn. 45 | 46 | ## Processing 47 | - [ ] Đảm bảo rằng các endpoint chỉ xử lý dữ liệu sau khi đã qua bước xác thực. 48 | - [ ] Nên tránh việc sử dụng ID của tài nguyên. Sử dụng `/me/orders` thay vì `/user/654321/orders`. 49 | - [ ] Không nên thiết kế ID dạng tự động tăng. Sử dụng UUID để thay thế. 50 | - [ ] Nếu bạn muốn parse XML, hãy chắc chắn rằng `entity parsing` không được kích hoạt để tránh tấn công `XXE` (XML external entity attack). 51 | - [ ] Nếu bạn muốn parse XML, hãy chắc chắn rằng `entity expansion` không được kích hoạt để tránh tấn công `Billion Laughs/XML bomb`. 52 | - [ ] Sử dụng CDN để tải lên tệp tin. 53 | - [ ] Nếu bạn đang cần xử lý với lượng dữ liệu lớn, sử dụng các kỹ thuật Workers và Queues để xử lý tác vụ dưới nền càng nhiều càng tốt và giúp phản hồi nhanh để tránh bị timeout HTTP. 54 | - [ ] Đừng quên tắt chế độ DEBUG. 55 | - [ ] Sử dụng stack không thực thi khi có sẵn. 56 | 57 | ## Output 58 | - [ ] Thêm `X-Content-Type-Options: nosniff` vào response headers. 59 | - [ ] Thêm `X-Frame-Options: deny` vào response headers. 60 | - [ ] Thêm `Content-Security-Policy: default-src 'none'` vào response headers. 61 | - [ ] Loại bỏ các header chứa thông tin nhạy cảm như phiên bản web server, ví dụ: `X-Powered-By`, `Server`, `X-AspNet-Version`, v.v... 62 | - [ ] Bắt buộc có `content-type` trong response headers, nếu bạn trả về `application/json` thì header `content-type` sẽ có giá trị `application/json`. 63 | - [ ] Không trả về client các thông tin nhạy cảm như `credentials`, `Passwords`, `security tokens`. 64 | - [ ] Trả về status code tương ứng với hành động đã hoàn thành. (chẳng hạn. `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`...). 65 | 66 | ## CI & CD (Tích hợp và triển khai liên tục) 67 | - [ ] Kiểm tra thiết kế và thực hiện đầy đủ việc test với unit/integration. 68 | - [ ] Áp dụng quy trình đánh giá code và bỏ qua việc tự phê duyệt. 69 | - [ ] Đảm bảo các thành phần của dịch vụ được quét với các anti virus trước khi đưa ra phiên bản production, bao gồm các thư viện và các gói khác. 70 | - [ ] Liên tục chạy các bài kiểm tra bảo mật (phân tích tĩnh/động) trên mã của bạn. 71 | - [ ] Kiểm tra các phần phụ thuộc của bạn (cả phần mềm và hệ điều hành) để tìm các lỗ hổng đã biết. 72 | - [ ] Thiết kế một giải pháp rollback cho việc triển khai. 73 | 74 | ## Giám sát (Monitoring) 75 | - [ ] Sử dụng đăng nhập tập trung cho tất cả các dịch vụ và thành phần. 76 | - [ ] Sử dụng các tác nhân để giám sát tất cả lưu lượng truy cập, lỗi, yêu cầu, và phản hồi. 77 | - [ ] Sử dụng cảnh báo cho SMS, Slack, Email, Telegram, Kibana, Cloudwatch, vv. 78 | - [ ] Đảm bảo rằng bạn không ghi nhật ký bất kỳ dữ liệu nhạy cảm nào thẻ tín dụng, mật khẩu, mã PIN, vv. 79 | - [ ] Sử dụng hệ thống IDS và/hoặc IPS để giám sát các yêu cầu và phản hồi của API của bạn. 80 | 81 | 82 | --- 83 | 84 | ## Xem thêm: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - Tập hợp các tài nguyên hữu ích để xây dựng API RESTful HTTP+JSON. 86 | 87 | 88 | --- 89 | 90 | # Đóng góp 91 | Hãy đóng góp bằng cách forking kho này, thực hiện một số thay đổi và gửi yêu cầu kéo. Đối với bất kỳ câu hỏi nào, hãy gửi email cho chúng tôi theo địa chỉ `team@shieldfy.io`. 92 | -------------------------------------------------------------------------------- /README-zh.md: -------------------------------------------------------------------------------- 1 | [English](./README.md) | [繁中版](./README-tw.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # 开发安全的 API 所需要核对的清单 4 | 5 | 以下是当你在设计,测试以及发布你的 API 的时候所需要核对的重要安全措施。 6 | 7 | --- 8 | 9 | ## 身份认证 10 | 11 | - [ ] 不要使用 `Basic Auth` ,请使用标准的认证协议(如 [JWT](https://jwt.io/),[OAuth](https://oauth.net/))。 12 | - [ ] 不要重新实现 `Authentication`、`token generating` 和 `password storing`,请使用标准库。 13 | - [ ] 限制密码错误尝试次数,并且增加账号冻结功能。 14 | - [ ] 加密所有的敏感数据。 15 | 16 | ### JWT(JSON Web Token) 17 | 18 | - [ ] 使用随机复杂的密钥(`JWT Secret`)以增加暴力破解的难度。 19 | - [ ] 不要在请求体中直接提取数据,要对数据进行加密(`HS256` 或 `RS256`)。 20 | - [ ] 使 token 的过期时间尽量的短(`TTL`,`RTTL`)。 21 | - [ ] 不要在 JWT 的请求体中存放敏感数据,因为它是[可解码的](https://jwt.io/#debugger-io)。 22 | - [ ] 避免存储过多的数据。 JWT 通常在标头中共享,并且它们有大小限制。 23 | 24 | ## 访问 25 | 26 | - [ ] 限制流量来防止 DDoS 攻击和暴力攻击。 27 | - [ ] 在服务端使用 HTTPS 协议来防止 MITM (中间人攻击)。 28 | - [ ] 使用 `HSTS` 协议防止 SSL Strip 攻击。 29 | - [ ] 关闭目录列表。 30 | - [ ] 对于私有 API,仅允许从列入白名单的 IP/主机进行访问。 31 | 32 | ## Authorization 33 | 34 | ### OAuth 授权或认证协议 35 | 36 | - [ ] 始终在后台验证 `redirect_uri`,只允许白名单的 URL。 37 | - [ ] 始终在授权时使用有效期较短的授权码(code)而不是令牌(access_token)(不允许 `response_type=token`)。 38 | - [ ] 使用随机哈希数的 `state` 参数来防止跨站请求伪造(CSRF)。 39 | - [ ] 对不同的应用分别定义默认的作用域和各自有效的作用域参数。 40 | 41 | ## 输入 42 | 43 | - [ ] 使用与操作相符的 HTTP 操作函数,`GET(读取)`,`POST(创建)`,`PUT(替换/更新)` 以及 `DELETE(删除记录)`,如果请求的方法不适用于请求的资源则返回 `405 Method Not Allowed`。 44 | - [ ] 在请求头中的 `content-type` 字段使用内容验证来只允许支持的格式(如 `application/xml`,`application/json` 等等)并在不满足条件的时候返回 `406 Not Acceptable`。 45 | - [ ] 验证 `content-type` 中申明的编码和你收到正文编码一致(如 `application/x-www-form-urlencoded`,`multipart/form-data`,`application/json` 等等)。 46 | - [ ] 验证用户输入来避免一些普通的易受攻击缺陷(如 `XSS`,`SQL-注入`,`远程代码执行` 等等)。 47 | - [ ] 不要在 URL 中使用任何敏感的数据(`credentials`,`Passwords`,`security tokens`,or `API keys`),而是使用标准的认证请求头。 48 | - [ ] 仅使用服务器端加密。 49 | - [ ] 使用一个 API Gateway 服务来启用缓存、限制访问速率(如 `Quota`,`Spike Arrest`,`Concurrent Rate Limit`)以及动态地部署 APIs resources。 50 | 51 | ## 处理 52 | 53 | - [ ] 检查是否所有的接口都包含必要都身份认证,以避免被破坏了的认证体系。 54 | - [ ] 避免使用特有的资源 id。使用 `/me/orders` 替代 `/user/654321/orders`。 55 | - [ ] 使用 `UUID` 代替自增长的 id。 56 | - [ ] 如果需要解析 XML 文件,确保实体解析(entity parsing)是关闭的以避免 `XXE` 攻击。 57 | - [ ] 如果需要解析 XML 文件,确保实体扩展(entity expansion)是关闭的以避免通过指数实体扩展攻击实现的 `Billion Laughs/XML bomb`。 58 | - [ ] 在文件上传中使用 CDN。 59 | - [ ] 如果数据处理量很大,尽可能使用队列或者 Workers 在后台处理来避免阻塞请求,从而快速响应客户端。 60 | - [ ] 不要忘了把 DEBUG 模式关掉。 61 | - [ ] 可用时使用不可执行的堆栈。 62 | 63 | ## 输出 64 | 65 | - [ ] 增加请求返回头 `X-Content-Type-Options: nosniff`。 66 | - [ ] 增加请求返回头 `X-Frame-Options: deny`。 67 | - [ ] 增加请求返回头 `Content-Security-Policy: default-src 'none'`。 68 | - [ ] 删除请求返回中的指纹头 - `X-Powered-By`,`Server`,`X-AspNet-Version` 等等。 69 | - [ ] 在响应中遵循请求的 `content-type`,如果你的请求类型是 `application/json` 那么你返回的 `content-type` 就是 `application/json`。 70 | - [ ] 不要返回敏感的数据,如 `credentials`,`Passwords`,`security tokens`。 71 | - [ ] 给请求返回使用合理的 HTTP 响应代码。(如 `200 OK`,`400 Bad Request`,`401 Unauthorized`,`405 Method Not Allowed` 等等)。 72 | 73 | ## 持续集成和持续部署 74 | 75 | - [ ] 使用单元测试以及集成测试的覆盖率来保障你的设计和实现。 76 | - [ ] 引入代码审查流程,禁止私自合并代码。 77 | - [ ] 在推送到生产环境之前确保服务的所有组件都用杀毒软件静态地扫描过,包括第三方库和其它依赖。 78 | - [ ] 对您的代码持续运行安全测试(静态/动态分析)。 79 | - [ ] 检查您的依赖项(软件和操作系统)是否存在已知漏洞。 80 | - [ ] 为部署设计一个回滚方案。 81 | 82 | ## 监控 83 | 84 | - [ ] 对所有服务和组件使用集中式登录。 85 | - [ ] 使用代理来监控所有流量、错误、请求和响应。 86 | - [ ] 使用短信,Slack,电子邮件,电报,Kibana, Cloudwatch等提醒。 87 | - [ ] 确保你没有记录任何敏感数据,如信用卡、密码、pin等。 88 | - [ ] 使用IDS和/或IPS系统监视您的API请求和实例。 89 | 90 | --- 91 | 92 | ## 也可以看看 93 | 94 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - 用于构建 RESTful HTTP + JSON API 的有用资源集合。 95 | 96 | --- 97 | 98 | # 贡献 99 | 100 | 为此存储库创建一个 fork,进行修改,并提交 pull request 来贡献。如果您有任何问题,请发送邮件至 `team@shieldfy.io`。 101 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [繁中版](./README-tw.md) | [简中版](./README-zh.md) | [العربية](./README-ar.md) | [বাংলা](./README-bn.md) | [Čeština](./README-cs.md) | [Deutsch](./README-de.md) | [Ελληνικά](./README-el.md) | [Español](./README-es.md) | [فارسی](./README-fa.md) | [Français](./README-fr.md) | [हिंदी](./README-hi.md) | [Indonesia](./README-id.md) | [Italiano](./README-it.md) | [日本語](./README-ja.md) | [한국어](./README-ko.md) | [ລາວ](./README-lo.md) | [Македонски](./README-mk.md) | [മലയാളം](./README-ml.md) | [Монгол](./README-mn.md) | [Nederlands](./README-nl.md) | [Polski](./README-pl.md) | [Português (Brasil)](./README-pt_BR.md) | [Русский](./README-ru.md) | [ไทย](./README-th.md) | [Türkçe](./README-tr.md) | [Українська](./README-uk.md) | [Tiếng Việt](./README-vi.md) 2 | 3 | # API Security Checklist 4 | Checklist of the most important security countermeasures when designing, testing, and releasing your API. 5 | 6 | 7 | --- 8 | 9 | ## Authentication 10 | - [ ] Don't use `Basic Auth`. Use standard authentication instead (e.g., [JWT](https://jwt.io/)). 11 | - [ ] Don't reinvent the wheel in `Authentication`, `token generation`, `password storage`. Use the standards. 12 | - [ ] Use `Max Retry` and jail features in Login. 13 | - [ ] Use encryption on all sensitive data. 14 | 15 | ### JWT (JSON Web Token) 16 | - [ ] Use a random complicated key (`JWT Secret`) to make brute forcing the token very hard. 17 | - [ ] Don't extract the algorithm from the header. Force the algorithm in the backend (`HS256` or `RS256`). 18 | - [ ] Make token expiration (`TTL`, `RTTL`) as short as possible. 19 | - [ ] Don't store sensitive data in the JWT payload, it can be decoded [easily](https://jwt.io/#debugger-io). 20 | - [ ] Avoid storing too much data. JWT is usually shared in headers and they have a size limit. 21 | 22 | ## Access 23 | - [ ] Limit requests (Throttling) to avoid DDoS / brute-force attacks. 24 | - [ ] Use HTTPS on server side with TLS 1.2+ and secure ciphers to avoid MITM (Man in the Middle Attack). 25 | - [ ] Use `HSTS` header with SSL to avoid SSL Strip attacks. 26 | - [ ] Turn off directory listings. 27 | - [ ] For private APIs, allow access only from whitelisted IPs/hosts. 28 | 29 | ## Authorization 30 | 31 | ### OAuth 32 | - [ ] Always validate `redirect_uri` server-side to allow only whitelisted URLs. 33 | - [ ] Always try to exchange for code and not tokens (don't allow `response_type=token`). 34 | - [ ] Use `state` parameter with a random hash to prevent CSRF on the OAuth authorization process. 35 | - [ ] Define the default scope, and validate scope parameters for each application. 36 | 37 | ## Input 38 | - [ ] Use the proper HTTP method according to the operation: `GET (read)`, `POST (create)`, `PUT/PATCH (replace/update)`, and `DELETE (to delete a record)`, and respond with `405 Method Not Allowed` if the requested method isn't appropriate for the requested resource. 39 | - [ ] Validate `content-type` on request Accept header (Content Negotiation) to allow only your supported format (e.g., `application/xml`, `application/json`, etc.) and respond with `406 Not Acceptable` response if not matched. 40 | - [ ] Validate `content-type` of posted data as you accept (e.g., `application/x-www-form-urlencoded`, `multipart/form-data`, `application/json`, etc.). 41 | - [ ] Validate user input to avoid common vulnerabilities (e.g., `XSS`, `SQL-Injection`, `Remote Code Execution`, etc.). 42 | - [ ] Don't use any sensitive data (`credentials`, `Passwords`, `security tokens`, or `API keys`) in the URL, but use standard Authorization header. 43 | - [ ] Use only server-side encryption. 44 | - [ ] Use an API Gateway service to enable caching, Rate Limit policies (e.g., `Quota`, `Spike Arrest`, or `Concurrent Rate Limit`) and deploy APIs resources dynamically. 45 | 46 | ## Processing 47 | - [ ] Check if all the endpoints are protected behind authentication to avoid broken authentication process. 48 | - [ ] User own resource ID should be avoided. Use `/me/orders` instead of `/user/654321/orders`. 49 | - [ ] Don't auto-increment IDs. Use `UUID` instead. 50 | - [ ] If you are parsing XML data, make sure entity parsing is not enabled to avoid `XXE` (XML external entity attack). 51 | - [ ] If you are parsing XML, YAML or any other language with anchors and refs, make sure entity expansion is not enabled to avoid `Billion Laughs/XML bomb` via exponential entity expansion attack. 52 | - [ ] Use a CDN for file uploads. 53 | - [ ] If you are dealing with huge amount of data, use Workers and Queues to process as much as possible in background and return response fast to avoid HTTP Blocking. 54 | - [ ] Do not forget to turn the DEBUG mode OFF. 55 | - [ ] Use non-executable stacks when available. 56 | 57 | ## Output 58 | - [ ] Send `X-Content-Type-Options: nosniff` header. 59 | - [ ] Send `X-Frame-Options: deny` header. 60 | - [ ] Send `Content-Security-Policy: default-src 'none'` header. 61 | - [ ] Remove fingerprinting headers - `X-Powered-By`, `Server`, `X-AspNet-Version`, etc. 62 | - [ ] Force `content-type` for your response. If you return `application/json`, then your `content-type` response is `application/json`. 63 | - [ ] Don't return sensitive data like `credentials`, `passwords`, or `security tokens`. 64 | - [ ] Return the proper status code according to the operation completed. (e.g., `200 OK`, `400 Bad Request`, `401 Unauthorized`, `405 Method Not Allowed`, etc.). 65 | 66 | ## CI & CD 67 | - [ ] Audit your design and implementation with unit/integration tests coverage. 68 | - [ ] Use a code review process and disregard self-approval. 69 | - [ ] Ensure that all components of your services are statically scanned by AV software before pushing to production, including vendor libraries and other dependencies. 70 | - [ ] Continuously run security tests (static/dynamic analysis) on your code. 71 | - [ ] Check your dependencies (both software and OS) for known vulnerabilities. 72 | - [ ] Design a rollback solution for deployments. 73 | 74 | ## Monitoring 75 | - [ ] Use centralized logins for all services and components. 76 | - [ ] Use agents to monitor all traffic, errors, requests, and responses. 77 | - [ ] Use alerts for SMS, Slack, Email, Telegram, Kibana, Cloudwatch, etc. 78 | - [ ] Ensure that you aren't logging any sensitive data like credit cards, passwords, PINs, etc. 79 | - [ ] Use an IDS and/or IPS system to monitor your API requests and instances. 80 | 81 | 82 | --- 83 | 84 | ## See also: 85 | - [yosriady/api-development-tools](https://github.com/yosriady/api-development-tools) - A collection of useful resources for building RESTful HTTP+JSON APIs. 86 | 87 | 88 | --- 89 | 90 | # Contribution 91 | Feel free to contribute by forking this repository, making some changes, and submitting pull requests. For any questions drop us an email at `team@shieldfy.io`. 92 | --------------------------------------------------------------------------------