[{"data":1,"prerenderedAt":12304},["ShallowReactive",2],{"navigation":3,"/sessions-cookies-state/session-security":1016,"/sessions-cookies-state/session-security-surround":12299},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":459,"body":1018,"description":1028,"extension":12294,"links":12295,"meta":12296,"navigation":2323,"path":460,"seo":12297,"stem":461,"__hash__":12298},"docs/10.sessions-cookies-state/05.session-security.md",{"type":1019,"value":1020,"toc":12283},"minimark",[1021,1025,1029,1034,1039,6514,6518,6522,10060,10064,10068,12276,12279],[1022,1023,459],"h1",{"id":1024},"session-security",[1026,1027,1028],"p",{},"Session security is critical for protecting user data and preventing various attacks. Django provides built-in security features, but understanding potential vulnerabilities and implementing additional security measures ensures robust protection against session-based attacks.",[1030,1031,1033],"h2",{"id":1032},"session-security-fundamentals","Session Security Fundamentals",[1035,1036,1038],"h3",{"id":1037},"common-session-vulnerabilities","Common Session Vulnerabilities",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","class SessionVulnerabilities:\n    \"\"\"Understanding common session security vulnerabilities\"\"\"\n    \n    @staticmethod\n    def session_hijacking():\n        \"\"\"Session hijacking attack vectors and prevention\"\"\"\n        \n        attack_vectors = {\n            'network_sniffing': {\n                'description': 'Intercepting session cookies over unencrypted connections',\n                'attack_method': 'Monitor network traffic to capture session IDs',\n                'prevention': [\n                    'Use HTTPS for all authenticated pages',\n                    'Set Secure flag on session cookies',\n                    'Implement HSTS headers',\n                    'Use certificate pinning where possible'\n                ],\n                'django_settings': {\n                    'SESSION_COOKIE_SECURE': True,\n                    'SECURE_SSL_REDIRECT': True,\n                    'SECURE_HSTS_SECONDS': 31536000,\n                    'SECURE_HSTS_INCLUDE_SUBDOMAINS': True\n                }\n            },\n            'xss_attacks': {\n                'description': 'JavaScript code stealing session cookies',\n                'attack_method': 'Inject malicious script to access document.cookie',\n                'prevention': [\n                    'Set HttpOnly flag on session cookies',\n                    'Implement proper XSS protection',\n                    'Validate and sanitize all user input',\n                    'Use Content Security Policy (CSP)'\n                ],\n                'django_settings': {\n                    'SESSION_COOKIE_HTTPONLY': True,\n                    'SECURE_CONTENT_TYPE_NOSNIFF': True,\n                    'SECURE_BROWSER_XSS_FILTER': True\n                }\n            },\n            'session_sidejacking': {\n                'description': 'Using stolen session ID to impersonate user',\n                'attack_method': 'Replay captured session cookie in requests',\n                'prevention': [\n                    'Bind sessions to IP addresses (with caution)',\n                    'Validate User-Agent consistency',\n                    'Implement session timeout',\n                    'Use additional authentication factors'\n                ]\n            }\n        }\n        \n        return attack_vectors\n    \n    @staticmethod\n    def session_fixation():\n        \"\"\"Session fixation attack and prevention\"\"\"\n        \n        attack_details = {\n            'attack_process': [\n                \"1. Attacker obtains valid session ID from application\",\n                \"2. Attacker tricks user into using this session ID\",\n                \"3. User authenticates using the fixed session ID\",\n                \"4. Attacker uses the same session ID to access user's account\"\n            ],\n            'prevention_methods': [\n                'Regenerate session ID on authentication',\n                'Regenerate session ID on privilege escalation',\n                'Validate session ownership',\n                'Use secure session ID generation'\n            ],\n            'django_implementation': \"\"\"\n            from django.contrib.auth import login\n            \n            def secure_login(request, user):\n                # Regenerate session key before login\n                request.session.cycle_key()\n                \n                # Perform login\n                login(request, user)\n                \n                # Additional security measures\n                request.session['login_ip'] = request.META.get('REMOTE_ADDR')\n                request.session['login_user_agent'] = request.META.get('HTTP_USER_AGENT')\n                request.session['login_timestamp'] = timezone.now().isoformat()\n            \"\"\"\n        }\n        \n        return attack_details\n    \n    @staticmethod\n    def csrf_attacks():\n        \"\"\"Cross-Site Request Forgery and session security\"\"\"\n        \n        csrf_details = {\n            'attack_mechanism': 'Trick authenticated user into performing unwanted actions',\n            'session_role': 'Attacker leverages existing session authentication',\n            'prevention': [\n                'Use Django CSRF protection',\n                'Validate Referer headers',\n                'Implement SameSite cookie policy',\n                'Use custom headers for AJAX requests'\n            ],\n            'django_protection': {\n                'middleware': 'django.middleware.csrf.CsrfViewMiddleware',\n                'template_tag': '{% csrf_token %}',\n                'ajax_header': 'X-CSRFToken',\n                'cookie_settings': {\n                    'CSRF_COOKIE_SECURE': True,\n                    'CSRF_COOKIE_HTTPONLY': True,\n                    'CSRF_COOKIE_SAMESITE': 'Strict'\n                }\n            }\n        }\n        \n        return csrf_details\n\n# Session security implementation\nclass SessionSecurityImplementation:\n    \"\"\"Implement comprehensive session security measures\"\"\"\n    \n    @staticmethod\n    def secure_session_middleware():\n        \"\"\"Enhanced session security middleware\"\"\"\n        \n        class SecureSessionMiddleware:\n            \"\"\"Comprehensive session security middleware\"\"\"\n            \n            def __init__(self, get_response):\n                self.get_response = get_response\n                self.max_session_age = 24 * 3600  # 24 hours\n                self.ip_validation_enabled = True\n                self.user_agent_validation_enabled = True\n            \n            def __call__(self, request):\n                # Validate session before processing request\n                if not self.validate_session_security(request):\n                    return self.handle_security_violation(request)\n                \n                response = self.get_response(request)\n                \n                # Update session security data after processing\n                self.update_session_security(request)\n                \n                return response\n            \n            def validate_session_security(self, request):\n                \"\"\"Comprehensive session validation\"\"\"\n                \n                if not hasattr(request, 'session') or request.session.is_empty():\n                    return True\n                \n                # Check session age\n                if not self.validate_session_age(request):\n                    logger.warning(f\"Session expired for user: {request.user}\")\n                    return False\n                \n                # Check IP consistency\n                if self.ip_validation_enabled and not self.validate_ip_consistency(request):\n                    logger.warning(f\"IP mismatch for session: {request.session.session_key}\")\n                    return False\n                \n                # Check User-Agent consistency\n                if self.user_agent_validation_enabled and not self.validate_user_agent(request):\n                    logger.warning(f\"User-Agent mismatch for session: {request.session.session_key}\")\n                    return False\n                \n                # Check for suspicious activity\n                if not self.validate_activity_patterns(request):\n                    logger.warning(f\"Suspicious activity detected: {request.session.session_key}\")\n                    return False\n                \n                return True\n            \n            def validate_session_age(self, request):\n                \"\"\"Validate session hasn't exceeded maximum age\"\"\"\n                \n                session_start = request.session.get('_security_session_start')\n                if not session_start:\n                    # First time seeing this session, record start time\n                    request.session['_security_session_start'] = timezone.now().isoformat()\n                    return True\n                \n                try:\n                    start_time = timezone.datetime.fromisoformat(session_start)\n                    age = timezone.now() - start_time\n                    return age.total_seconds() \u003C self.max_session_age\n                except (ValueError, TypeError):\n                    return False\n            \n            def validate_ip_consistency(self, request):\n                \"\"\"Validate IP address consistency\"\"\"\n                \n                current_ip = request.META.get('REMOTE_ADDR')\n                stored_ip = request.session.get('_security_ip')\n                \n                if not stored_ip:\n                    request.session['_security_ip'] = current_ip\n                    return True\n                \n                # Allow for proxy/load balancer IP changes\n                return self.is_ip_change_allowed(stored_ip, current_ip)\n            \n            def is_ip_change_allowed(self, stored_ip, current_ip):\n                \"\"\"Check if IP change is allowed (handle proxies/NAT)\"\"\"\n                \n                if stored_ip == current_ip:\n                    return True\n                \n                # Allow changes within same subnet (for corporate networks)\n                try:\n                    import ipaddress\n                    stored_network = ipaddress.ip_network(f\"{stored_ip}/24\", strict=False)\n                    current_addr = ipaddress.ip_address(current_ip)\n                    return current_addr in stored_network\n                except (ValueError, ipaddress.AddressValueError):\n                    return False\n            \n            def validate_user_agent(self, request):\n                \"\"\"Validate User-Agent consistency\"\"\"\n                \n                current_ua = request.META.get('HTTP_USER_AGENT', '')\n                stored_ua = request.session.get('_security_user_agent')\n                \n                if not stored_ua:\n                    request.session['_security_user_agent'] = current_ua\n                    return True\n                \n                # Allow minor version changes in browsers\n                return self.is_user_agent_similar(stored_ua, current_ua)\n            \n            def is_user_agent_similar(self, stored_ua, current_ua):\n                \"\"\"Check if User-Agent strings are similar enough\"\"\"\n                \n                if stored_ua == current_ua:\n                    return True\n                \n                # Extract browser and major version\n                import re\n                \n                def extract_browser_info(ua):\n                    patterns = [\n                        r'Chrome/(\\d+)',\n                        r'Firefox/(\\d+)',\n                        r'Safari/(\\d+)',\n                        r'Edge/(\\d+)'\n                    ]\n                    \n                    for pattern in patterns:\n                        match = re.search(pattern, ua)\n                        if match:\n                            return match.group(0).split('/')[0], match.group(1)\n                    \n                    return None, None\n                \n                stored_browser, stored_version = extract_browser_info(stored_ua)\n                current_browser, current_version = extract_browser_info(current_ua)\n                \n                # Allow same browser with version differences\n                return (stored_browser == current_browser and \n                       stored_browser is not None)\n            \n            def validate_activity_patterns(self, request):\n                \"\"\"Detect suspicious activity patterns\"\"\"\n                \n                # Track request frequency\n                now = timezone.now()\n                activity_log = request.session.get('_security_activity', [])\n                \n                # Clean old entries (keep last hour)\n                cutoff = now - timezone.timedelta(hours=1)\n                activity_log = [\n                    timestamp for timestamp in activity_log\n                    if timezone.datetime.fromisoformat(timestamp) > cutoff\n                ]\n                \n                # Add current request\n                activity_log.append(now.isoformat())\n                request.session['_security_activity'] = activity_log\n                \n                # Check for excessive requests (more than 100 per hour)\n                if len(activity_log) > 100:\n                    return False\n                \n                # Check for rapid-fire requests (more than 10 per minute)\n                recent_cutoff = now - timezone.timedelta(minutes=1)\n                recent_requests = [\n                    timestamp for timestamp in activity_log\n                    if timezone.datetime.fromisoformat(timestamp) > recent_cutoff\n                ]\n                \n                return len(recent_requests) \u003C= 10\n            \n            def handle_security_violation(self, request):\n                \"\"\"Handle detected security violations\"\"\"\n                \n                # Log security event\n                logger.error(\n                    f\"Session security violation: \"\n                    f\"session_key={getattr(request.session, 'session_key', 'None')}, \"\n                    f\"user={getattr(request, 'user', 'Anonymous')}, \"\n                    f\"ip={request.META.get('REMOTE_ADDR')}\"\n                )\n                \n                # Clear session\n                request.session.flush()\n                \n                # Redirect to login with security message\n                from django.contrib import messages\n                from django.shortcuts import redirect\n                \n                messages.warning(\n                    request,\n                    'Your session was terminated for security reasons. Please log in again.'\n                )\n                \n                return redirect('login')\n            \n            def update_session_security(self, request):\n                \"\"\"Update session security tracking data\"\"\"\n                \n                if hasattr(request, 'session') and not request.session.is_empty():\n                    request.session['_security_last_activity'] = timezone.now().isoformat()\n                    \n                    # Update request count\n                    request_count = request.session.get('_security_request_count', 0)\n                    request.session['_security_request_count'] = request_count + 1\n        \n        return SecureSessionMiddleware\n    \n    @staticmethod\n    def authentication_security():\n        \"\"\"Secure authentication and session management\"\"\"\n        \n        class SecureAuthenticationMixin:\n            \"\"\"Mixin for secure authentication handling\"\"\"\n            \n            def perform_secure_login(self, request, user):\n                \"\"\"Perform secure login with session regeneration\"\"\"\n                \n                from django.contrib.auth import login\n                \n                # Store pre-login session data that should persist\n                persistent_data = self.extract_persistent_session_data(request)\n                \n                # Regenerate session to prevent fixation\n                request.session.cycle_key()\n                \n                # Perform Django login\n                login(request, user)\n                \n                # Restore persistent data\n                for key, value in persistent_data.items():\n                    request.session[key] = value\n                \n                # Set security tracking data\n                self.initialize_session_security(request, user)\n                \n                # Log successful login\n                logger.info(\n                    f\"Secure login successful: user={user.username}, \"\n                    f\"ip={request.META.get('REMOTE_ADDR')}\"\n                )\n            \n            def extract_persistent_session_data(self, request):\n                \"\"\"Extract session data that should persist across login\"\"\"\n                \n                persistent_keys = [\n                    'shopping_cart',\n                    'language_preference',\n                    'theme_preference',\n                    'csrf_token'\n                ]\n                \n                return {\n                    key: request.session[key]\n                    for key in persistent_keys\n                    if key in request.session\n                }\n            \n            def initialize_session_security(self, request, user):\n                \"\"\"Initialize security tracking for new session\"\"\"\n                \n                security_data = {\n                    '_security_session_start': timezone.now().isoformat(),\n                    '_security_ip': request.META.get('REMOTE_ADDR'),\n                    '_security_user_agent': request.META.get('HTTP_USER_AGENT', ''),\n                    '_security_user_id': user.id,\n                    '_security_login_timestamp': timezone.now().isoformat(),\n                    '_security_request_count': 0,\n                    '_security_activity': []\n                }\n                \n                for key, value in security_data.items():\n                    request.session[key] = value\n            \n            def perform_secure_logout(self, request):\n                \"\"\"Perform secure logout with session cleanup\"\"\"\n                \n                from django.contrib.auth import logout\n                \n                # Log logout\n                if hasattr(request, 'user') and request.user.is_authenticated:\n                    logger.info(\n                        f\"Secure logout: user={request.user.username}, \"\n                        f\"ip={request.META.get('REMOTE_ADDR')}\"\n                    )\n                \n                # Perform Django logout\n                logout(request)\n                \n                # Completely flush session\n                request.session.flush()\n            \n            def check_session_integrity(self, request):\n                \"\"\"Check session integrity and user consistency\"\"\"\n                \n                if not request.user.is_authenticated:\n                    return True\n                \n                # Check if session user matches authenticated user\n                session_user_id = request.session.get('_security_user_id')\n                if session_user_id and session_user_id != request.user.id:\n                    logger.warning(\n                        f\"Session user mismatch: session_user={session_user_id}, \"\n                        f\"auth_user={request.user.id}\"\n                    )\n                    return False\n                \n                return True\n        \n        return SecureAuthenticationMixin\n","python","",[1047,1048,1049,1066,1080,1087,1097,1110,1121,1127,1139,1158,1182,1203,1218,1231,1243,1255,1266,1272,1286,1304,1320,1338,1353,1359,1365,1379,1399,1419,1432,1444,1456,1468,1478,1483,1496,1512,1528,1542,1547,1552,1566,1586,1606,1619,1631,1643,1655,1665,1671,1677,1683,1688,1698,1703,1710,1720,1730,1735,1745,1759,1773,1785,1797,1808,1814,1828,1840,1852,1864,1874,1879,1894,1900,1906,1912,1918,1924,1930,1936,1942,1947,1953,1959,1965,1971,1977,1982,1987,1995,2000,2007,2017,2027,2032,2042,2063,2084,2097,2109,2121,2133,2143,2148,2162,2183,2204,2225,2239,2255,2271,2290,2295,2300,2305,2310,2318,2325,2332,2342,2352,2357,2364,2374,2384,2389,2400,2411,2416,2443,2463,2488,2502,2516,2521,2540,2546,2571,2591,2596,2616,2621,2627,2643,2648,2657,2662,2680,2691,2696,2738,2745,2750,2756,2776,2813,2821,2826,2832,2861,2896,2903,2908,2914,2942,2976,2983,2988,2994,3014,3048,3055,3060,3067,3072,3090,3100,3105,3135,3147,3153,3194,3201,3206,3214,3241,3264,3289,3308,3315,3320,3338,3348,3353,3384,3413,3418,3430,3454,3461,3466,3472,3496,3501,3523,3533,3538,3553,3560,3565,3571,3578,3587,3631,3653,3667,3687,3694,3699,3717,3726,3731,3765,3794,3799,3811,3835,3842,3847,3853,3877,3882,3904,3914,3919,3933,3940,3945,3951,3960,3965,3981,3991,4019,4041,4063,4083,4089,4095,4111,4139,4150,4204,4209,4222,4227,4248,4270,4275,4281,4302,4317,4322,4340,4350,4355,4361,4377,4409,4414,4420,4452,4461,4478,4507,4512,4517,4523,4545,4569,4574,4580,4602,4609,4614,4620,4649,4659,4672,4698,4703,4708,4728,4733,4751,4761,4766,4772,4786,4795,4840,4879,4913,4919,4924,4930,4946,4951,4957,4977,4994,4999,5011,5018,5028,5033,5038,5057,5062,5080,5090,5095,5132,5166,5171,5177,5211,5240,5245,5253,5258,5265,5275,5285,5290,5300,5310,5315,5338,5348,5353,5375,5380,5386,5407,5412,5418,5434,5439,5445,5461,5466,5472,5498,5519,5524,5530,5550,5555,5561,5573,5594,5627,5632,5637,5655,5665,5670,5680,5692,5704,5716,5726,5731,5736,5743,5764,5777,5793,5798,5803,5825,5835,5840,5850,5874,5906,5941,5962,5986,6001,6015,6020,6025,6047,6066,6071,6089,6099,6104,6124,6129,6135,6171,6182,6207,6240,6246,6251,6257,6269,6274,6280,6295,6300,6318,6328,6333,6352,6359,6364,6370,6398,6425,6436,6453,6477,6482,6489,6494,6501,6506],"code",{"__ignoreMap":1045},[1050,1051,1054,1058,1062],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s5Kfy","class",[1050,1059,1061],{"class":1060},"sD-vU"," SessionVulnerabilities",[1050,1063,1065],{"class":1064},"soVBu",":\n",[1050,1067,1069,1073,1077],{"class":1052,"line":1068},2,[1050,1070,1072],{"class":1071},"sm7ve","    \"\"\"",[1050,1074,1076],{"class":1075},"sVyVU","Understanding common session security vulnerabilities",[1050,1078,1079],{"class":1071},"\"\"\"\n",[1050,1081,1083],{"class":1052,"line":1082},3,[1050,1084,1086],{"class":1085},"sftqT","    \n",[1050,1088,1090,1093],{"class":1052,"line":1089},4,[1050,1091,1092],{"class":1064},"    @",[1050,1094,1096],{"class":1095},"sa2tF","staticmethod\n",[1050,1098,1100,1103,1107],{"class":1052,"line":1099},5,[1050,1101,1102],{"class":1056},"    def",[1050,1104,1106],{"class":1105},"sljsM"," session_hijacking",[1050,1108,1109],{"class":1064},"():\n",[1050,1111,1113,1116,1119],{"class":1052,"line":1112},6,[1050,1114,1115],{"class":1071},"        \"\"\"",[1050,1117,1118],{"class":1075},"Session hijacking attack vectors and prevention",[1050,1120,1079],{"class":1071},[1050,1122,1124],{"class":1052,"line":1123},7,[1050,1125,1126],{"class":1085},"        \n",[1050,1128,1130,1133,1136],{"class":1052,"line":1129},8,[1050,1131,1132],{"class":1085},"        attack_vectors ",[1050,1134,1135],{"class":1064},"=",[1050,1137,1138],{"class":1064}," {\n",[1050,1140,1142,1146,1150,1153,1156],{"class":1052,"line":1141},9,[1050,1143,1145],{"class":1144},"sbYkP","            '",[1050,1147,1149],{"class":1148},"sTbE_","network_sniffing",[1050,1151,1152],{"class":1144},"'",[1050,1154,1155],{"class":1064},":",[1050,1157,1138],{"class":1064},[1050,1159,1161,1164,1167,1169,1171,1174,1177,1179],{"class":1052,"line":1160},10,[1050,1162,1163],{"class":1144},"                '",[1050,1165,1166],{"class":1148},"description",[1050,1168,1152],{"class":1144},[1050,1170,1155],{"class":1064},[1050,1172,1173],{"class":1144}," '",[1050,1175,1176],{"class":1148},"Intercepting session cookies over unencrypted connections",[1050,1178,1152],{"class":1144},[1050,1180,1181],{"class":1064},",\n",[1050,1183,1185,1187,1190,1192,1194,1196,1199,1201],{"class":1052,"line":1184},11,[1050,1186,1163],{"class":1144},[1050,1188,1189],{"class":1148},"attack_method",[1050,1191,1152],{"class":1144},[1050,1193,1155],{"class":1064},[1050,1195,1173],{"class":1144},[1050,1197,1198],{"class":1148},"Monitor network traffic to capture session IDs",[1050,1200,1152],{"class":1144},[1050,1202,1181],{"class":1064},[1050,1204,1206,1208,1211,1213,1215],{"class":1052,"line":1205},12,[1050,1207,1163],{"class":1144},[1050,1209,1210],{"class":1148},"prevention",[1050,1212,1152],{"class":1144},[1050,1214,1155],{"class":1064},[1050,1216,1217],{"class":1064}," [\n",[1050,1219,1221,1224,1227,1229],{"class":1052,"line":1220},13,[1050,1222,1223],{"class":1144},"                    '",[1050,1225,1226],{"class":1148},"Use HTTPS for all authenticated pages",[1050,1228,1152],{"class":1144},[1050,1230,1181],{"class":1064},[1050,1232,1234,1236,1239,1241],{"class":1052,"line":1233},14,[1050,1235,1223],{"class":1144},[1050,1237,1238],{"class":1148},"Set Secure flag on session cookies",[1050,1240,1152],{"class":1144},[1050,1242,1181],{"class":1064},[1050,1244,1246,1248,1251,1253],{"class":1052,"line":1245},15,[1050,1247,1223],{"class":1144},[1050,1249,1250],{"class":1148},"Implement HSTS headers",[1050,1252,1152],{"class":1144},[1050,1254,1181],{"class":1064},[1050,1256,1258,1260,1263],{"class":1052,"line":1257},16,[1050,1259,1223],{"class":1144},[1050,1261,1262],{"class":1148},"Use certificate pinning where possible",[1050,1264,1265],{"class":1144},"'\n",[1050,1267,1269],{"class":1052,"line":1268},17,[1050,1270,1271],{"class":1064},"                ],\n",[1050,1273,1275,1277,1280,1282,1284],{"class":1052,"line":1274},18,[1050,1276,1163],{"class":1144},[1050,1278,1279],{"class":1148},"django_settings",[1050,1281,1152],{"class":1144},[1050,1283,1155],{"class":1064},[1050,1285,1138],{"class":1064},[1050,1287,1289,1291,1294,1296,1298,1302],{"class":1052,"line":1288},19,[1050,1290,1223],{"class":1144},[1050,1292,1293],{"class":1148},"SESSION_COOKIE_SECURE",[1050,1295,1152],{"class":1144},[1050,1297,1155],{"class":1064},[1050,1299,1301],{"class":1300},"s8XtY"," True",[1050,1303,1181],{"class":1064},[1050,1305,1307,1309,1312,1314,1316,1318],{"class":1052,"line":1306},20,[1050,1308,1223],{"class":1144},[1050,1310,1311],{"class":1148},"SECURE_SSL_REDIRECT",[1050,1313,1152],{"class":1144},[1050,1315,1155],{"class":1064},[1050,1317,1301],{"class":1300},[1050,1319,1181],{"class":1064},[1050,1321,1323,1325,1328,1330,1332,1336],{"class":1052,"line":1322},21,[1050,1324,1223],{"class":1144},[1050,1326,1327],{"class":1148},"SECURE_HSTS_SECONDS",[1050,1329,1152],{"class":1144},[1050,1331,1155],{"class":1064},[1050,1333,1335],{"class":1334},"s7CZa"," 31536000",[1050,1337,1181],{"class":1064},[1050,1339,1341,1343,1346,1348,1350],{"class":1052,"line":1340},22,[1050,1342,1223],{"class":1144},[1050,1344,1345],{"class":1148},"SECURE_HSTS_INCLUDE_SUBDOMAINS",[1050,1347,1152],{"class":1144},[1050,1349,1155],{"class":1064},[1050,1351,1352],{"class":1300}," True\n",[1050,1354,1356],{"class":1052,"line":1355},23,[1050,1357,1358],{"class":1064},"                }\n",[1050,1360,1362],{"class":1052,"line":1361},24,[1050,1363,1364],{"class":1064},"            },\n",[1050,1366,1368,1370,1373,1375,1377],{"class":1052,"line":1367},25,[1050,1369,1145],{"class":1144},[1050,1371,1372],{"class":1148},"xss_attacks",[1050,1374,1152],{"class":1144},[1050,1376,1155],{"class":1064},[1050,1378,1138],{"class":1064},[1050,1380,1382,1384,1386,1388,1390,1392,1395,1397],{"class":1052,"line":1381},26,[1050,1383,1163],{"class":1144},[1050,1385,1166],{"class":1148},[1050,1387,1152],{"class":1144},[1050,1389,1155],{"class":1064},[1050,1391,1173],{"class":1144},[1050,1393,1394],{"class":1148},"JavaScript code stealing session cookies",[1050,1396,1152],{"class":1144},[1050,1398,1181],{"class":1064},[1050,1400,1402,1404,1406,1408,1410,1412,1415,1417],{"class":1052,"line":1401},27,[1050,1403,1163],{"class":1144},[1050,1405,1189],{"class":1148},[1050,1407,1152],{"class":1144},[1050,1409,1155],{"class":1064},[1050,1411,1173],{"class":1144},[1050,1413,1414],{"class":1148},"Inject malicious script to access document.cookie",[1050,1416,1152],{"class":1144},[1050,1418,1181],{"class":1064},[1050,1420,1422,1424,1426,1428,1430],{"class":1052,"line":1421},28,[1050,1423,1163],{"class":1144},[1050,1425,1210],{"class":1148},[1050,1427,1152],{"class":1144},[1050,1429,1155],{"class":1064},[1050,1431,1217],{"class":1064},[1050,1433,1435,1437,1440,1442],{"class":1052,"line":1434},29,[1050,1436,1223],{"class":1144},[1050,1438,1439],{"class":1148},"Set HttpOnly flag on session cookies",[1050,1441,1152],{"class":1144},[1050,1443,1181],{"class":1064},[1050,1445,1447,1449,1452,1454],{"class":1052,"line":1446},30,[1050,1448,1223],{"class":1144},[1050,1450,1451],{"class":1148},"Implement proper XSS protection",[1050,1453,1152],{"class":1144},[1050,1455,1181],{"class":1064},[1050,1457,1459,1461,1464,1466],{"class":1052,"line":1458},31,[1050,1460,1223],{"class":1144},[1050,1462,1463],{"class":1148},"Validate and sanitize all user input",[1050,1465,1152],{"class":1144},[1050,1467,1181],{"class":1064},[1050,1469,1471,1473,1476],{"class":1052,"line":1470},32,[1050,1472,1223],{"class":1144},[1050,1474,1475],{"class":1148},"Use Content Security Policy (CSP)",[1050,1477,1265],{"class":1144},[1050,1479,1481],{"class":1052,"line":1480},33,[1050,1482,1271],{"class":1064},[1050,1484,1486,1488,1490,1492,1494],{"class":1052,"line":1485},34,[1050,1487,1163],{"class":1144},[1050,1489,1279],{"class":1148},[1050,1491,1152],{"class":1144},[1050,1493,1155],{"class":1064},[1050,1495,1138],{"class":1064},[1050,1497,1499,1501,1504,1506,1508,1510],{"class":1052,"line":1498},35,[1050,1500,1223],{"class":1144},[1050,1502,1503],{"class":1148},"SESSION_COOKIE_HTTPONLY",[1050,1505,1152],{"class":1144},[1050,1507,1155],{"class":1064},[1050,1509,1301],{"class":1300},[1050,1511,1181],{"class":1064},[1050,1513,1515,1517,1520,1522,1524,1526],{"class":1052,"line":1514},36,[1050,1516,1223],{"class":1144},[1050,1518,1519],{"class":1148},"SECURE_CONTENT_TYPE_NOSNIFF",[1050,1521,1152],{"class":1144},[1050,1523,1155],{"class":1064},[1050,1525,1301],{"class":1300},[1050,1527,1181],{"class":1064},[1050,1529,1531,1533,1536,1538,1540],{"class":1052,"line":1530},37,[1050,1532,1223],{"class":1144},[1050,1534,1535],{"class":1148},"SECURE_BROWSER_XSS_FILTER",[1050,1537,1152],{"class":1144},[1050,1539,1155],{"class":1064},[1050,1541,1352],{"class":1300},[1050,1543,1545],{"class":1052,"line":1544},38,[1050,1546,1358],{"class":1064},[1050,1548,1550],{"class":1052,"line":1549},39,[1050,1551,1364],{"class":1064},[1050,1553,1555,1557,1560,1562,1564],{"class":1052,"line":1554},40,[1050,1556,1145],{"class":1144},[1050,1558,1559],{"class":1148},"session_sidejacking",[1050,1561,1152],{"class":1144},[1050,1563,1155],{"class":1064},[1050,1565,1138],{"class":1064},[1050,1567,1569,1571,1573,1575,1577,1579,1582,1584],{"class":1052,"line":1568},41,[1050,1570,1163],{"class":1144},[1050,1572,1166],{"class":1148},[1050,1574,1152],{"class":1144},[1050,1576,1155],{"class":1064},[1050,1578,1173],{"class":1144},[1050,1580,1581],{"class":1148},"Using stolen session ID to impersonate user",[1050,1583,1152],{"class":1144},[1050,1585,1181],{"class":1064},[1050,1587,1589,1591,1593,1595,1597,1599,1602,1604],{"class":1052,"line":1588},42,[1050,1590,1163],{"class":1144},[1050,1592,1189],{"class":1148},[1050,1594,1152],{"class":1144},[1050,1596,1155],{"class":1064},[1050,1598,1173],{"class":1144},[1050,1600,1601],{"class":1148},"Replay captured session cookie in requests",[1050,1603,1152],{"class":1144},[1050,1605,1181],{"class":1064},[1050,1607,1609,1611,1613,1615,1617],{"class":1052,"line":1608},43,[1050,1610,1163],{"class":1144},[1050,1612,1210],{"class":1148},[1050,1614,1152],{"class":1144},[1050,1616,1155],{"class":1064},[1050,1618,1217],{"class":1064},[1050,1620,1622,1624,1627,1629],{"class":1052,"line":1621},44,[1050,1623,1223],{"class":1144},[1050,1625,1626],{"class":1148},"Bind sessions to IP addresses (with caution)",[1050,1628,1152],{"class":1144},[1050,1630,1181],{"class":1064},[1050,1632,1634,1636,1639,1641],{"class":1052,"line":1633},45,[1050,1635,1223],{"class":1144},[1050,1637,1638],{"class":1148},"Validate User-Agent consistency",[1050,1640,1152],{"class":1144},[1050,1642,1181],{"class":1064},[1050,1644,1646,1648,1651,1653],{"class":1052,"line":1645},46,[1050,1647,1223],{"class":1144},[1050,1649,1650],{"class":1148},"Implement session timeout",[1050,1652,1152],{"class":1144},[1050,1654,1181],{"class":1064},[1050,1656,1658,1660,1663],{"class":1052,"line":1657},47,[1050,1659,1223],{"class":1144},[1050,1661,1662],{"class":1148},"Use additional authentication factors",[1050,1664,1265],{"class":1144},[1050,1666,1668],{"class":1052,"line":1667},48,[1050,1669,1670],{"class":1064},"                ]\n",[1050,1672,1674],{"class":1052,"line":1673},49,[1050,1675,1676],{"class":1064},"            }\n",[1050,1678,1680],{"class":1052,"line":1679},50,[1050,1681,1682],{"class":1064},"        }\n",[1050,1684,1686],{"class":1052,"line":1685},51,[1050,1687,1126],{"class":1085},[1050,1689,1691,1695],{"class":1052,"line":1690},52,[1050,1692,1694],{"class":1693},"siDh9","        return",[1050,1696,1697],{"class":1085}," attack_vectors\n",[1050,1699,1701],{"class":1052,"line":1700},53,[1050,1702,1086],{"class":1085},[1050,1704,1706,1708],{"class":1052,"line":1705},54,[1050,1707,1092],{"class":1064},[1050,1709,1096],{"class":1095},[1050,1711,1713,1715,1718],{"class":1052,"line":1712},55,[1050,1714,1102],{"class":1056},[1050,1716,1717],{"class":1105}," session_fixation",[1050,1719,1109],{"class":1064},[1050,1721,1723,1725,1728],{"class":1052,"line":1722},56,[1050,1724,1115],{"class":1071},[1050,1726,1727],{"class":1075},"Session fixation attack and prevention",[1050,1729,1079],{"class":1071},[1050,1731,1733],{"class":1052,"line":1732},57,[1050,1734,1126],{"class":1085},[1050,1736,1738,1741,1743],{"class":1052,"line":1737},58,[1050,1739,1740],{"class":1085},"        attack_details ",[1050,1742,1135],{"class":1064},[1050,1744,1138],{"class":1064},[1050,1746,1748,1750,1753,1755,1757],{"class":1052,"line":1747},59,[1050,1749,1145],{"class":1144},[1050,1751,1752],{"class":1148},"attack_process",[1050,1754,1152],{"class":1144},[1050,1756,1155],{"class":1064},[1050,1758,1217],{"class":1064},[1050,1760,1762,1765,1768,1771],{"class":1052,"line":1761},60,[1050,1763,1764],{"class":1144},"                \"",[1050,1766,1767],{"class":1148},"1. Attacker obtains valid session ID from application",[1050,1769,1770],{"class":1144},"\"",[1050,1772,1181],{"class":1064},[1050,1774,1776,1778,1781,1783],{"class":1052,"line":1775},61,[1050,1777,1764],{"class":1144},[1050,1779,1780],{"class":1148},"2. Attacker tricks user into using this session ID",[1050,1782,1770],{"class":1144},[1050,1784,1181],{"class":1064},[1050,1786,1788,1790,1793,1795],{"class":1052,"line":1787},62,[1050,1789,1764],{"class":1144},[1050,1791,1792],{"class":1148},"3. User authenticates using the fixed session ID",[1050,1794,1770],{"class":1144},[1050,1796,1181],{"class":1064},[1050,1798,1800,1802,1805],{"class":1052,"line":1799},63,[1050,1801,1764],{"class":1144},[1050,1803,1804],{"class":1148},"4. Attacker uses the same session ID to access user's account",[1050,1806,1807],{"class":1144},"\"\n",[1050,1809,1811],{"class":1052,"line":1810},64,[1050,1812,1813],{"class":1064},"            ],\n",[1050,1815,1817,1819,1822,1824,1826],{"class":1052,"line":1816},65,[1050,1818,1145],{"class":1144},[1050,1820,1821],{"class":1148},"prevention_methods",[1050,1823,1152],{"class":1144},[1050,1825,1155],{"class":1064},[1050,1827,1217],{"class":1064},[1050,1829,1831,1833,1836,1838],{"class":1052,"line":1830},66,[1050,1832,1163],{"class":1144},[1050,1834,1835],{"class":1148},"Regenerate session ID on authentication",[1050,1837,1152],{"class":1144},[1050,1839,1181],{"class":1064},[1050,1841,1843,1845,1848,1850],{"class":1052,"line":1842},67,[1050,1844,1163],{"class":1144},[1050,1846,1847],{"class":1148},"Regenerate session ID on privilege escalation",[1050,1849,1152],{"class":1144},[1050,1851,1181],{"class":1064},[1050,1853,1855,1857,1860,1862],{"class":1052,"line":1854},68,[1050,1856,1163],{"class":1144},[1050,1858,1859],{"class":1148},"Validate session ownership",[1050,1861,1152],{"class":1144},[1050,1863,1181],{"class":1064},[1050,1865,1867,1869,1872],{"class":1052,"line":1866},69,[1050,1868,1163],{"class":1144},[1050,1870,1871],{"class":1148},"Use secure session ID generation",[1050,1873,1265],{"class":1144},[1050,1875,1877],{"class":1052,"line":1876},70,[1050,1878,1813],{"class":1064},[1050,1880,1882,1884,1887,1889,1891],{"class":1052,"line":1881},71,[1050,1883,1145],{"class":1144},[1050,1885,1886],{"class":1148},"django_implementation",[1050,1888,1152],{"class":1144},[1050,1890,1155],{"class":1064},[1050,1892,1893],{"class":1144}," \"\"\"\n",[1050,1895,1897],{"class":1052,"line":1896},72,[1050,1898,1899],{"class":1148},"            from django.contrib.auth import login\n",[1050,1901,1903],{"class":1052,"line":1902},73,[1050,1904,1905],{"class":1148},"            \n",[1050,1907,1909],{"class":1052,"line":1908},74,[1050,1910,1911],{"class":1148},"            def secure_login(request, user):\n",[1050,1913,1915],{"class":1052,"line":1914},75,[1050,1916,1917],{"class":1148},"                # Regenerate session key before login\n",[1050,1919,1921],{"class":1052,"line":1920},76,[1050,1922,1923],{"class":1148},"                request.session.cycle_key()\n",[1050,1925,1927],{"class":1052,"line":1926},77,[1050,1928,1929],{"class":1148},"                \n",[1050,1931,1933],{"class":1052,"line":1932},78,[1050,1934,1935],{"class":1148},"                # Perform login\n",[1050,1937,1939],{"class":1052,"line":1938},79,[1050,1940,1941],{"class":1148},"                login(request, user)\n",[1050,1943,1945],{"class":1052,"line":1944},80,[1050,1946,1929],{"class":1148},[1050,1948,1950],{"class":1052,"line":1949},81,[1050,1951,1952],{"class":1148},"                # Additional security measures\n",[1050,1954,1956],{"class":1052,"line":1955},82,[1050,1957,1958],{"class":1148},"                request.session['login_ip'] = request.META.get('REMOTE_ADDR')\n",[1050,1960,1962],{"class":1052,"line":1961},83,[1050,1963,1964],{"class":1148},"                request.session['login_user_agent'] = request.META.get('HTTP_USER_AGENT')\n",[1050,1966,1968],{"class":1052,"line":1967},84,[1050,1969,1970],{"class":1148},"                request.session['login_timestamp'] = timezone.now().isoformat()\n",[1050,1972,1974],{"class":1052,"line":1973},85,[1050,1975,1976],{"class":1144},"            \"\"\"\n",[1050,1978,1980],{"class":1052,"line":1979},86,[1050,1981,1682],{"class":1064},[1050,1983,1985],{"class":1052,"line":1984},87,[1050,1986,1126],{"class":1085},[1050,1988,1990,1992],{"class":1052,"line":1989},88,[1050,1991,1694],{"class":1693},[1050,1993,1994],{"class":1085}," attack_details\n",[1050,1996,1998],{"class":1052,"line":1997},89,[1050,1999,1086],{"class":1085},[1050,2001,2003,2005],{"class":1052,"line":2002},90,[1050,2004,1092],{"class":1064},[1050,2006,1096],{"class":1095},[1050,2008,2010,2012,2015],{"class":1052,"line":2009},91,[1050,2011,1102],{"class":1056},[1050,2013,2014],{"class":1105}," csrf_attacks",[1050,2016,1109],{"class":1064},[1050,2018,2020,2022,2025],{"class":1052,"line":2019},92,[1050,2021,1115],{"class":1071},[1050,2023,2024],{"class":1075},"Cross-Site Request Forgery and session security",[1050,2026,1079],{"class":1071},[1050,2028,2030],{"class":1052,"line":2029},93,[1050,2031,1126],{"class":1085},[1050,2033,2035,2038,2040],{"class":1052,"line":2034},94,[1050,2036,2037],{"class":1085},"        csrf_details ",[1050,2039,1135],{"class":1064},[1050,2041,1138],{"class":1064},[1050,2043,2045,2047,2050,2052,2054,2056,2059,2061],{"class":1052,"line":2044},95,[1050,2046,1145],{"class":1144},[1050,2048,2049],{"class":1148},"attack_mechanism",[1050,2051,1152],{"class":1144},[1050,2053,1155],{"class":1064},[1050,2055,1173],{"class":1144},[1050,2057,2058],{"class":1148},"Trick authenticated user into performing unwanted actions",[1050,2060,1152],{"class":1144},[1050,2062,1181],{"class":1064},[1050,2064,2066,2068,2071,2073,2075,2077,2080,2082],{"class":1052,"line":2065},96,[1050,2067,1145],{"class":1144},[1050,2069,2070],{"class":1148},"session_role",[1050,2072,1152],{"class":1144},[1050,2074,1155],{"class":1064},[1050,2076,1173],{"class":1144},[1050,2078,2079],{"class":1148},"Attacker leverages existing session authentication",[1050,2081,1152],{"class":1144},[1050,2083,1181],{"class":1064},[1050,2085,2087,2089,2091,2093,2095],{"class":1052,"line":2086},97,[1050,2088,1145],{"class":1144},[1050,2090,1210],{"class":1148},[1050,2092,1152],{"class":1144},[1050,2094,1155],{"class":1064},[1050,2096,1217],{"class":1064},[1050,2098,2100,2102,2105,2107],{"class":1052,"line":2099},98,[1050,2101,1163],{"class":1144},[1050,2103,2104],{"class":1148},"Use Django CSRF protection",[1050,2106,1152],{"class":1144},[1050,2108,1181],{"class":1064},[1050,2110,2112,2114,2117,2119],{"class":1052,"line":2111},99,[1050,2113,1163],{"class":1144},[1050,2115,2116],{"class":1148},"Validate Referer headers",[1050,2118,1152],{"class":1144},[1050,2120,1181],{"class":1064},[1050,2122,2124,2126,2129,2131],{"class":1052,"line":2123},100,[1050,2125,1163],{"class":1144},[1050,2127,2128],{"class":1148},"Implement SameSite cookie policy",[1050,2130,1152],{"class":1144},[1050,2132,1181],{"class":1064},[1050,2134,2136,2138,2141],{"class":1052,"line":2135},101,[1050,2137,1163],{"class":1144},[1050,2139,2140],{"class":1148},"Use custom headers for AJAX requests",[1050,2142,1265],{"class":1144},[1050,2144,2146],{"class":1052,"line":2145},102,[1050,2147,1813],{"class":1064},[1050,2149,2151,2153,2156,2158,2160],{"class":1052,"line":2150},103,[1050,2152,1145],{"class":1144},[1050,2154,2155],{"class":1148},"django_protection",[1050,2157,1152],{"class":1144},[1050,2159,1155],{"class":1064},[1050,2161,1138],{"class":1064},[1050,2163,2165,2167,2170,2172,2174,2176,2179,2181],{"class":1052,"line":2164},104,[1050,2166,1163],{"class":1144},[1050,2168,2169],{"class":1148},"middleware",[1050,2171,1152],{"class":1144},[1050,2173,1155],{"class":1064},[1050,2175,1173],{"class":1144},[1050,2177,2178],{"class":1148},"django.middleware.csrf.CsrfViewMiddleware",[1050,2180,1152],{"class":1144},[1050,2182,1181],{"class":1064},[1050,2184,2186,2188,2191,2193,2195,2197,2200,2202],{"class":1052,"line":2185},105,[1050,2187,1163],{"class":1144},[1050,2189,2190],{"class":1148},"template_tag",[1050,2192,1152],{"class":1144},[1050,2194,1155],{"class":1064},[1050,2196,1173],{"class":1144},[1050,2198,2199],{"class":1148},"{% csrf_token %}",[1050,2201,1152],{"class":1144},[1050,2203,1181],{"class":1064},[1050,2205,2207,2209,2212,2214,2216,2218,2221,2223],{"class":1052,"line":2206},106,[1050,2208,1163],{"class":1144},[1050,2210,2211],{"class":1148},"ajax_header",[1050,2213,1152],{"class":1144},[1050,2215,1155],{"class":1064},[1050,2217,1173],{"class":1144},[1050,2219,2220],{"class":1148},"X-CSRFToken",[1050,2222,1152],{"class":1144},[1050,2224,1181],{"class":1064},[1050,2226,2228,2230,2233,2235,2237],{"class":1052,"line":2227},107,[1050,2229,1163],{"class":1144},[1050,2231,2232],{"class":1148},"cookie_settings",[1050,2234,1152],{"class":1144},[1050,2236,1155],{"class":1064},[1050,2238,1138],{"class":1064},[1050,2240,2242,2244,2247,2249,2251,2253],{"class":1052,"line":2241},108,[1050,2243,1223],{"class":1144},[1050,2245,2246],{"class":1148},"CSRF_COOKIE_SECURE",[1050,2248,1152],{"class":1144},[1050,2250,1155],{"class":1064},[1050,2252,1301],{"class":1300},[1050,2254,1181],{"class":1064},[1050,2256,2258,2260,2263,2265,2267,2269],{"class":1052,"line":2257},109,[1050,2259,1223],{"class":1144},[1050,2261,2262],{"class":1148},"CSRF_COOKIE_HTTPONLY",[1050,2264,1152],{"class":1144},[1050,2266,1155],{"class":1064},[1050,2268,1301],{"class":1300},[1050,2270,1181],{"class":1064},[1050,2272,2274,2276,2279,2281,2283,2285,2288],{"class":1052,"line":2273},110,[1050,2275,1223],{"class":1144},[1050,2277,2278],{"class":1148},"CSRF_COOKIE_SAMESITE",[1050,2280,1152],{"class":1144},[1050,2282,1155],{"class":1064},[1050,2284,1173],{"class":1144},[1050,2286,2287],{"class":1148},"Strict",[1050,2289,1265],{"class":1144},[1050,2291,2293],{"class":1052,"line":2292},111,[1050,2294,1358],{"class":1064},[1050,2296,2298],{"class":1052,"line":2297},112,[1050,2299,1676],{"class":1064},[1050,2301,2303],{"class":1052,"line":2302},113,[1050,2304,1682],{"class":1064},[1050,2306,2308],{"class":1052,"line":2307},114,[1050,2309,1126],{"class":1085},[1050,2311,2313,2315],{"class":1052,"line":2312},115,[1050,2314,1694],{"class":1693},[1050,2316,2317],{"class":1085}," csrf_details\n",[1050,2319,2321],{"class":1052,"line":2320},116,[1050,2322,2324],{"emptyLinePlaceholder":2323},true,"\n",[1050,2326,2328],{"class":1052,"line":2327},117,[1050,2329,2331],{"class":2330},"s9Tkl","# Session security implementation\n",[1050,2333,2335,2337,2340],{"class":1052,"line":2334},118,[1050,2336,1057],{"class":1056},[1050,2338,2339],{"class":1060}," SessionSecurityImplementation",[1050,2341,1065],{"class":1064},[1050,2343,2345,2347,2350],{"class":1052,"line":2344},119,[1050,2346,1072],{"class":1071},[1050,2348,2349],{"class":1075},"Implement comprehensive session security measures",[1050,2351,1079],{"class":1071},[1050,2353,2355],{"class":1052,"line":2354},120,[1050,2356,1086],{"class":1085},[1050,2358,2360,2362],{"class":1052,"line":2359},121,[1050,2361,1092],{"class":1064},[1050,2363,1096],{"class":1095},[1050,2365,2367,2369,2372],{"class":1052,"line":2366},122,[1050,2368,1102],{"class":1056},[1050,2370,2371],{"class":1105}," secure_session_middleware",[1050,2373,1109],{"class":1064},[1050,2375,2377,2379,2382],{"class":1052,"line":2376},123,[1050,2378,1115],{"class":1071},[1050,2380,2381],{"class":1075},"Enhanced session security middleware",[1050,2383,1079],{"class":1071},[1050,2385,2387],{"class":1052,"line":2386},124,[1050,2388,1126],{"class":1085},[1050,2390,2392,2395,2398],{"class":1052,"line":2391},125,[1050,2393,2394],{"class":1056},"        class",[1050,2396,2397],{"class":1060}," SecureSessionMiddleware",[1050,2399,1065],{"class":1064},[1050,2401,2403,2406,2409],{"class":1052,"line":2402},126,[1050,2404,2405],{"class":1071},"            \"\"\"",[1050,2407,2408],{"class":1075},"Comprehensive session security middleware",[1050,2410,1079],{"class":1071},[1050,2412,2414],{"class":1052,"line":2413},127,[1050,2415,1905],{"class":1085},[1050,2417,2419,2422,2426,2429,2433,2436,2440],{"class":1052,"line":2418},128,[1050,2420,2421],{"class":1056},"            def",[1050,2423,2425],{"class":2424},"sJdAF"," __init__",[1050,2427,2428],{"class":1064},"(",[1050,2430,2432],{"class":2431},"sRjD_","self",[1050,2434,2435],{"class":1064},",",[1050,2437,2439],{"class":2438},"sCyAa"," get_response",[1050,2441,2442],{"class":1064},"):\n",[1050,2444,2446,2450,2453,2457,2460],{"class":1052,"line":2445},129,[1050,2447,2449],{"class":2448},"se3Ec","                self",[1050,2451,2452],{"class":1064},".",[1050,2454,2456],{"class":2455},"sBPpx","get_response",[1050,2458,2459],{"class":1064}," =",[1050,2461,2462],{"class":1085}," get_response\n",[1050,2464,2466,2468,2470,2473,2475,2478,2482,2485],{"class":1052,"line":2465},130,[1050,2467,2449],{"class":2448},[1050,2469,2452],{"class":1064},[1050,2471,2472],{"class":2455},"max_session_age",[1050,2474,2459],{"class":1064},[1050,2476,2477],{"class":1334}," 24",[1050,2479,2481],{"class":2480},"sVsLi"," *",[1050,2483,2484],{"class":1334}," 3600",[1050,2486,2487],{"class":2330},"  # 24 hours\n",[1050,2489,2491,2493,2495,2498,2500],{"class":1052,"line":2490},131,[1050,2492,2449],{"class":2448},[1050,2494,2452],{"class":1064},[1050,2496,2497],{"class":2455},"ip_validation_enabled",[1050,2499,2459],{"class":1064},[1050,2501,1352],{"class":1300},[1050,2503,2505,2507,2509,2512,2514],{"class":1052,"line":2504},132,[1050,2506,2449],{"class":2448},[1050,2508,2452],{"class":1064},[1050,2510,2511],{"class":2455},"user_agent_validation_enabled",[1050,2513,2459],{"class":1064},[1050,2515,1352],{"class":1300},[1050,2517,2519],{"class":1052,"line":2518},133,[1050,2520,1905],{"class":1085},[1050,2522,2524,2526,2529,2531,2533,2535,2538],{"class":1052,"line":2523},134,[1050,2525,2421],{"class":1056},[1050,2527,2528],{"class":2424}," __call__",[1050,2530,2428],{"class":1064},[1050,2532,2432],{"class":2431},[1050,2534,2435],{"class":1064},[1050,2536,2537],{"class":2438}," request",[1050,2539,2442],{"class":1064},[1050,2541,2543],{"class":1052,"line":2542},135,[1050,2544,2545],{"class":2330},"                # Validate session before processing request\n",[1050,2547,2549,2552,2555,2558,2560,2564,2566,2569],{"class":1052,"line":2548},136,[1050,2550,2551],{"class":1693},"                if",[1050,2553,2554],{"class":2480}," not",[1050,2556,2557],{"class":2448}," self",[1050,2559,2452],{"class":1064},[1050,2561,2563],{"class":2562},"siWMO","validate_session_security",[1050,2565,2428],{"class":1064},[1050,2567,2568],{"class":2562},"request",[1050,2570,2442],{"class":1064},[1050,2572,2574,2577,2579,2581,2584,2586,2588],{"class":1052,"line":2573},137,[1050,2575,2576],{"class":1693},"                    return",[1050,2578,2557],{"class":2448},[1050,2580,2452],{"class":1064},[1050,2582,2583],{"class":2562},"handle_security_violation",[1050,2585,2428],{"class":1064},[1050,2587,2568],{"class":2562},[1050,2589,2590],{"class":1064},")\n",[1050,2592,2594],{"class":1052,"line":2593},138,[1050,2595,1929],{"class":1085},[1050,2597,2599,2602,2604,2606,2608,2610,2612,2614],{"class":1052,"line":2598},139,[1050,2600,2601],{"class":1085},"                response ",[1050,2603,1135],{"class":1064},[1050,2605,2557],{"class":2448},[1050,2607,2452],{"class":1064},[1050,2609,2456],{"class":2562},[1050,2611,2428],{"class":1064},[1050,2613,2568],{"class":2562},[1050,2615,2590],{"class":1064},[1050,2617,2619],{"class":1052,"line":2618},140,[1050,2620,1929],{"class":1085},[1050,2622,2624],{"class":1052,"line":2623},141,[1050,2625,2626],{"class":2330},"                # Update session security data after processing\n",[1050,2628,2630,2632,2634,2637,2639,2641],{"class":1052,"line":2629},142,[1050,2631,2449],{"class":2448},[1050,2633,2452],{"class":1064},[1050,2635,2636],{"class":2562},"update_session_security",[1050,2638,2428],{"class":1064},[1050,2640,2568],{"class":2562},[1050,2642,2590],{"class":1064},[1050,2644,2646],{"class":1052,"line":2645},143,[1050,2647,1929],{"class":1085},[1050,2649,2651,2654],{"class":1052,"line":2650},144,[1050,2652,2653],{"class":1693},"                return",[1050,2655,2656],{"class":1085}," response\n",[1050,2658,2660],{"class":1052,"line":2659},145,[1050,2661,1905],{"class":1085},[1050,2663,2665,2667,2670,2672,2674,2676,2678],{"class":1052,"line":2664},146,[1050,2666,2421],{"class":1056},[1050,2668,2669],{"class":1105}," validate_session_security",[1050,2671,2428],{"class":1064},[1050,2673,2432],{"class":2431},[1050,2675,2435],{"class":1064},[1050,2677,2537],{"class":2438},[1050,2679,2442],{"class":1064},[1050,2681,2683,2686,2689],{"class":1052,"line":2682},147,[1050,2684,2685],{"class":1071},"                \"\"\"",[1050,2687,2688],{"class":1075},"Comprehensive session validation",[1050,2690,1079],{"class":1071},[1050,2692,2694],{"class":1052,"line":2693},148,[1050,2695,1929],{"class":1085},[1050,2697,2699,2701,2703,2706,2708,2710,2712,2714,2717,2719,2722,2725,2727,2729,2731,2733,2736],{"class":1052,"line":2698},149,[1050,2700,2551],{"class":1693},[1050,2702,2554],{"class":2480},[1050,2704,2705],{"class":2424}," hasattr",[1050,2707,2428],{"class":1064},[1050,2709,2568],{"class":2562},[1050,2711,2435],{"class":1064},[1050,2713,1173],{"class":1144},[1050,2715,2716],{"class":1148},"session",[1050,2718,1152],{"class":1144},[1050,2720,2721],{"class":1064},")",[1050,2723,2724],{"class":2480}," or",[1050,2726,2537],{"class":1085},[1050,2728,2452],{"class":1064},[1050,2730,2716],{"class":2455},[1050,2732,2452],{"class":1064},[1050,2734,2735],{"class":2562},"is_empty",[1050,2737,1109],{"class":1064},[1050,2739,2741,2743],{"class":1052,"line":2740},150,[1050,2742,2576],{"class":1693},[1050,2744,1352],{"class":1300},[1050,2746,2748],{"class":1052,"line":2747},151,[1050,2749,1929],{"class":1085},[1050,2751,2753],{"class":1052,"line":2752},152,[1050,2754,2755],{"class":2330},"                # Check session age\n",[1050,2757,2759,2761,2763,2765,2767,2770,2772,2774],{"class":1052,"line":2758},153,[1050,2760,2551],{"class":1693},[1050,2762,2554],{"class":2480},[1050,2764,2557],{"class":2448},[1050,2766,2452],{"class":1064},[1050,2768,2769],{"class":2562},"validate_session_age",[1050,2771,2428],{"class":1064},[1050,2773,2568],{"class":2562},[1050,2775,2442],{"class":1064},[1050,2777,2779,2782,2784,2787,2789,2792,2795,2799,2801,2803,2806,2809,2811],{"class":1052,"line":2778},154,[1050,2780,2781],{"class":1085},"                    logger",[1050,2783,2452],{"class":1064},[1050,2785,2786],{"class":2562},"warning",[1050,2788,2428],{"class":1064},[1050,2790,2791],{"class":1056},"f",[1050,2793,2794],{"class":1148},"\"Session expired for user: ",[1050,2796,2798],{"class":2797},"s3h35","{",[1050,2800,2568],{"class":2562},[1050,2802,2452],{"class":1064},[1050,2804,2805],{"class":2455},"user",[1050,2807,2808],{"class":2797},"}",[1050,2810,1770],{"class":1148},[1050,2812,2590],{"class":1064},[1050,2814,2816,2818],{"class":1052,"line":2815},155,[1050,2817,2576],{"class":1693},[1050,2819,2820],{"class":1300}," False\n",[1050,2822,2824],{"class":1052,"line":2823},156,[1050,2825,1929],{"class":1085},[1050,2827,2829],{"class":1052,"line":2828},157,[1050,2830,2831],{"class":2330},"                # Check IP consistency\n",[1050,2833,2835,2837,2839,2841,2843,2846,2848,2850,2852,2855,2857,2859],{"class":1052,"line":2834},158,[1050,2836,2551],{"class":1693},[1050,2838,2557],{"class":2448},[1050,2840,2452],{"class":1064},[1050,2842,2497],{"class":2455},[1050,2844,2845],{"class":2480}," and",[1050,2847,2554],{"class":2480},[1050,2849,2557],{"class":2448},[1050,2851,2452],{"class":1064},[1050,2853,2854],{"class":2562},"validate_ip_consistency",[1050,2856,2428],{"class":1064},[1050,2858,2568],{"class":2562},[1050,2860,2442],{"class":1064},[1050,2862,2864,2866,2868,2870,2872,2874,2877,2879,2881,2883,2885,2887,2890,2892,2894],{"class":1052,"line":2863},159,[1050,2865,2781],{"class":1085},[1050,2867,2452],{"class":1064},[1050,2869,2786],{"class":2562},[1050,2871,2428],{"class":1064},[1050,2873,2791],{"class":1056},[1050,2875,2876],{"class":1148},"\"IP mismatch for session: ",[1050,2878,2798],{"class":2797},[1050,2880,2568],{"class":2562},[1050,2882,2452],{"class":1064},[1050,2884,2716],{"class":2455},[1050,2886,2452],{"class":1064},[1050,2888,2889],{"class":2455},"session_key",[1050,2891,2808],{"class":2797},[1050,2893,1770],{"class":1148},[1050,2895,2590],{"class":1064},[1050,2897,2899,2901],{"class":1052,"line":2898},160,[1050,2900,2576],{"class":1693},[1050,2902,2820],{"class":1300},[1050,2904,2906],{"class":1052,"line":2905},161,[1050,2907,1929],{"class":1085},[1050,2909,2911],{"class":1052,"line":2910},162,[1050,2912,2913],{"class":2330},"                # Check User-Agent consistency\n",[1050,2915,2917,2919,2921,2923,2925,2927,2929,2931,2933,2936,2938,2940],{"class":1052,"line":2916},163,[1050,2918,2551],{"class":1693},[1050,2920,2557],{"class":2448},[1050,2922,2452],{"class":1064},[1050,2924,2511],{"class":2455},[1050,2926,2845],{"class":2480},[1050,2928,2554],{"class":2480},[1050,2930,2557],{"class":2448},[1050,2932,2452],{"class":1064},[1050,2934,2935],{"class":2562},"validate_user_agent",[1050,2937,2428],{"class":1064},[1050,2939,2568],{"class":2562},[1050,2941,2442],{"class":1064},[1050,2943,2945,2947,2949,2951,2953,2955,2958,2960,2962,2964,2966,2968,2970,2972,2974],{"class":1052,"line":2944},164,[1050,2946,2781],{"class":1085},[1050,2948,2452],{"class":1064},[1050,2950,2786],{"class":2562},[1050,2952,2428],{"class":1064},[1050,2954,2791],{"class":1056},[1050,2956,2957],{"class":1148},"\"User-Agent mismatch for session: ",[1050,2959,2798],{"class":2797},[1050,2961,2568],{"class":2562},[1050,2963,2452],{"class":1064},[1050,2965,2716],{"class":2455},[1050,2967,2452],{"class":1064},[1050,2969,2889],{"class":2455},[1050,2971,2808],{"class":2797},[1050,2973,1770],{"class":1148},[1050,2975,2590],{"class":1064},[1050,2977,2979,2981],{"class":1052,"line":2978},165,[1050,2980,2576],{"class":1693},[1050,2982,2820],{"class":1300},[1050,2984,2986],{"class":1052,"line":2985},166,[1050,2987,1929],{"class":1085},[1050,2989,2991],{"class":1052,"line":2990},167,[1050,2992,2993],{"class":2330},"                # Check for suspicious activity\n",[1050,2995,2997,2999,3001,3003,3005,3008,3010,3012],{"class":1052,"line":2996},168,[1050,2998,2551],{"class":1693},[1050,3000,2554],{"class":2480},[1050,3002,2557],{"class":2448},[1050,3004,2452],{"class":1064},[1050,3006,3007],{"class":2562},"validate_activity_patterns",[1050,3009,2428],{"class":1064},[1050,3011,2568],{"class":2562},[1050,3013,2442],{"class":1064},[1050,3015,3017,3019,3021,3023,3025,3027,3030,3032,3034,3036,3038,3040,3042,3044,3046],{"class":1052,"line":3016},169,[1050,3018,2781],{"class":1085},[1050,3020,2452],{"class":1064},[1050,3022,2786],{"class":2562},[1050,3024,2428],{"class":1064},[1050,3026,2791],{"class":1056},[1050,3028,3029],{"class":1148},"\"Suspicious activity detected: ",[1050,3031,2798],{"class":2797},[1050,3033,2568],{"class":2562},[1050,3035,2452],{"class":1064},[1050,3037,2716],{"class":2455},[1050,3039,2452],{"class":1064},[1050,3041,2889],{"class":2455},[1050,3043,2808],{"class":2797},[1050,3045,1770],{"class":1148},[1050,3047,2590],{"class":1064},[1050,3049,3051,3053],{"class":1052,"line":3050},170,[1050,3052,2576],{"class":1693},[1050,3054,2820],{"class":1300},[1050,3056,3058],{"class":1052,"line":3057},171,[1050,3059,1929],{"class":1085},[1050,3061,3063,3065],{"class":1052,"line":3062},172,[1050,3064,2653],{"class":1693},[1050,3066,1352],{"class":1300},[1050,3068,3070],{"class":1052,"line":3069},173,[1050,3071,1905],{"class":1085},[1050,3073,3075,3077,3080,3082,3084,3086,3088],{"class":1052,"line":3074},174,[1050,3076,2421],{"class":1056},[1050,3078,3079],{"class":1105}," validate_session_age",[1050,3081,2428],{"class":1064},[1050,3083,2432],{"class":2431},[1050,3085,2435],{"class":1064},[1050,3087,2537],{"class":2438},[1050,3089,2442],{"class":1064},[1050,3091,3093,3095,3098],{"class":1052,"line":3092},175,[1050,3094,2685],{"class":1071},[1050,3096,3097],{"class":1075},"Validate session hasn't exceeded maximum age",[1050,3099,1079],{"class":1071},[1050,3101,3103],{"class":1052,"line":3102},176,[1050,3104,1929],{"class":1085},[1050,3106,3108,3111,3113,3115,3117,3119,3121,3124,3126,3128,3131,3133],{"class":1052,"line":3107},177,[1050,3109,3110],{"class":1085},"                session_start ",[1050,3112,1135],{"class":1064},[1050,3114,2537],{"class":1085},[1050,3116,2452],{"class":1064},[1050,3118,2716],{"class":2455},[1050,3120,2452],{"class":1064},[1050,3122,3123],{"class":2562},"get",[1050,3125,2428],{"class":1064},[1050,3127,1152],{"class":1144},[1050,3129,3130],{"class":1148},"_security_session_start",[1050,3132,1152],{"class":1144},[1050,3134,2590],{"class":1064},[1050,3136,3138,3140,3142,3145],{"class":1052,"line":3137},178,[1050,3139,2551],{"class":1693},[1050,3141,2554],{"class":2480},[1050,3143,3144],{"class":1085}," session_start",[1050,3146,1065],{"class":1064},[1050,3148,3150],{"class":1052,"line":3149},179,[1050,3151,3152],{"class":2330},"                    # First time seeing this session, record start time\n",[1050,3154,3156,3159,3161,3163,3166,3168,3170,3172,3175,3177,3180,3182,3185,3188,3191],{"class":1052,"line":3155},180,[1050,3157,3158],{"class":1085},"                    request",[1050,3160,2452],{"class":1064},[1050,3162,2716],{"class":2455},[1050,3164,3165],{"class":1064},"[",[1050,3167,1152],{"class":1144},[1050,3169,3130],{"class":1148},[1050,3171,1152],{"class":1144},[1050,3173,3174],{"class":1064},"]",[1050,3176,2459],{"class":1064},[1050,3178,3179],{"class":1085}," timezone",[1050,3181,2452],{"class":1064},[1050,3183,3184],{"class":2562},"now",[1050,3186,3187],{"class":1064},"().",[1050,3189,3190],{"class":2562},"isoformat",[1050,3192,3193],{"class":1064},"()\n",[1050,3195,3197,3199],{"class":1052,"line":3196},181,[1050,3198,2576],{"class":1693},[1050,3200,1352],{"class":1300},[1050,3202,3204],{"class":1052,"line":3203},182,[1050,3205,1929],{"class":1085},[1050,3207,3209,3212],{"class":1052,"line":3208},183,[1050,3210,3211],{"class":1693},"                try",[1050,3213,1065],{"class":1064},[1050,3215,3217,3220,3222,3224,3226,3229,3231,3234,3236,3239],{"class":1052,"line":3216},184,[1050,3218,3219],{"class":1085},"                    start_time ",[1050,3221,1135],{"class":1064},[1050,3223,3179],{"class":1085},[1050,3225,2452],{"class":1064},[1050,3227,3228],{"class":2455},"datetime",[1050,3230,2452],{"class":1064},[1050,3232,3233],{"class":2562},"fromisoformat",[1050,3235,2428],{"class":1064},[1050,3237,3238],{"class":2562},"session_start",[1050,3240,2590],{"class":1064},[1050,3242,3244,3247,3249,3251,3253,3255,3258,3261],{"class":1052,"line":3243},185,[1050,3245,3246],{"class":1085},"                    age ",[1050,3248,1135],{"class":1064},[1050,3250,3179],{"class":1085},[1050,3252,2452],{"class":1064},[1050,3254,3184],{"class":2562},[1050,3256,3257],{"class":1064},"()",[1050,3259,3260],{"class":2480}," -",[1050,3262,3263],{"class":1085}," start_time\n",[1050,3265,3267,3269,3272,3274,3277,3279,3282,3284,3286],{"class":1052,"line":3266},186,[1050,3268,2576],{"class":1693},[1050,3270,3271],{"class":1085}," age",[1050,3273,2452],{"class":1064},[1050,3275,3276],{"class":2562},"total_seconds",[1050,3278,3257],{"class":1064},[1050,3280,3281],{"class":2480}," \u003C",[1050,3283,2557],{"class":2448},[1050,3285,2452],{"class":1064},[1050,3287,3288],{"class":2455},"max_session_age\n",[1050,3290,3292,3295,3298,3301,3303,3306],{"class":1052,"line":3291},187,[1050,3293,3294],{"class":1693},"                except",[1050,3296,3297],{"class":1064}," (",[1050,3299,3300],{"class":1095},"ValueError",[1050,3302,2435],{"class":1064},[1050,3304,3305],{"class":1095}," TypeError",[1050,3307,2442],{"class":1064},[1050,3309,3311,3313],{"class":1052,"line":3310},188,[1050,3312,2576],{"class":1693},[1050,3314,2820],{"class":1300},[1050,3316,3318],{"class":1052,"line":3317},189,[1050,3319,1905],{"class":1085},[1050,3321,3323,3325,3328,3330,3332,3334,3336],{"class":1052,"line":3322},190,[1050,3324,2421],{"class":1056},[1050,3326,3327],{"class":1105}," validate_ip_consistency",[1050,3329,2428],{"class":1064},[1050,3331,2432],{"class":2431},[1050,3333,2435],{"class":1064},[1050,3335,2537],{"class":2438},[1050,3337,2442],{"class":1064},[1050,3339,3341,3343,3346],{"class":1052,"line":3340},191,[1050,3342,2685],{"class":1071},[1050,3344,3345],{"class":1075},"Validate IP address consistency",[1050,3347,1079],{"class":1071},[1050,3349,3351],{"class":1052,"line":3350},192,[1050,3352,1929],{"class":1085},[1050,3354,3356,3359,3361,3363,3365,3369,3371,3373,3375,3377,3380,3382],{"class":1052,"line":3355},193,[1050,3357,3358],{"class":1085},"                current_ip ",[1050,3360,1135],{"class":1064},[1050,3362,2537],{"class":1085},[1050,3364,2452],{"class":1064},[1050,3366,3368],{"class":3367},"sFGJz","META",[1050,3370,2452],{"class":1064},[1050,3372,3123],{"class":2562},[1050,3374,2428],{"class":1064},[1050,3376,1152],{"class":1144},[1050,3378,3379],{"class":1148},"REMOTE_ADDR",[1050,3381,1152],{"class":1144},[1050,3383,2590],{"class":1064},[1050,3385,3387,3390,3392,3394,3396,3398,3400,3402,3404,3406,3409,3411],{"class":1052,"line":3386},194,[1050,3388,3389],{"class":1085},"                stored_ip ",[1050,3391,1135],{"class":1064},[1050,3393,2537],{"class":1085},[1050,3395,2452],{"class":1064},[1050,3397,2716],{"class":2455},[1050,3399,2452],{"class":1064},[1050,3401,3123],{"class":2562},[1050,3403,2428],{"class":1064},[1050,3405,1152],{"class":1144},[1050,3407,3408],{"class":1148},"_security_ip",[1050,3410,1152],{"class":1144},[1050,3412,2590],{"class":1064},[1050,3414,3416],{"class":1052,"line":3415},195,[1050,3417,1929],{"class":1085},[1050,3419,3421,3423,3425,3428],{"class":1052,"line":3420},196,[1050,3422,2551],{"class":1693},[1050,3424,2554],{"class":2480},[1050,3426,3427],{"class":1085}," stored_ip",[1050,3429,1065],{"class":1064},[1050,3431,3433,3435,3437,3439,3441,3443,3445,3447,3449,3451],{"class":1052,"line":3432},197,[1050,3434,3158],{"class":1085},[1050,3436,2452],{"class":1064},[1050,3438,2716],{"class":2455},[1050,3440,3165],{"class":1064},[1050,3442,1152],{"class":1144},[1050,3444,3408],{"class":1148},[1050,3446,1152],{"class":1144},[1050,3448,3174],{"class":1064},[1050,3450,2459],{"class":1064},[1050,3452,3453],{"class":1085}," current_ip\n",[1050,3455,3457,3459],{"class":1052,"line":3456},198,[1050,3458,2576],{"class":1693},[1050,3460,1352],{"class":1300},[1050,3462,3464],{"class":1052,"line":3463},199,[1050,3465,1929],{"class":1085},[1050,3467,3469],{"class":1052,"line":3468},200,[1050,3470,3471],{"class":2330},"                # Allow for proxy/load balancer IP changes\n",[1050,3473,3475,3477,3479,3481,3484,3486,3489,3491,3494],{"class":1052,"line":3474},201,[1050,3476,2653],{"class":1693},[1050,3478,2557],{"class":2448},[1050,3480,2452],{"class":1064},[1050,3482,3483],{"class":2562},"is_ip_change_allowed",[1050,3485,2428],{"class":1064},[1050,3487,3488],{"class":2562},"stored_ip",[1050,3490,2435],{"class":1064},[1050,3492,3493],{"class":2562}," current_ip",[1050,3495,2590],{"class":1064},[1050,3497,3499],{"class":1052,"line":3498},202,[1050,3500,1905],{"class":1085},[1050,3502,3504,3506,3509,3511,3513,3515,3517,3519,3521],{"class":1052,"line":3503},203,[1050,3505,2421],{"class":1056},[1050,3507,3508],{"class":1105}," is_ip_change_allowed",[1050,3510,2428],{"class":1064},[1050,3512,2432],{"class":2431},[1050,3514,2435],{"class":1064},[1050,3516,3427],{"class":2438},[1050,3518,2435],{"class":1064},[1050,3520,3493],{"class":2438},[1050,3522,2442],{"class":1064},[1050,3524,3526,3528,3531],{"class":1052,"line":3525},204,[1050,3527,2685],{"class":1071},[1050,3529,3530],{"class":1075},"Check if IP change is allowed (handle proxies/NAT)",[1050,3532,1079],{"class":1071},[1050,3534,3536],{"class":1052,"line":3535},205,[1050,3537,1929],{"class":1085},[1050,3539,3541,3543,3546,3549,3551],{"class":1052,"line":3540},206,[1050,3542,2551],{"class":1693},[1050,3544,3545],{"class":1085}," stored_ip ",[1050,3547,3548],{"class":2480},"==",[1050,3550,3493],{"class":1085},[1050,3552,1065],{"class":1064},[1050,3554,3556,3558],{"class":1052,"line":3555},207,[1050,3557,2576],{"class":1693},[1050,3559,1352],{"class":1300},[1050,3561,3563],{"class":1052,"line":3562},208,[1050,3564,1929],{"class":1085},[1050,3566,3568],{"class":1052,"line":3567},209,[1050,3569,3570],{"class":2330},"                # Allow changes within same subnet (for corporate networks)\n",[1050,3572,3574,3576],{"class":1052,"line":3573},210,[1050,3575,3211],{"class":1693},[1050,3577,1065],{"class":1064},[1050,3579,3581,3584],{"class":1052,"line":3580},211,[1050,3582,3583],{"class":1693},"                    import",[1050,3585,3586],{"class":1085}," ipaddress\n",[1050,3588,3590,3593,3595,3598,3600,3603,3605,3607,3609,3611,3613,3615,3618,3620,3624,3626,3629],{"class":1052,"line":3589},212,[1050,3591,3592],{"class":1085},"                    stored_network ",[1050,3594,1135],{"class":1064},[1050,3596,3597],{"class":1085}," ipaddress",[1050,3599,2452],{"class":1064},[1050,3601,3602],{"class":2562},"ip_network",[1050,3604,2428],{"class":1064},[1050,3606,2791],{"class":1056},[1050,3608,1770],{"class":1148},[1050,3610,2798],{"class":2797},[1050,3612,3488],{"class":2562},[1050,3614,2808],{"class":2797},[1050,3616,3617],{"class":1148},"/24\"",[1050,3619,2435],{"class":1064},[1050,3621,3623],{"class":3622},"sqOPj"," strict",[1050,3625,1135],{"class":1064},[1050,3627,3628],{"class":1300},"False",[1050,3630,2590],{"class":1064},[1050,3632,3634,3637,3639,3641,3643,3646,3648,3651],{"class":1052,"line":3633},213,[1050,3635,3636],{"class":1085},"                    current_addr ",[1050,3638,1135],{"class":1064},[1050,3640,3597],{"class":1085},[1050,3642,2452],{"class":1064},[1050,3644,3645],{"class":2562},"ip_address",[1050,3647,2428],{"class":1064},[1050,3649,3650],{"class":2562},"current_ip",[1050,3652,2590],{"class":1064},[1050,3654,3656,3658,3661,3664],{"class":1052,"line":3655},214,[1050,3657,2576],{"class":1693},[1050,3659,3660],{"class":1085}," current_addr ",[1050,3662,3663],{"class":2480},"in",[1050,3665,3666],{"class":1085}," stored_network\n",[1050,3668,3670,3672,3674,3676,3678,3680,3682,3685],{"class":1052,"line":3669},215,[1050,3671,3294],{"class":1693},[1050,3673,3297],{"class":1064},[1050,3675,3300],{"class":1095},[1050,3677,2435],{"class":1064},[1050,3679,3597],{"class":1085},[1050,3681,2452],{"class":1064},[1050,3683,3684],{"class":2455},"AddressValueError",[1050,3686,2442],{"class":1064},[1050,3688,3690,3692],{"class":1052,"line":3689},216,[1050,3691,2576],{"class":1693},[1050,3693,2820],{"class":1300},[1050,3695,3697],{"class":1052,"line":3696},217,[1050,3698,1905],{"class":1085},[1050,3700,3702,3704,3707,3709,3711,3713,3715],{"class":1052,"line":3701},218,[1050,3703,2421],{"class":1056},[1050,3705,3706],{"class":1105}," validate_user_agent",[1050,3708,2428],{"class":1064},[1050,3710,2432],{"class":2431},[1050,3712,2435],{"class":1064},[1050,3714,2537],{"class":2438},[1050,3716,2442],{"class":1064},[1050,3718,3720,3722,3724],{"class":1052,"line":3719},219,[1050,3721,2685],{"class":1071},[1050,3723,1638],{"class":1075},[1050,3725,1079],{"class":1071},[1050,3727,3729],{"class":1052,"line":3728},220,[1050,3730,1929],{"class":1085},[1050,3732,3734,3737,3739,3741,3743,3745,3747,3749,3751,3753,3756,3758,3760,3763],{"class":1052,"line":3733},221,[1050,3735,3736],{"class":1085},"                current_ua ",[1050,3738,1135],{"class":1064},[1050,3740,2537],{"class":1085},[1050,3742,2452],{"class":1064},[1050,3744,3368],{"class":3367},[1050,3746,2452],{"class":1064},[1050,3748,3123],{"class":2562},[1050,3750,2428],{"class":1064},[1050,3752,1152],{"class":1144},[1050,3754,3755],{"class":1148},"HTTP_USER_AGENT",[1050,3757,1152],{"class":1144},[1050,3759,2435],{"class":1064},[1050,3761,3762],{"class":1144}," ''",[1050,3764,2590],{"class":1064},[1050,3766,3768,3771,3773,3775,3777,3779,3781,3783,3785,3787,3790,3792],{"class":1052,"line":3767},222,[1050,3769,3770],{"class":1085},"                stored_ua ",[1050,3772,1135],{"class":1064},[1050,3774,2537],{"class":1085},[1050,3776,2452],{"class":1064},[1050,3778,2716],{"class":2455},[1050,3780,2452],{"class":1064},[1050,3782,3123],{"class":2562},[1050,3784,2428],{"class":1064},[1050,3786,1152],{"class":1144},[1050,3788,3789],{"class":1148},"_security_user_agent",[1050,3791,1152],{"class":1144},[1050,3793,2590],{"class":1064},[1050,3795,3797],{"class":1052,"line":3796},223,[1050,3798,1929],{"class":1085},[1050,3800,3802,3804,3806,3809],{"class":1052,"line":3801},224,[1050,3803,2551],{"class":1693},[1050,3805,2554],{"class":2480},[1050,3807,3808],{"class":1085}," stored_ua",[1050,3810,1065],{"class":1064},[1050,3812,3814,3816,3818,3820,3822,3824,3826,3828,3830,3832],{"class":1052,"line":3813},225,[1050,3815,3158],{"class":1085},[1050,3817,2452],{"class":1064},[1050,3819,2716],{"class":2455},[1050,3821,3165],{"class":1064},[1050,3823,1152],{"class":1144},[1050,3825,3789],{"class":1148},[1050,3827,1152],{"class":1144},[1050,3829,3174],{"class":1064},[1050,3831,2459],{"class":1064},[1050,3833,3834],{"class":1085}," current_ua\n",[1050,3836,3838,3840],{"class":1052,"line":3837},226,[1050,3839,2576],{"class":1693},[1050,3841,1352],{"class":1300},[1050,3843,3845],{"class":1052,"line":3844},227,[1050,3846,1929],{"class":1085},[1050,3848,3850],{"class":1052,"line":3849},228,[1050,3851,3852],{"class":2330},"                # Allow minor version changes in browsers\n",[1050,3854,3856,3858,3860,3862,3865,3867,3870,3872,3875],{"class":1052,"line":3855},229,[1050,3857,2653],{"class":1693},[1050,3859,2557],{"class":2448},[1050,3861,2452],{"class":1064},[1050,3863,3864],{"class":2562},"is_user_agent_similar",[1050,3866,2428],{"class":1064},[1050,3868,3869],{"class":2562},"stored_ua",[1050,3871,2435],{"class":1064},[1050,3873,3874],{"class":2562}," current_ua",[1050,3876,2590],{"class":1064},[1050,3878,3880],{"class":1052,"line":3879},230,[1050,3881,1905],{"class":1085},[1050,3883,3885,3887,3890,3892,3894,3896,3898,3900,3902],{"class":1052,"line":3884},231,[1050,3886,2421],{"class":1056},[1050,3888,3889],{"class":1105}," is_user_agent_similar",[1050,3891,2428],{"class":1064},[1050,3893,2432],{"class":2431},[1050,3895,2435],{"class":1064},[1050,3897,3808],{"class":2438},[1050,3899,2435],{"class":1064},[1050,3901,3874],{"class":2438},[1050,3903,2442],{"class":1064},[1050,3905,3907,3909,3912],{"class":1052,"line":3906},232,[1050,3908,2685],{"class":1071},[1050,3910,3911],{"class":1075},"Check if User-Agent strings are similar enough",[1050,3913,1079],{"class":1071},[1050,3915,3917],{"class":1052,"line":3916},233,[1050,3918,1929],{"class":1085},[1050,3920,3922,3924,3927,3929,3931],{"class":1052,"line":3921},234,[1050,3923,2551],{"class":1693},[1050,3925,3926],{"class":1085}," stored_ua ",[1050,3928,3548],{"class":2480},[1050,3930,3874],{"class":1085},[1050,3932,1065],{"class":1064},[1050,3934,3936,3938],{"class":1052,"line":3935},235,[1050,3937,2576],{"class":1693},[1050,3939,1352],{"class":1300},[1050,3941,3943],{"class":1052,"line":3942},236,[1050,3944,1929],{"class":1085},[1050,3946,3948],{"class":1052,"line":3947},237,[1050,3949,3950],{"class":2330},"                # Extract browser and major version\n",[1050,3952,3954,3957],{"class":1052,"line":3953},238,[1050,3955,3956],{"class":1693},"                import",[1050,3958,3959],{"class":1085}," re\n",[1050,3961,3963],{"class":1052,"line":3962},239,[1050,3964,1929],{"class":1085},[1050,3966,3968,3971,3974,3976,3979],{"class":1052,"line":3967},240,[1050,3969,3970],{"class":1056},"                def",[1050,3972,3973],{"class":1105}," extract_browser_info",[1050,3975,2428],{"class":1064},[1050,3977,3978],{"class":2438},"ua",[1050,3980,2442],{"class":1064},[1050,3982,3984,3987,3989],{"class":1052,"line":3983},241,[1050,3985,3986],{"class":1085},"                    patterns ",[1050,3988,1135],{"class":1064},[1050,3990,1217],{"class":1064},[1050,3992,3994,3997,3999,4003,4005,4009,4013,4015,4017],{"class":1052,"line":3993},242,[1050,3995,3996],{"class":1056},"                        r",[1050,3998,1152],{"class":1144},[1050,4000,4002],{"class":4001},"s27EL","Chrome/",[1050,4004,2428],{"class":1064},[1050,4006,4008],{"class":4007},"sRJPX","\\d",[1050,4010,4012],{"class":4011},"sGuSu","+",[1050,4014,2721],{"class":1064},[1050,4016,1152],{"class":1144},[1050,4018,1181],{"class":1064},[1050,4020,4022,4024,4026,4029,4031,4033,4035,4037,4039],{"class":1052,"line":4021},243,[1050,4023,3996],{"class":1056},[1050,4025,1152],{"class":1144},[1050,4027,4028],{"class":4001},"Firefox/",[1050,4030,2428],{"class":1064},[1050,4032,4008],{"class":4007},[1050,4034,4012],{"class":4011},[1050,4036,2721],{"class":1064},[1050,4038,1152],{"class":1144},[1050,4040,1181],{"class":1064},[1050,4042,4044,4046,4048,4051,4053,4055,4057,4059,4061],{"class":1052,"line":4043},244,[1050,4045,3996],{"class":1056},[1050,4047,1152],{"class":1144},[1050,4049,4050],{"class":4001},"Safari/",[1050,4052,2428],{"class":1064},[1050,4054,4008],{"class":4007},[1050,4056,4012],{"class":4011},[1050,4058,2721],{"class":1064},[1050,4060,1152],{"class":1144},[1050,4062,1181],{"class":1064},[1050,4064,4066,4068,4070,4073,4075,4077,4079,4081],{"class":1052,"line":4065},245,[1050,4067,3996],{"class":1056},[1050,4069,1152],{"class":1144},[1050,4071,4072],{"class":4001},"Edge/",[1050,4074,2428],{"class":1064},[1050,4076,4008],{"class":4007},[1050,4078,4012],{"class":4011},[1050,4080,2721],{"class":1064},[1050,4082,1265],{"class":1144},[1050,4084,4086],{"class":1052,"line":4085},246,[1050,4087,4088],{"class":1064},"                    ]\n",[1050,4090,4092],{"class":1052,"line":4091},247,[1050,4093,4094],{"class":1085},"                    \n",[1050,4096,4098,4101,4104,4106,4109],{"class":1052,"line":4097},248,[1050,4099,4100],{"class":1693},"                    for",[1050,4102,4103],{"class":1085}," pattern ",[1050,4105,3663],{"class":1693},[1050,4107,4108],{"class":1085}," patterns",[1050,4110,1065],{"class":1064},[1050,4112,4114,4117,4119,4122,4124,4127,4129,4132,4134,4137],{"class":1052,"line":4113},249,[1050,4115,4116],{"class":1085},"                        match ",[1050,4118,1135],{"class":1064},[1050,4120,4121],{"class":1085}," re",[1050,4123,2452],{"class":1064},[1050,4125,4126],{"class":2562},"search",[1050,4128,2428],{"class":1064},[1050,4130,4131],{"class":2562},"pattern",[1050,4133,2435],{"class":1064},[1050,4135,4136],{"class":2562}," ua",[1050,4138,2590],{"class":1064},[1050,4140,4142,4145,4148],{"class":1052,"line":4141},250,[1050,4143,4144],{"class":1693},"                        if",[1050,4146,4147],{"class":1085}," match",[1050,4149,1065],{"class":1064},[1050,4151,4153,4156,4158,4160,4163,4165,4168,4171,4174,4176,4178,4181,4183,4186,4188,4191,4193,4195,4197,4199,4202],{"class":1052,"line":4152},251,[1050,4154,4155],{"class":1693},"                            return",[1050,4157,4147],{"class":1085},[1050,4159,2452],{"class":1064},[1050,4161,4162],{"class":2562},"group",[1050,4164,2428],{"class":1064},[1050,4166,4167],{"class":1334},"0",[1050,4169,4170],{"class":1064},").",[1050,4172,4173],{"class":2562},"split",[1050,4175,2428],{"class":1064},[1050,4177,1152],{"class":1144},[1050,4179,4180],{"class":1148},"/",[1050,4182,1152],{"class":1144},[1050,4184,4185],{"class":1064},")[",[1050,4187,4167],{"class":1334},[1050,4189,4190],{"class":1064},"],",[1050,4192,4147],{"class":1085},[1050,4194,2452],{"class":1064},[1050,4196,4162],{"class":2562},[1050,4198,2428],{"class":1064},[1050,4200,4201],{"class":1334},"1",[1050,4203,2590],{"class":1064},[1050,4205,4207],{"class":1052,"line":4206},252,[1050,4208,4094],{"class":1085},[1050,4210,4212,4214,4217,4219],{"class":1052,"line":4211},253,[1050,4213,2576],{"class":1693},[1050,4215,4216],{"class":1300}," None",[1050,4218,2435],{"class":1064},[1050,4220,4221],{"class":1300}," None\n",[1050,4223,4225],{"class":1052,"line":4224},254,[1050,4226,1929],{"class":1085},[1050,4228,4230,4233,4235,4238,4240,4242,4244,4246],{"class":1052,"line":4229},255,[1050,4231,4232],{"class":1085},"                stored_browser",[1050,4234,2435],{"class":1064},[1050,4236,4237],{"class":1085}," stored_version ",[1050,4239,1135],{"class":1064},[1050,4241,3973],{"class":2562},[1050,4243,2428],{"class":1064},[1050,4245,3869],{"class":2562},[1050,4247,2590],{"class":1064},[1050,4249,4251,4254,4256,4259,4261,4263,4265,4268],{"class":1052,"line":4250},256,[1050,4252,4253],{"class":1085},"                current_browser",[1050,4255,2435],{"class":1064},[1050,4257,4258],{"class":1085}," current_version ",[1050,4260,1135],{"class":1064},[1050,4262,3973],{"class":2562},[1050,4264,2428],{"class":1064},[1050,4266,4267],{"class":2562},"current_ua",[1050,4269,2590],{"class":1064},[1050,4271,4273],{"class":1052,"line":4272},257,[1050,4274,1929],{"class":1085},[1050,4276,4278],{"class":1052,"line":4277},258,[1050,4279,4280],{"class":2330},"                # Allow same browser with version differences\n",[1050,4282,4284,4286,4288,4291,4293,4296,4299],{"class":1052,"line":4283},259,[1050,4285,2653],{"class":1693},[1050,4287,3297],{"class":1064},[1050,4289,4290],{"class":1085},"stored_browser ",[1050,4292,3548],{"class":2480},[1050,4294,4295],{"class":1085}," current_browser ",[1050,4297,4298],{"class":2480},"and",[1050,4300,4301],{"class":1085}," \n",[1050,4303,4305,4308,4311,4313,4315],{"class":1052,"line":4304},260,[1050,4306,4307],{"class":1085},"                       stored_browser ",[1050,4309,4310],{"class":2480},"is",[1050,4312,2554],{"class":2480},[1050,4314,4216],{"class":1300},[1050,4316,2590],{"class":1064},[1050,4318,4320],{"class":1052,"line":4319},261,[1050,4321,1905],{"class":1085},[1050,4323,4325,4327,4330,4332,4334,4336,4338],{"class":1052,"line":4324},262,[1050,4326,2421],{"class":1056},[1050,4328,4329],{"class":1105}," validate_activity_patterns",[1050,4331,2428],{"class":1064},[1050,4333,2432],{"class":2431},[1050,4335,2435],{"class":1064},[1050,4337,2537],{"class":2438},[1050,4339,2442],{"class":1064},[1050,4341,4343,4345,4348],{"class":1052,"line":4342},263,[1050,4344,2685],{"class":1071},[1050,4346,4347],{"class":1075},"Detect suspicious activity patterns",[1050,4349,1079],{"class":1071},[1050,4351,4353],{"class":1052,"line":4352},264,[1050,4354,1929],{"class":1085},[1050,4356,4358],{"class":1052,"line":4357},265,[1050,4359,4360],{"class":2330},"                # Track request frequency\n",[1050,4362,4364,4367,4369,4371,4373,4375],{"class":1052,"line":4363},266,[1050,4365,4366],{"class":1085},"                now ",[1050,4368,1135],{"class":1064},[1050,4370,3179],{"class":1085},[1050,4372,2452],{"class":1064},[1050,4374,3184],{"class":2562},[1050,4376,3193],{"class":1064},[1050,4378,4380,4383,4385,4387,4389,4391,4393,4395,4397,4399,4402,4404,4406],{"class":1052,"line":4379},267,[1050,4381,4382],{"class":1085},"                activity_log ",[1050,4384,1135],{"class":1064},[1050,4386,2537],{"class":1085},[1050,4388,2452],{"class":1064},[1050,4390,2716],{"class":2455},[1050,4392,2452],{"class":1064},[1050,4394,3123],{"class":2562},[1050,4396,2428],{"class":1064},[1050,4398,1152],{"class":1144},[1050,4400,4401],{"class":1148},"_security_activity",[1050,4403,1152],{"class":1144},[1050,4405,2435],{"class":1064},[1050,4407,4408],{"class":1064}," [])\n",[1050,4410,4412],{"class":1052,"line":4411},268,[1050,4413,1929],{"class":1085},[1050,4415,4417],{"class":1052,"line":4416},269,[1050,4418,4419],{"class":2330},"                # Clean old entries (keep last hour)\n",[1050,4421,4423,4426,4428,4431,4434,4436,4438,4441,4443,4446,4448,4450],{"class":1052,"line":4422},270,[1050,4424,4425],{"class":1085},"                cutoff ",[1050,4427,1135],{"class":1064},[1050,4429,4430],{"class":1085}," now ",[1050,4432,4433],{"class":2480},"-",[1050,4435,3179],{"class":1085},[1050,4437,2452],{"class":1064},[1050,4439,4440],{"class":2562},"timedelta",[1050,4442,2428],{"class":1064},[1050,4444,4445],{"class":3622},"hours",[1050,4447,1135],{"class":1064},[1050,4449,4201],{"class":1334},[1050,4451,2590],{"class":1064},[1050,4453,4455,4457,4459],{"class":1052,"line":4454},271,[1050,4456,4382],{"class":1085},[1050,4458,1135],{"class":1064},[1050,4460,1217],{"class":1064},[1050,4462,4464,4467,4470,4473,4475],{"class":1052,"line":4463},272,[1050,4465,4466],{"class":1085},"                    timestamp ",[1050,4468,4469],{"class":1693},"for",[1050,4471,4472],{"class":1085}," timestamp ",[1050,4474,3663],{"class":1693},[1050,4476,4477],{"class":1085}," activity_log\n",[1050,4479,4481,4484,4486,4488,4490,4492,4494,4496,4499,4501,4504],{"class":1052,"line":4480},273,[1050,4482,4483],{"class":1693},"                    if",[1050,4485,3179],{"class":1085},[1050,4487,2452],{"class":1064},[1050,4489,3228],{"class":2455},[1050,4491,2452],{"class":1064},[1050,4493,3233],{"class":2562},[1050,4495,2428],{"class":1064},[1050,4497,4498],{"class":2562},"timestamp",[1050,4500,2721],{"class":1064},[1050,4502,4503],{"class":2480}," >",[1050,4505,4506],{"class":1085}," cutoff\n",[1050,4508,4510],{"class":1052,"line":4509},274,[1050,4511,1670],{"class":1064},[1050,4513,4515],{"class":1052,"line":4514},275,[1050,4516,1929],{"class":1085},[1050,4518,4520],{"class":1052,"line":4519},276,[1050,4521,4522],{"class":2330},"                # Add current request\n",[1050,4524,4526,4529,4531,4534,4536,4538,4540,4542],{"class":1052,"line":4525},277,[1050,4527,4528],{"class":1085},"                activity_log",[1050,4530,2452],{"class":1064},[1050,4532,4533],{"class":2562},"append",[1050,4535,2428],{"class":1064},[1050,4537,3184],{"class":2562},[1050,4539,2452],{"class":1064},[1050,4541,3190],{"class":2562},[1050,4543,4544],{"class":1064},"())\n",[1050,4546,4548,4551,4553,4555,4557,4559,4561,4563,4565,4567],{"class":1052,"line":4547},278,[1050,4549,4550],{"class":1085},"                request",[1050,4552,2452],{"class":1064},[1050,4554,2716],{"class":2455},[1050,4556,3165],{"class":1064},[1050,4558,1152],{"class":1144},[1050,4560,4401],{"class":1148},[1050,4562,1152],{"class":1144},[1050,4564,3174],{"class":1064},[1050,4566,2459],{"class":1064},[1050,4568,4477],{"class":1085},[1050,4570,4572],{"class":1052,"line":4571},279,[1050,4573,1929],{"class":1085},[1050,4575,4577],{"class":1052,"line":4576},280,[1050,4578,4579],{"class":2330},"                # Check for excessive requests (more than 100 per hour)\n",[1050,4581,4583,4585,4588,4590,4593,4595,4597,4600],{"class":1052,"line":4582},281,[1050,4584,2551],{"class":1693},[1050,4586,4587],{"class":2424}," len",[1050,4589,2428],{"class":1064},[1050,4591,4592],{"class":2562},"activity_log",[1050,4594,2721],{"class":1064},[1050,4596,4503],{"class":2480},[1050,4598,4599],{"class":1334}," 100",[1050,4601,1065],{"class":1064},[1050,4603,4605,4607],{"class":1052,"line":4604},282,[1050,4606,2576],{"class":1693},[1050,4608,2820],{"class":1300},[1050,4610,4612],{"class":1052,"line":4611},283,[1050,4613,1929],{"class":1085},[1050,4615,4617],{"class":1052,"line":4616},284,[1050,4618,4619],{"class":2330},"                # Check for rapid-fire requests (more than 10 per minute)\n",[1050,4621,4623,4626,4628,4630,4632,4634,4636,4638,4640,4643,4645,4647],{"class":1052,"line":4622},285,[1050,4624,4625],{"class":1085},"                recent_cutoff ",[1050,4627,1135],{"class":1064},[1050,4629,4430],{"class":1085},[1050,4631,4433],{"class":2480},[1050,4633,3179],{"class":1085},[1050,4635,2452],{"class":1064},[1050,4637,4440],{"class":2562},[1050,4639,2428],{"class":1064},[1050,4641,4642],{"class":3622},"minutes",[1050,4644,1135],{"class":1064},[1050,4646,4201],{"class":1334},[1050,4648,2590],{"class":1064},[1050,4650,4652,4655,4657],{"class":1052,"line":4651},286,[1050,4653,4654],{"class":1085},"                recent_requests ",[1050,4656,1135],{"class":1064},[1050,4658,1217],{"class":1064},[1050,4660,4662,4664,4666,4668,4670],{"class":1052,"line":4661},287,[1050,4663,4466],{"class":1085},[1050,4665,4469],{"class":1693},[1050,4667,4472],{"class":1085},[1050,4669,3663],{"class":1693},[1050,4671,4477],{"class":1085},[1050,4673,4675,4677,4679,4681,4683,4685,4687,4689,4691,4693,4695],{"class":1052,"line":4674},288,[1050,4676,4483],{"class":1693},[1050,4678,3179],{"class":1085},[1050,4680,2452],{"class":1064},[1050,4682,3228],{"class":2455},[1050,4684,2452],{"class":1064},[1050,4686,3233],{"class":2562},[1050,4688,2428],{"class":1064},[1050,4690,4498],{"class":2562},[1050,4692,2721],{"class":1064},[1050,4694,4503],{"class":2480},[1050,4696,4697],{"class":1085}," recent_cutoff\n",[1050,4699,4701],{"class":1052,"line":4700},289,[1050,4702,1670],{"class":1064},[1050,4704,4706],{"class":1052,"line":4705},290,[1050,4707,1929],{"class":1085},[1050,4709,4711,4713,4715,4717,4720,4722,4725],{"class":1052,"line":4710},291,[1050,4712,2653],{"class":1693},[1050,4714,4587],{"class":2424},[1050,4716,2428],{"class":1064},[1050,4718,4719],{"class":2562},"recent_requests",[1050,4721,2721],{"class":1064},[1050,4723,4724],{"class":2480}," \u003C=",[1050,4726,4727],{"class":1334}," 10\n",[1050,4729,4731],{"class":1052,"line":4730},292,[1050,4732,1905],{"class":1085},[1050,4734,4736,4738,4741,4743,4745,4747,4749],{"class":1052,"line":4735},293,[1050,4737,2421],{"class":1056},[1050,4739,4740],{"class":1105}," handle_security_violation",[1050,4742,2428],{"class":1064},[1050,4744,2432],{"class":2431},[1050,4746,2435],{"class":1064},[1050,4748,2537],{"class":2438},[1050,4750,2442],{"class":1064},[1050,4752,4754,4756,4759],{"class":1052,"line":4753},294,[1050,4755,2685],{"class":1071},[1050,4757,4758],{"class":1075},"Handle detected security violations",[1050,4760,1079],{"class":1071},[1050,4762,4764],{"class":1052,"line":4763},295,[1050,4765,1929],{"class":1085},[1050,4767,4769],{"class":1052,"line":4768},296,[1050,4770,4771],{"class":2330},"                # Log security event\n",[1050,4773,4775,4778,4780,4783],{"class":1052,"line":4774},297,[1050,4776,4777],{"class":1085},"                logger",[1050,4779,2452],{"class":1064},[1050,4781,4782],{"class":2562},"error",[1050,4784,4785],{"class":1064},"(\n",[1050,4787,4789,4792],{"class":1052,"line":4788},298,[1050,4790,4791],{"class":1056},"                    f",[1050,4793,4794],{"class":1148},"\"Session security violation: \"\n",[1050,4796,4798,4800,4803,4805,4808,4810,4812,4814,4816,4818,4820,4822,4824,4826,4828,4831,4833,4835,4837],{"class":1052,"line":4797},299,[1050,4799,4791],{"class":1056},[1050,4801,4802],{"class":1148},"\"session_key=",[1050,4804,2798],{"class":2797},[1050,4806,4807],{"class":2424},"getattr",[1050,4809,2428],{"class":1064},[1050,4811,2568],{"class":2562},[1050,4813,2452],{"class":1064},[1050,4815,2716],{"class":2455},[1050,4817,2435],{"class":1064},[1050,4819,1173],{"class":1144},[1050,4821,2889],{"class":1148},[1050,4823,1152],{"class":1144},[1050,4825,2435],{"class":1064},[1050,4827,1173],{"class":1144},[1050,4829,4830],{"class":1148},"None",[1050,4832,1152],{"class":1144},[1050,4834,2721],{"class":1064},[1050,4836,2808],{"class":2797},[1050,4838,4839],{"class":1148},", \"\n",[1050,4841,4843,4845,4848,4850,4852,4854,4856,4858,4860,4862,4864,4866,4868,4871,4873,4875,4877],{"class":1052,"line":4842},300,[1050,4844,4791],{"class":1056},[1050,4846,4847],{"class":1148},"\"user=",[1050,4849,2798],{"class":2797},[1050,4851,4807],{"class":2424},[1050,4853,2428],{"class":1064},[1050,4855,2568],{"class":2562},[1050,4857,2435],{"class":1064},[1050,4859,1173],{"class":1144},[1050,4861,2805],{"class":1148},[1050,4863,1152],{"class":1144},[1050,4865,2435],{"class":1064},[1050,4867,1173],{"class":1144},[1050,4869,4870],{"class":1148},"Anonymous",[1050,4872,1152],{"class":1144},[1050,4874,2721],{"class":1064},[1050,4876,2808],{"class":2797},[1050,4878,4839],{"class":1148},[1050,4880,4882,4884,4887,4889,4891,4893,4895,4897,4899,4901,4903,4905,4907,4909,4911],{"class":1052,"line":4881},301,[1050,4883,4791],{"class":1056},[1050,4885,4886],{"class":1148},"\"ip=",[1050,4888,2798],{"class":2797},[1050,4890,2568],{"class":2562},[1050,4892,2452],{"class":1064},[1050,4894,3368],{"class":3367},[1050,4896,2452],{"class":1064},[1050,4898,3123],{"class":2562},[1050,4900,2428],{"class":1064},[1050,4902,1152],{"class":1144},[1050,4904,3379],{"class":1148},[1050,4906,1152],{"class":1144},[1050,4908,2721],{"class":1064},[1050,4910,2808],{"class":2797},[1050,4912,1807],{"class":1148},[1050,4914,4916],{"class":1052,"line":4915},302,[1050,4917,4918],{"class":1064},"                )\n",[1050,4920,4922],{"class":1052,"line":4921},303,[1050,4923,1929],{"class":1085},[1050,4925,4927],{"class":1052,"line":4926},304,[1050,4928,4929],{"class":2330},"                # Clear session\n",[1050,4931,4933,4935,4937,4939,4941,4944],{"class":1052,"line":4932},305,[1050,4934,4550],{"class":1085},[1050,4936,2452],{"class":1064},[1050,4938,2716],{"class":2455},[1050,4940,2452],{"class":1064},[1050,4942,4943],{"class":2562},"flush",[1050,4945,3193],{"class":1064},[1050,4947,4949],{"class":1052,"line":4948},306,[1050,4950,1929],{"class":1085},[1050,4952,4954],{"class":1052,"line":4953},307,[1050,4955,4956],{"class":2330},"                # Redirect to login with security message\n",[1050,4958,4960,4963,4966,4968,4971,4974],{"class":1052,"line":4959},308,[1050,4961,4962],{"class":1693},"                from",[1050,4964,4965],{"class":1085}," django",[1050,4967,2452],{"class":1064},[1050,4969,4970],{"class":1085},"contrib ",[1050,4972,4973],{"class":1693},"import",[1050,4975,4976],{"class":1085}," messages\n",[1050,4978,4980,4982,4984,4986,4989,4991],{"class":1052,"line":4979},309,[1050,4981,4962],{"class":1693},[1050,4983,4965],{"class":1085},[1050,4985,2452],{"class":1064},[1050,4987,4988],{"class":1085},"shortcuts ",[1050,4990,4973],{"class":1693},[1050,4992,4993],{"class":1085}," redirect\n",[1050,4995,4997],{"class":1052,"line":4996},310,[1050,4998,1929],{"class":1085},[1050,5000,5002,5005,5007,5009],{"class":1052,"line":5001},311,[1050,5003,5004],{"class":1085},"                messages",[1050,5006,2452],{"class":1064},[1050,5008,2786],{"class":2562},[1050,5010,4785],{"class":1064},[1050,5012,5014,5016],{"class":1052,"line":5013},312,[1050,5015,3158],{"class":2562},[1050,5017,1181],{"class":1064},[1050,5019,5021,5023,5026],{"class":1052,"line":5020},313,[1050,5022,1223],{"class":1144},[1050,5024,5025],{"class":1148},"Your session was terminated for security reasons. Please log in again.",[1050,5027,1265],{"class":1144},[1050,5029,5031],{"class":1052,"line":5030},314,[1050,5032,4918],{"class":1064},[1050,5034,5036],{"class":1052,"line":5035},315,[1050,5037,1929],{"class":1085},[1050,5039,5041,5043,5046,5048,5050,5053,5055],{"class":1052,"line":5040},316,[1050,5042,2653],{"class":1693},[1050,5044,5045],{"class":2562}," redirect",[1050,5047,2428],{"class":1064},[1050,5049,1152],{"class":1144},[1050,5051,5052],{"class":1148},"login",[1050,5054,1152],{"class":1144},[1050,5056,2590],{"class":1064},[1050,5058,5060],{"class":1052,"line":5059},317,[1050,5061,1905],{"class":1085},[1050,5063,5065,5067,5070,5072,5074,5076,5078],{"class":1052,"line":5064},318,[1050,5066,2421],{"class":1056},[1050,5068,5069],{"class":1105}," update_session_security",[1050,5071,2428],{"class":1064},[1050,5073,2432],{"class":2431},[1050,5075,2435],{"class":1064},[1050,5077,2537],{"class":2438},[1050,5079,2442],{"class":1064},[1050,5081,5083,5085,5088],{"class":1052,"line":5082},319,[1050,5084,2685],{"class":1071},[1050,5086,5087],{"class":1075},"Update session security tracking data",[1050,5089,1079],{"class":1071},[1050,5091,5093],{"class":1052,"line":5092},320,[1050,5094,1929],{"class":1085},[1050,5096,5098,5100,5102,5104,5106,5108,5110,5112,5114,5116,5118,5120,5122,5124,5126,5128,5130],{"class":1052,"line":5097},321,[1050,5099,2551],{"class":1693},[1050,5101,2705],{"class":2424},[1050,5103,2428],{"class":1064},[1050,5105,2568],{"class":2562},[1050,5107,2435],{"class":1064},[1050,5109,1173],{"class":1144},[1050,5111,2716],{"class":1148},[1050,5113,1152],{"class":1144},[1050,5115,2721],{"class":1064},[1050,5117,2845],{"class":2480},[1050,5119,2554],{"class":2480},[1050,5121,2537],{"class":1085},[1050,5123,2452],{"class":1064},[1050,5125,2716],{"class":2455},[1050,5127,2452],{"class":1064},[1050,5129,2735],{"class":2562},[1050,5131,1109],{"class":1064},[1050,5133,5135,5137,5139,5141,5143,5145,5148,5150,5152,5154,5156,5158,5160,5162,5164],{"class":1052,"line":5134},322,[1050,5136,3158],{"class":1085},[1050,5138,2452],{"class":1064},[1050,5140,2716],{"class":2455},[1050,5142,3165],{"class":1064},[1050,5144,1152],{"class":1144},[1050,5146,5147],{"class":1148},"_security_last_activity",[1050,5149,1152],{"class":1144},[1050,5151,3174],{"class":1064},[1050,5153,2459],{"class":1064},[1050,5155,3179],{"class":1085},[1050,5157,2452],{"class":1064},[1050,5159,3184],{"class":2562},[1050,5161,3187],{"class":1064},[1050,5163,3190],{"class":2562},[1050,5165,3193],{"class":1064},[1050,5167,5169],{"class":1052,"line":5168},323,[1050,5170,4094],{"class":1085},[1050,5172,5174],{"class":1052,"line":5173},324,[1050,5175,5176],{"class":2330},"                    # Update request count\n",[1050,5178,5180,5183,5185,5187,5189,5191,5193,5195,5197,5199,5202,5204,5206,5209],{"class":1052,"line":5179},325,[1050,5181,5182],{"class":1085},"                    request_count ",[1050,5184,1135],{"class":1064},[1050,5186,2537],{"class":1085},[1050,5188,2452],{"class":1064},[1050,5190,2716],{"class":2455},[1050,5192,2452],{"class":1064},[1050,5194,3123],{"class":2562},[1050,5196,2428],{"class":1064},[1050,5198,1152],{"class":1144},[1050,5200,5201],{"class":1148},"_security_request_count",[1050,5203,1152],{"class":1144},[1050,5205,2435],{"class":1064},[1050,5207,5208],{"class":1334}," 0",[1050,5210,2590],{"class":1064},[1050,5212,5214,5216,5218,5220,5222,5224,5226,5228,5230,5232,5235,5237],{"class":1052,"line":5213},326,[1050,5215,3158],{"class":1085},[1050,5217,2452],{"class":1064},[1050,5219,2716],{"class":2455},[1050,5221,3165],{"class":1064},[1050,5223,1152],{"class":1144},[1050,5225,5201],{"class":1148},[1050,5227,1152],{"class":1144},[1050,5229,3174],{"class":1064},[1050,5231,2459],{"class":1064},[1050,5233,5234],{"class":1085}," request_count ",[1050,5236,4012],{"class":2480},[1050,5238,5239],{"class":1334}," 1\n",[1050,5241,5243],{"class":1052,"line":5242},327,[1050,5244,1126],{"class":1085},[1050,5246,5248,5250],{"class":1052,"line":5247},328,[1050,5249,1694],{"class":1693},[1050,5251,5252],{"class":1085}," SecureSessionMiddleware\n",[1050,5254,5256],{"class":1052,"line":5255},329,[1050,5257,1086],{"class":1085},[1050,5259,5261,5263],{"class":1052,"line":5260},330,[1050,5262,1092],{"class":1064},[1050,5264,1096],{"class":1095},[1050,5266,5268,5270,5273],{"class":1052,"line":5267},331,[1050,5269,1102],{"class":1056},[1050,5271,5272],{"class":1105}," authentication_security",[1050,5274,1109],{"class":1064},[1050,5276,5278,5280,5283],{"class":1052,"line":5277},332,[1050,5279,1115],{"class":1071},[1050,5281,5282],{"class":1075},"Secure authentication and session management",[1050,5284,1079],{"class":1071},[1050,5286,5288],{"class":1052,"line":5287},333,[1050,5289,1126],{"class":1085},[1050,5291,5293,5295,5298],{"class":1052,"line":5292},334,[1050,5294,2394],{"class":1056},[1050,5296,5297],{"class":1060}," SecureAuthenticationMixin",[1050,5299,1065],{"class":1064},[1050,5301,5303,5305,5308],{"class":1052,"line":5302},335,[1050,5304,2405],{"class":1071},[1050,5306,5307],{"class":1075},"Mixin for secure authentication handling",[1050,5309,1079],{"class":1071},[1050,5311,5313],{"class":1052,"line":5312},336,[1050,5314,1905],{"class":1085},[1050,5316,5318,5320,5323,5325,5327,5329,5331,5333,5336],{"class":1052,"line":5317},337,[1050,5319,2421],{"class":1056},[1050,5321,5322],{"class":1105}," perform_secure_login",[1050,5324,2428],{"class":1064},[1050,5326,2432],{"class":2431},[1050,5328,2435],{"class":1064},[1050,5330,2537],{"class":2438},[1050,5332,2435],{"class":1064},[1050,5334,5335],{"class":2438}," user",[1050,5337,2442],{"class":1064},[1050,5339,5341,5343,5346],{"class":1052,"line":5340},338,[1050,5342,2685],{"class":1071},[1050,5344,5345],{"class":1075},"Perform secure login with session regeneration",[1050,5347,1079],{"class":1071},[1050,5349,5351],{"class":1052,"line":5350},339,[1050,5352,1929],{"class":1085},[1050,5354,5356,5358,5360,5362,5365,5367,5370,5372],{"class":1052,"line":5355},340,[1050,5357,4962],{"class":1693},[1050,5359,4965],{"class":1085},[1050,5361,2452],{"class":1064},[1050,5363,5364],{"class":1085},"contrib",[1050,5366,2452],{"class":1064},[1050,5368,5369],{"class":1085},"auth ",[1050,5371,4973],{"class":1693},[1050,5373,5374],{"class":1085}," login\n",[1050,5376,5378],{"class":1052,"line":5377},341,[1050,5379,1929],{"class":1085},[1050,5381,5383],{"class":1052,"line":5382},342,[1050,5384,5385],{"class":2330},"                # Store pre-login session data that should persist\n",[1050,5387,5389,5392,5394,5396,5398,5401,5403,5405],{"class":1052,"line":5388},343,[1050,5390,5391],{"class":1085},"                persistent_data ",[1050,5393,1135],{"class":1064},[1050,5395,2557],{"class":2448},[1050,5397,2452],{"class":1064},[1050,5399,5400],{"class":2562},"extract_persistent_session_data",[1050,5402,2428],{"class":1064},[1050,5404,2568],{"class":2562},[1050,5406,2590],{"class":1064},[1050,5408,5410],{"class":1052,"line":5409},344,[1050,5411,1929],{"class":1085},[1050,5413,5415],{"class":1052,"line":5414},345,[1050,5416,5417],{"class":2330},"                # Regenerate session to prevent fixation\n",[1050,5419,5421,5423,5425,5427,5429,5432],{"class":1052,"line":5420},346,[1050,5422,4550],{"class":1085},[1050,5424,2452],{"class":1064},[1050,5426,2716],{"class":2455},[1050,5428,2452],{"class":1064},[1050,5430,5431],{"class":2562},"cycle_key",[1050,5433,3193],{"class":1064},[1050,5435,5437],{"class":1052,"line":5436},347,[1050,5438,1929],{"class":1085},[1050,5440,5442],{"class":1052,"line":5441},348,[1050,5443,5444],{"class":2330},"                # Perform Django login\n",[1050,5446,5448,5451,5453,5455,5457,5459],{"class":1052,"line":5447},349,[1050,5449,5450],{"class":2562},"                login",[1050,5452,2428],{"class":1064},[1050,5454,2568],{"class":2562},[1050,5456,2435],{"class":1064},[1050,5458,5335],{"class":2562},[1050,5460,2590],{"class":1064},[1050,5462,5464],{"class":1052,"line":5463},350,[1050,5465,1929],{"class":1085},[1050,5467,5469],{"class":1052,"line":5468},351,[1050,5470,5471],{"class":2330},"                # Restore persistent data\n",[1050,5473,5475,5478,5481,5483,5486,5488,5491,5493,5496],{"class":1052,"line":5474},352,[1050,5476,5477],{"class":1693},"                for",[1050,5479,5480],{"class":1085}," key",[1050,5482,2435],{"class":1064},[1050,5484,5485],{"class":1085}," value ",[1050,5487,3663],{"class":1693},[1050,5489,5490],{"class":1085}," persistent_data",[1050,5492,2452],{"class":1064},[1050,5494,5495],{"class":2562},"items",[1050,5497,1109],{"class":1064},[1050,5499,5501,5503,5505,5507,5509,5512,5514,5516],{"class":1052,"line":5500},353,[1050,5502,3158],{"class":1085},[1050,5504,2452],{"class":1064},[1050,5506,2716],{"class":2455},[1050,5508,3165],{"class":1064},[1050,5510,5511],{"class":2455},"key",[1050,5513,3174],{"class":1064},[1050,5515,2459],{"class":1064},[1050,5517,5518],{"class":1085}," value\n",[1050,5520,5522],{"class":1052,"line":5521},354,[1050,5523,1929],{"class":1085},[1050,5525,5527],{"class":1052,"line":5526},355,[1050,5528,5529],{"class":2330},"                # Set security tracking data\n",[1050,5531,5533,5535,5537,5540,5542,5544,5546,5548],{"class":1052,"line":5532},356,[1050,5534,2449],{"class":2448},[1050,5536,2452],{"class":1064},[1050,5538,5539],{"class":2562},"initialize_session_security",[1050,5541,2428],{"class":1064},[1050,5543,2568],{"class":2562},[1050,5545,2435],{"class":1064},[1050,5547,5335],{"class":2562},[1050,5549,2590],{"class":1064},[1050,5551,5553],{"class":1052,"line":5552},357,[1050,5554,1929],{"class":1085},[1050,5556,5558],{"class":1052,"line":5557},358,[1050,5559,5560],{"class":2330},"                # Log successful login\n",[1050,5562,5564,5566,5568,5571],{"class":1052,"line":5563},359,[1050,5565,4777],{"class":1085},[1050,5567,2452],{"class":1064},[1050,5569,5570],{"class":2562},"info",[1050,5572,4785],{"class":1064},[1050,5574,5576,5578,5581,5583,5585,5587,5590,5592],{"class":1052,"line":5575},360,[1050,5577,4791],{"class":1056},[1050,5579,5580],{"class":1148},"\"Secure login successful: user=",[1050,5582,2798],{"class":2797},[1050,5584,2805],{"class":2562},[1050,5586,2452],{"class":1064},[1050,5588,5589],{"class":2455},"username",[1050,5591,2808],{"class":2797},[1050,5593,4839],{"class":1148},[1050,5595,5597,5599,5601,5603,5605,5607,5609,5611,5613,5615,5617,5619,5621,5623,5625],{"class":1052,"line":5596},361,[1050,5598,4791],{"class":1056},[1050,5600,4886],{"class":1148},[1050,5602,2798],{"class":2797},[1050,5604,2568],{"class":2562},[1050,5606,2452],{"class":1064},[1050,5608,3368],{"class":3367},[1050,5610,2452],{"class":1064},[1050,5612,3123],{"class":2562},[1050,5614,2428],{"class":1064},[1050,5616,1152],{"class":1144},[1050,5618,3379],{"class":1148},[1050,5620,1152],{"class":1144},[1050,5622,2721],{"class":1064},[1050,5624,2808],{"class":2797},[1050,5626,1807],{"class":1148},[1050,5628,5630],{"class":1052,"line":5629},362,[1050,5631,4918],{"class":1064},[1050,5633,5635],{"class":1052,"line":5634},363,[1050,5636,1905],{"class":1085},[1050,5638,5640,5642,5645,5647,5649,5651,5653],{"class":1052,"line":5639},364,[1050,5641,2421],{"class":1056},[1050,5643,5644],{"class":1105}," extract_persistent_session_data",[1050,5646,2428],{"class":1064},[1050,5648,2432],{"class":2431},[1050,5650,2435],{"class":1064},[1050,5652,2537],{"class":2438},[1050,5654,2442],{"class":1064},[1050,5656,5658,5660,5663],{"class":1052,"line":5657},365,[1050,5659,2685],{"class":1071},[1050,5661,5662],{"class":1075},"Extract session data that should persist across login",[1050,5664,1079],{"class":1071},[1050,5666,5668],{"class":1052,"line":5667},366,[1050,5669,1929],{"class":1085},[1050,5671,5673,5676,5678],{"class":1052,"line":5672},367,[1050,5674,5675],{"class":1085},"                persistent_keys ",[1050,5677,1135],{"class":1064},[1050,5679,1217],{"class":1064},[1050,5681,5683,5685,5688,5690],{"class":1052,"line":5682},368,[1050,5684,1223],{"class":1144},[1050,5686,5687],{"class":1148},"shopping_cart",[1050,5689,1152],{"class":1144},[1050,5691,1181],{"class":1064},[1050,5693,5695,5697,5700,5702],{"class":1052,"line":5694},369,[1050,5696,1223],{"class":1144},[1050,5698,5699],{"class":1148},"language_preference",[1050,5701,1152],{"class":1144},[1050,5703,1181],{"class":1064},[1050,5705,5707,5709,5712,5714],{"class":1052,"line":5706},370,[1050,5708,1223],{"class":1144},[1050,5710,5711],{"class":1148},"theme_preference",[1050,5713,1152],{"class":1144},[1050,5715,1181],{"class":1064},[1050,5717,5719,5721,5724],{"class":1052,"line":5718},371,[1050,5720,1223],{"class":1144},[1050,5722,5723],{"class":1148},"csrf_token",[1050,5725,1265],{"class":1144},[1050,5727,5729],{"class":1052,"line":5728},372,[1050,5730,1670],{"class":1064},[1050,5732,5734],{"class":1052,"line":5733},373,[1050,5735,1929],{"class":1085},[1050,5737,5739,5741],{"class":1052,"line":5738},374,[1050,5740,2653],{"class":1693},[1050,5742,1138],{"class":1064},[1050,5744,5746,5749,5751,5753,5755,5757,5759,5761],{"class":1052,"line":5745},375,[1050,5747,5748],{"class":1085},"                    key",[1050,5750,1155],{"class":1064},[1050,5752,2537],{"class":1085},[1050,5754,2452],{"class":1064},[1050,5756,2716],{"class":2455},[1050,5758,3165],{"class":1064},[1050,5760,5511],{"class":2455},[1050,5762,5763],{"class":1064},"]\n",[1050,5765,5767,5769,5772,5774],{"class":1052,"line":5766},376,[1050,5768,4100],{"class":1693},[1050,5770,5771],{"class":1085}," key ",[1050,5773,3663],{"class":1693},[1050,5775,5776],{"class":1085}," persistent_keys\n",[1050,5778,5780,5782,5784,5786,5788,5790],{"class":1052,"line":5779},377,[1050,5781,4483],{"class":1693},[1050,5783,5771],{"class":1085},[1050,5785,3663],{"class":2480},[1050,5787,2537],{"class":1085},[1050,5789,2452],{"class":1064},[1050,5791,5792],{"class":2455},"session\n",[1050,5794,5796],{"class":1052,"line":5795},378,[1050,5797,1358],{"class":1064},[1050,5799,5801],{"class":1052,"line":5800},379,[1050,5802,1905],{"class":1085},[1050,5804,5806,5808,5811,5813,5815,5817,5819,5821,5823],{"class":1052,"line":5805},380,[1050,5807,2421],{"class":1056},[1050,5809,5810],{"class":1105}," initialize_session_security",[1050,5812,2428],{"class":1064},[1050,5814,2432],{"class":2431},[1050,5816,2435],{"class":1064},[1050,5818,2537],{"class":2438},[1050,5820,2435],{"class":1064},[1050,5822,5335],{"class":2438},[1050,5824,2442],{"class":1064},[1050,5826,5828,5830,5833],{"class":1052,"line":5827},381,[1050,5829,2685],{"class":1071},[1050,5831,5832],{"class":1075},"Initialize security tracking for new session",[1050,5834,1079],{"class":1071},[1050,5836,5838],{"class":1052,"line":5837},382,[1050,5839,1929],{"class":1085},[1050,5841,5843,5846,5848],{"class":1052,"line":5842},383,[1050,5844,5845],{"class":1085},"                security_data ",[1050,5847,1135],{"class":1064},[1050,5849,1138],{"class":1064},[1050,5851,5853,5855,5857,5859,5861,5863,5865,5867,5869,5871],{"class":1052,"line":5852},384,[1050,5854,1223],{"class":1144},[1050,5856,3130],{"class":1148},[1050,5858,1152],{"class":1144},[1050,5860,1155],{"class":1064},[1050,5862,3179],{"class":1085},[1050,5864,2452],{"class":1064},[1050,5866,3184],{"class":2562},[1050,5868,3187],{"class":1064},[1050,5870,3190],{"class":2562},[1050,5872,5873],{"class":1064},"(),\n",[1050,5875,5877,5879,5881,5883,5885,5887,5889,5891,5893,5895,5897,5899,5901,5903],{"class":1052,"line":5876},385,[1050,5878,1223],{"class":1144},[1050,5880,3408],{"class":1148},[1050,5882,1152],{"class":1144},[1050,5884,1155],{"class":1064},[1050,5886,2537],{"class":1085},[1050,5888,2452],{"class":1064},[1050,5890,3368],{"class":3367},[1050,5892,2452],{"class":1064},[1050,5894,3123],{"class":2562},[1050,5896,2428],{"class":1064},[1050,5898,1152],{"class":1144},[1050,5900,3379],{"class":1148},[1050,5902,1152],{"class":1144},[1050,5904,5905],{"class":1064},"),\n",[1050,5907,5909,5911,5913,5915,5917,5919,5921,5923,5925,5927,5929,5931,5933,5935,5937,5939],{"class":1052,"line":5908},386,[1050,5910,1223],{"class":1144},[1050,5912,3789],{"class":1148},[1050,5914,1152],{"class":1144},[1050,5916,1155],{"class":1064},[1050,5918,2537],{"class":1085},[1050,5920,2452],{"class":1064},[1050,5922,3368],{"class":3367},[1050,5924,2452],{"class":1064},[1050,5926,3123],{"class":2562},[1050,5928,2428],{"class":1064},[1050,5930,1152],{"class":1144},[1050,5932,3755],{"class":1148},[1050,5934,1152],{"class":1144},[1050,5936,2435],{"class":1064},[1050,5938,3762],{"class":1144},[1050,5940,5905],{"class":1064},[1050,5942,5944,5946,5949,5951,5953,5955,5957,5960],{"class":1052,"line":5943},387,[1050,5945,1223],{"class":1144},[1050,5947,5948],{"class":1148},"_security_user_id",[1050,5950,1152],{"class":1144},[1050,5952,1155],{"class":1064},[1050,5954,5335],{"class":1085},[1050,5956,2452],{"class":1064},[1050,5958,5959],{"class":2455},"id",[1050,5961,1181],{"class":1064},[1050,5963,5965,5967,5970,5972,5974,5976,5978,5980,5982,5984],{"class":1052,"line":5964},388,[1050,5966,1223],{"class":1144},[1050,5968,5969],{"class":1148},"_security_login_timestamp",[1050,5971,1152],{"class":1144},[1050,5973,1155],{"class":1064},[1050,5975,3179],{"class":1085},[1050,5977,2452],{"class":1064},[1050,5979,3184],{"class":2562},[1050,5981,3187],{"class":1064},[1050,5983,3190],{"class":2562},[1050,5985,5873],{"class":1064},[1050,5987,5989,5991,5993,5995,5997,5999],{"class":1052,"line":5988},389,[1050,5990,1223],{"class":1144},[1050,5992,5201],{"class":1148},[1050,5994,1152],{"class":1144},[1050,5996,1155],{"class":1064},[1050,5998,5208],{"class":1334},[1050,6000,1181],{"class":1064},[1050,6002,6004,6006,6008,6010,6012],{"class":1052,"line":6003},390,[1050,6005,1223],{"class":1144},[1050,6007,4401],{"class":1148},[1050,6009,1152],{"class":1144},[1050,6011,1155],{"class":1064},[1050,6013,6014],{"class":1064}," []\n",[1050,6016,6018],{"class":1052,"line":6017},391,[1050,6019,1358],{"class":1064},[1050,6021,6023],{"class":1052,"line":6022},392,[1050,6024,1929],{"class":1085},[1050,6026,6028,6030,6032,6034,6036,6038,6041,6043,6045],{"class":1052,"line":6027},393,[1050,6029,5477],{"class":1693},[1050,6031,5480],{"class":1085},[1050,6033,2435],{"class":1064},[1050,6035,5485],{"class":1085},[1050,6037,3663],{"class":1693},[1050,6039,6040],{"class":1085}," security_data",[1050,6042,2452],{"class":1064},[1050,6044,5495],{"class":2562},[1050,6046,1109],{"class":1064},[1050,6048,6050,6052,6054,6056,6058,6060,6062,6064],{"class":1052,"line":6049},394,[1050,6051,3158],{"class":1085},[1050,6053,2452],{"class":1064},[1050,6055,2716],{"class":2455},[1050,6057,3165],{"class":1064},[1050,6059,5511],{"class":2455},[1050,6061,3174],{"class":1064},[1050,6063,2459],{"class":1064},[1050,6065,5518],{"class":1085},[1050,6067,6069],{"class":1052,"line":6068},395,[1050,6070,1905],{"class":1085},[1050,6072,6074,6076,6079,6081,6083,6085,6087],{"class":1052,"line":6073},396,[1050,6075,2421],{"class":1056},[1050,6077,6078],{"class":1105}," perform_secure_logout",[1050,6080,2428],{"class":1064},[1050,6082,2432],{"class":2431},[1050,6084,2435],{"class":1064},[1050,6086,2537],{"class":2438},[1050,6088,2442],{"class":1064},[1050,6090,6092,6094,6097],{"class":1052,"line":6091},397,[1050,6093,2685],{"class":1071},[1050,6095,6096],{"class":1075},"Perform secure logout with session cleanup",[1050,6098,1079],{"class":1071},[1050,6100,6102],{"class":1052,"line":6101},398,[1050,6103,1929],{"class":1085},[1050,6105,6107,6109,6111,6113,6115,6117,6119,6121],{"class":1052,"line":6106},399,[1050,6108,4962],{"class":1693},[1050,6110,4965],{"class":1085},[1050,6112,2452],{"class":1064},[1050,6114,5364],{"class":1085},[1050,6116,2452],{"class":1064},[1050,6118,5369],{"class":1085},[1050,6120,4973],{"class":1693},[1050,6122,6123],{"class":1085}," logout\n",[1050,6125,6127],{"class":1052,"line":6126},400,[1050,6128,1929],{"class":1085},[1050,6130,6132],{"class":1052,"line":6131},401,[1050,6133,6134],{"class":2330},"                # Log logout\n",[1050,6136,6138,6140,6142,6144,6146,6148,6150,6152,6154,6156,6158,6160,6162,6164,6166,6169],{"class":1052,"line":6137},402,[1050,6139,2551],{"class":1693},[1050,6141,2705],{"class":2424},[1050,6143,2428],{"class":1064},[1050,6145,2568],{"class":2562},[1050,6147,2435],{"class":1064},[1050,6149,1173],{"class":1144},[1050,6151,2805],{"class":1148},[1050,6153,1152],{"class":1144},[1050,6155,2721],{"class":1064},[1050,6157,2845],{"class":2480},[1050,6159,2537],{"class":1085},[1050,6161,2452],{"class":1064},[1050,6163,2805],{"class":2455},[1050,6165,2452],{"class":1064},[1050,6167,6168],{"class":2455},"is_authenticated",[1050,6170,1065],{"class":1064},[1050,6172,6174,6176,6178,6180],{"class":1052,"line":6173},403,[1050,6175,2781],{"class":1085},[1050,6177,2452],{"class":1064},[1050,6179,5570],{"class":2562},[1050,6181,4785],{"class":1064},[1050,6183,6185,6188,6191,6193,6195,6197,6199,6201,6203,6205],{"class":1052,"line":6184},404,[1050,6186,6187],{"class":1056},"                        f",[1050,6189,6190],{"class":1148},"\"Secure logout: user=",[1050,6192,2798],{"class":2797},[1050,6194,2568],{"class":2562},[1050,6196,2452],{"class":1064},[1050,6198,2805],{"class":2455},[1050,6200,2452],{"class":1064},[1050,6202,5589],{"class":2455},[1050,6204,2808],{"class":2797},[1050,6206,4839],{"class":1148},[1050,6208,6210,6212,6214,6216,6218,6220,6222,6224,6226,6228,6230,6232,6234,6236,6238],{"class":1052,"line":6209},405,[1050,6211,6187],{"class":1056},[1050,6213,4886],{"class":1148},[1050,6215,2798],{"class":2797},[1050,6217,2568],{"class":2562},[1050,6219,2452],{"class":1064},[1050,6221,3368],{"class":3367},[1050,6223,2452],{"class":1064},[1050,6225,3123],{"class":2562},[1050,6227,2428],{"class":1064},[1050,6229,1152],{"class":1144},[1050,6231,3379],{"class":1148},[1050,6233,1152],{"class":1144},[1050,6235,2721],{"class":1064},[1050,6237,2808],{"class":2797},[1050,6239,1807],{"class":1148},[1050,6241,6243],{"class":1052,"line":6242},406,[1050,6244,6245],{"class":1064},"                    )\n",[1050,6247,6249],{"class":1052,"line":6248},407,[1050,6250,1929],{"class":1085},[1050,6252,6254],{"class":1052,"line":6253},408,[1050,6255,6256],{"class":2330},"                # Perform Django logout\n",[1050,6258,6260,6263,6265,6267],{"class":1052,"line":6259},409,[1050,6261,6262],{"class":2562},"                logout",[1050,6264,2428],{"class":1064},[1050,6266,2568],{"class":2562},[1050,6268,2590],{"class":1064},[1050,6270,6272],{"class":1052,"line":6271},410,[1050,6273,1929],{"class":1085},[1050,6275,6277],{"class":1052,"line":6276},411,[1050,6278,6279],{"class":2330},"                # Completely flush session\n",[1050,6281,6283,6285,6287,6289,6291,6293],{"class":1052,"line":6282},412,[1050,6284,4550],{"class":1085},[1050,6286,2452],{"class":1064},[1050,6288,2716],{"class":2455},[1050,6290,2452],{"class":1064},[1050,6292,4943],{"class":2562},[1050,6294,3193],{"class":1064},[1050,6296,6298],{"class":1052,"line":6297},413,[1050,6299,1905],{"class":1085},[1050,6301,6303,6305,6308,6310,6312,6314,6316],{"class":1052,"line":6302},414,[1050,6304,2421],{"class":1056},[1050,6306,6307],{"class":1105}," check_session_integrity",[1050,6309,2428],{"class":1064},[1050,6311,2432],{"class":2431},[1050,6313,2435],{"class":1064},[1050,6315,2537],{"class":2438},[1050,6317,2442],{"class":1064},[1050,6319,6321,6323,6326],{"class":1052,"line":6320},415,[1050,6322,2685],{"class":1071},[1050,6324,6325],{"class":1075},"Check session integrity and user consistency",[1050,6327,1079],{"class":1071},[1050,6329,6331],{"class":1052,"line":6330},416,[1050,6332,1929],{"class":1085},[1050,6334,6336,6338,6340,6342,6344,6346,6348,6350],{"class":1052,"line":6335},417,[1050,6337,2551],{"class":1693},[1050,6339,2554],{"class":2480},[1050,6341,2537],{"class":1085},[1050,6343,2452],{"class":1064},[1050,6345,2805],{"class":2455},[1050,6347,2452],{"class":1064},[1050,6349,6168],{"class":2455},[1050,6351,1065],{"class":1064},[1050,6353,6355,6357],{"class":1052,"line":6354},418,[1050,6356,2576],{"class":1693},[1050,6358,1352],{"class":1300},[1050,6360,6362],{"class":1052,"line":6361},419,[1050,6363,1929],{"class":1085},[1050,6365,6367],{"class":1052,"line":6366},420,[1050,6368,6369],{"class":2330},"                # Check if session user matches authenticated user\n",[1050,6371,6373,6376,6378,6380,6382,6384,6386,6388,6390,6392,6394,6396],{"class":1052,"line":6372},421,[1050,6374,6375],{"class":1085},"                session_user_id ",[1050,6377,1135],{"class":1064},[1050,6379,2537],{"class":1085},[1050,6381,2452],{"class":1064},[1050,6383,2716],{"class":2455},[1050,6385,2452],{"class":1064},[1050,6387,3123],{"class":2562},[1050,6389,2428],{"class":1064},[1050,6391,1152],{"class":1144},[1050,6393,5948],{"class":1148},[1050,6395,1152],{"class":1144},[1050,6397,2590],{"class":1064},[1050,6399,6401,6403,6406,6408,6410,6413,6415,6417,6419,6421,6423],{"class":1052,"line":6400},422,[1050,6402,2551],{"class":1693},[1050,6404,6405],{"class":1085}," session_user_id ",[1050,6407,4298],{"class":2480},[1050,6409,6405],{"class":1085},[1050,6411,6412],{"class":2480},"!=",[1050,6414,2537],{"class":1085},[1050,6416,2452],{"class":1064},[1050,6418,2805],{"class":2455},[1050,6420,2452],{"class":1064},[1050,6422,5959],{"class":2455},[1050,6424,1065],{"class":1064},[1050,6426,6428,6430,6432,6434],{"class":1052,"line":6427},423,[1050,6429,2781],{"class":1085},[1050,6431,2452],{"class":1064},[1050,6433,2786],{"class":2562},[1050,6435,4785],{"class":1064},[1050,6437,6439,6441,6444,6446,6449,6451],{"class":1052,"line":6438},424,[1050,6440,6187],{"class":1056},[1050,6442,6443],{"class":1148},"\"Session user mismatch: session_user=",[1050,6445,2798],{"class":2797},[1050,6447,6448],{"class":2562},"session_user_id",[1050,6450,2808],{"class":2797},[1050,6452,4839],{"class":1148},[1050,6454,6456,6458,6461,6463,6465,6467,6469,6471,6473,6475],{"class":1052,"line":6455},425,[1050,6457,6187],{"class":1056},[1050,6459,6460],{"class":1148},"\"auth_user=",[1050,6462,2798],{"class":2797},[1050,6464,2568],{"class":2562},[1050,6466,2452],{"class":1064},[1050,6468,2805],{"class":2455},[1050,6470,2452],{"class":1064},[1050,6472,5959],{"class":2455},[1050,6474,2808],{"class":2797},[1050,6476,1807],{"class":1148},[1050,6478,6480],{"class":1052,"line":6479},426,[1050,6481,6245],{"class":1064},[1050,6483,6485,6487],{"class":1052,"line":6484},427,[1050,6486,2576],{"class":1693},[1050,6488,2820],{"class":1300},[1050,6490,6492],{"class":1052,"line":6491},428,[1050,6493,1929],{"class":1085},[1050,6495,6497,6499],{"class":1052,"line":6496},429,[1050,6498,2653],{"class":1693},[1050,6500,1352],{"class":1300},[1050,6502,6504],{"class":1052,"line":6503},430,[1050,6505,1126],{"class":1085},[1050,6507,6509,6511],{"class":1052,"line":6508},431,[1050,6510,1694],{"class":1693},[1050,6512,6513],{"class":1085}," SecureAuthenticationMixin\n",[1030,6515,6517],{"id":6516},"advanced-security-measures","Advanced Security Measures",[1035,6519,6521],{"id":6520},"multi-factor-session-security","Multi-Factor Session Security",[1040,6523,6525],{"className":1042,"code":6524,"language":1044,"meta":1045,"style":1045},"class MultiFactorSessionSecurity:\n    \"\"\"Advanced multi-factor session security implementation\"\"\"\n    \n    @staticmethod\n    def device_fingerprinting():\n        \"\"\"Implement device fingerprinting for session security\"\"\"\n        \n        class DeviceFingerprintManager:\n            \"\"\"Manage device fingerprints for session security\"\"\"\n            \n            @staticmethod\n            def generate_device_fingerprint(request):\n                \"\"\"Generate device fingerprint from request data\"\"\"\n                \n                import hashlib\n                \n                fingerprint_data = [\n                    request.META.get('HTTP_USER_AGENT', ''),\n                    request.META.get('HTTP_ACCEPT_LANGUAGE', ''),\n                    request.META.get('HTTP_ACCEPT_ENCODING', ''),\n                    request.META.get('HTTP_ACCEPT', ''),\n                    # Add more headers as needed\n                ]\n                \n                # Create hash of combined data\n                combined_data = '|'.join(fingerprint_data)\n                fingerprint = hashlib.sha256(combined_data.encode()).hexdigest()\n                \n                return fingerprint[:16]  # Use first 16 characters\n            \n            @staticmethod\n            def validate_device_fingerprint(request):\n                \"\"\"Validate device fingerprint against stored value\"\"\"\n                \n                current_fingerprint = DeviceFingerprintManager.generate_device_fingerprint(request)\n                stored_fingerprint = request.session.get('_device_fingerprint')\n                \n                if not stored_fingerprint:\n                    request.session['_device_fingerprint'] = current_fingerprint\n                    return True\n                \n                # Allow some variation in fingerprint\n                return DeviceFingerprintManager.fingerprints_similar(\n                    stored_fingerprint, current_fingerprint\n                )\n            \n            @staticmethod\n            def fingerprints_similar(stored, current):\n                \"\"\"Check if fingerprints are similar enough\"\"\"\n                \n                # Simple similarity check - could be enhanced\n                if stored == current:\n                    return True\n                \n                # Allow minor differences (e.g., browser updates)\n                differences = sum(c1 != c2 for c1, c2 in zip(stored, current))\n                return differences \u003C= 2  # Allow up to 2 character differences\n        \n        return DeviceFingerprintManager\n    \n    @staticmethod\n    def session_encryption():\n        \"\"\"Implement session data encryption\"\"\"\n        \n        class EncryptedSessionStore:\n            \"\"\"Session store with transparent encryption\"\"\"\n            \n            def __init__(self, session_key=None):\n                from django.contrib.sessions.backends.db import SessionStore\n                self.base_store = SessionStore(session_key)\n                self.cipher = self._get_cipher()\n            \n            def _get_cipher(self):\n                \"\"\"Get encryption cipher\"\"\"\n                \n                from cryptography.fernet import Fernet\n                import base64\n                import hashlib\n                \n                # Derive encryption key from Django SECRET_KEY\n                key_material = settings.SECRET_KEY.encode()\n                key = hashlib.sha256(key_material).digest()\n                fernet_key = base64.urlsafe_b64encode(key)\n                \n                return Fernet(fernet_key)\n            \n            def load(self):\n                \"\"\"Load and decrypt session data\"\"\"\n                \n                encrypted_data = self.base_store.load()\n                \n                if not encrypted_data:\n                    return {}\n                \n                try:\n                    # Decrypt session data\n                    decrypted_data = {}\n                    for key, value in encrypted_data.items():\n                        if key.startswith('_encrypted_'):\n                            # Decrypt encrypted fields\n                            original_key = key[11:]  # Remove '_encrypted_' prefix\n                            decrypted_value = self.cipher.decrypt(value.encode()).decode()\n                            decrypted_data[original_key] = json.loads(decrypted_value)\n                        else:\n                            # Keep non-encrypted fields as-is\n                            decrypted_data[key] = value\n                    \n                    return decrypted_data\n                \n                except Exception as e:\n                    logger.error(f\"Session decryption failed: {e}\")\n                    return {}\n            \n            def save(self, must_create=False):\n                \"\"\"Encrypt and save session data\"\"\"\n                \n                session_data = self._get_session(no_load=True)\n                \n                # Identify sensitive fields to encrypt\n                sensitive_fields = [\n                    'user_data', 'payment_info', 'personal_info',\n                    'api_tokens', 'oauth_tokens'\n                ]\n                \n                encrypted_data = {}\n                \n                for key, value in session_data.items():\n                    if key in sensitive_fields:\n                        # Encrypt sensitive fields\n                        json_value = json.dumps(value)\n                        encrypted_value = self.cipher.encrypt(json_value.encode()).decode()\n                        encrypted_data[f'_encrypted_{key}'] = encrypted_value\n                    else:\n                        # Keep non-sensitive fields unencrypted\n                        encrypted_data[key] = value\n                \n                # Save encrypted data using base store\n                self.base_store._session_cache = encrypted_data\n                self.base_store.save(must_create)\n            \n            def delete(self, session_key=None):\n                \"\"\"Delete session\"\"\"\n                return self.base_store.delete(session_key)\n            \n            # Delegate other methods to base store\n            def __getattr__(self, name):\n                return getattr(self.base_store, name)\n        \n        return EncryptedSessionStore\n    \n    @staticmethod\n    def session_monitoring():\n        \"\"\"Implement comprehensive session monitoring\"\"\"\n        \n        class SessionMonitor:\n            \"\"\"Monitor and analyze session security events\"\"\"\n            \n            def __init__(self):\n                self.suspicious_patterns = {\n                    'rapid_requests': {'threshold': 50, 'window': 300},  # 50 requests in 5 minutes\n                    'multiple_ips': {'threshold': 3, 'window': 3600},   # 3 different IPs in 1 hour\n                    'unusual_hours': {'start': 2, 'end': 6},            # Activity between 2-6 AM\n                    'geographic_anomaly': {'max_distance': 1000}        # 1000km travel in short time\n                }\n            \n            def log_session_event(self, request, event_type, details=None):\n                \"\"\"Log session security event\"\"\"\n                \n                event_data = {\n                    'timestamp': timezone.now().isoformat(),\n                    'session_key': getattr(request.session, 'session_key', None),\n                    'user_id': getattr(request.user, 'id', None),\n                    'ip_address': request.META.get('REMOTE_ADDR'),\n                    'user_agent': request.META.get('HTTP_USER_AGENT', ''),\n                    'event_type': event_type,\n                    'details': details or {}\n                }\n                \n                # Store in session for analysis\n                events = request.session.get('_security_events', [])\n                events.append(event_data)\n                \n                # Keep only recent events (last 24 hours)\n                cutoff = timezone.now() - timezone.timedelta(hours=24)\n                events = [\n                    event for event in events\n                    if timezone.datetime.fromisoformat(event['timestamp']) > cutoff\n                ]\n                \n                request.session['_security_events'] = events\n                \n                # Analyze for suspicious patterns\n                self.analyze_security_events(request, events)\n            \n            def analyze_security_events(self, request, events):\n                \"\"\"Analyze events for suspicious patterns\"\"\"\n                \n                # Check for rapid requests\n                if self.detect_rapid_requests(events):\n                    self.handle_security_alert(request, 'rapid_requests', events)\n                \n                # Check for multiple IP addresses\n                if self.detect_multiple_ips(events):\n                    self.handle_security_alert(request, 'multiple_ips', events)\n                \n                # Check for unusual activity hours\n                if self.detect_unusual_hours(events):\n                    self.handle_security_alert(request, 'unusual_hours', events)\n            \n            def detect_rapid_requests(self, events):\n                \"\"\"Detect rapid request patterns\"\"\"\n                \n                pattern = self.suspicious_patterns['rapid_requests']\n                cutoff = timezone.now() - timezone.timedelta(seconds=pattern['window'])\n                \n                recent_events = [\n                    event for event in events\n                    if timezone.datetime.fromisoformat(event['timestamp']) > cutoff\n                ]\n                \n                return len(recent_events) > pattern['threshold']\n            \n            def detect_multiple_ips(self, events):\n                \"\"\"Detect multiple IP addresses\"\"\"\n                \n                pattern = self.suspicious_patterns['multiple_ips']\n                cutoff = timezone.now() - timezone.timedelta(seconds=pattern['window'])\n                \n                recent_events = [\n                    event for event in events\n                    if timezone.datetime.fromisoformat(event['timestamp']) > cutoff\n                ]\n                \n                unique_ips = set(event['ip_address'] for event in recent_events)\n                return len(unique_ips) > pattern['threshold']\n            \n            def detect_unusual_hours(self, events):\n                \"\"\"Detect activity during unusual hours\"\"\"\n                \n                pattern = self.suspicious_patterns['unusual_hours']\n                \n                for event in events[-5:]:  # Check last 5 events\n                    event_time = timezone.datetime.fromisoformat(event['timestamp'])\n                    hour = event_time.hour\n                    \n                    if pattern['start'] \u003C= hour \u003C= pattern['end']:\n                        return True\n                \n                return False\n            \n            def handle_security_alert(self, request, alert_type, events):\n                \"\"\"Handle security alert\"\"\"\n                \n                logger.warning(\n                    f\"Security alert: {alert_type} detected for session \"\n                    f\"{request.session.session_key}\"\n                )\n                \n                # Implement response based on alert type\n                if alert_type == 'rapid_requests':\n                    # Implement rate limiting\n                    request.session['_rate_limited'] = True\n                    request.session['_rate_limit_until'] = (\n                        timezone.now() + timezone.timedelta(minutes=15)\n                    ).isoformat()\n                \n                elif alert_type == 'multiple_ips':\n                    # Require re-authentication\n                    request.session['_require_reauth'] = True\n                \n                elif alert_type == 'unusual_hours':\n                    # Log for review but don't block\n                    request.session['_flagged_for_review'] = True\n        \n        return SessionMonitor\n",[1047,6526,6527,6536,6545,6549,6555,6564,6573,6577,6586,6595,6599,6606,6619,6628,6632,6639,6643,6652,6678,6705,6732,6759,6764,6768,6772,6777,6803,6836,6840,6858,6862,6868,6881,6890,6894,6914,6942,6946,6957,6980,6986,6990,6995,7008,7017,7021,7025,7031,7050,7059,7063,7068,7081,7087,7091,7096,7141,7157,7161,7168,7172,7178,7187,7196,7200,7209,7218,7222,7243,7273,7293,7313,7317,7330,7339,7343,7360,7367,7373,7377,7382,7403,7428,7449,7453,7467,7471,7484,7493,7497,7517,7521,7532,7539,7543,7549,7554,7563,7583,7605,7610,7630,7664,7693,7700,7705,7719,7723,7730,7734,7749,7775,7781,7785,7807,7816,7820,7846,7850,7855,7864,7893,7911,7915,7919,7927,7931,7952,7965,7970,7990,8023,8050,8057,8062,8076,8080,8085,8103,8123,8127,8148,8157,8178,8182,8187,8205,8226,8230,8237,8241,8247,8256,8265,8269,8278,8287,8291,8303,8316,8362,8403,8446,8476,8480,8484,8515,8524,8528,8537,8559,8593,8628,8658,8693,8708,8727,8731,8735,8740,8770,8786,8790,8795,8828,8836,8851,8885,8889,8893,8915,8919,8924,8944,8948,8969,8978,8982,8987,9005,9033,9037,9042,9059,9085,9089,9094,9111,9137,9141,9158,9167,9171,9194,9236,9240,9249,9261,9293,9297,9301,9329,9333,9350,9359,9363,9385,9425,9429,9437,9449,9481,9485,9489,9525,9552,9556,9573,9582,9586,9608,9612,9635,9666,9681,9685,9721,9728,9732,9738,9742,9768,9777,9781,9791,9808,9830,9834,9838,9843,9860,9865,9888,9912,9943,9952,9956,9973,9978,10001,10005,10021,10026,10049,10053],{"__ignoreMap":1045},[1050,6528,6529,6531,6534],{"class":1052,"line":1053},[1050,6530,1057],{"class":1056},[1050,6532,6533],{"class":1060}," MultiFactorSessionSecurity",[1050,6535,1065],{"class":1064},[1050,6537,6538,6540,6543],{"class":1052,"line":1068},[1050,6539,1072],{"class":1071},[1050,6541,6542],{"class":1075},"Advanced multi-factor session security implementation",[1050,6544,1079],{"class":1071},[1050,6546,6547],{"class":1052,"line":1082},[1050,6548,1086],{"class":1085},[1050,6550,6551,6553],{"class":1052,"line":1089},[1050,6552,1092],{"class":1064},[1050,6554,1096],{"class":1095},[1050,6556,6557,6559,6562],{"class":1052,"line":1099},[1050,6558,1102],{"class":1056},[1050,6560,6561],{"class":1105}," device_fingerprinting",[1050,6563,1109],{"class":1064},[1050,6565,6566,6568,6571],{"class":1052,"line":1112},[1050,6567,1115],{"class":1071},[1050,6569,6570],{"class":1075},"Implement device fingerprinting for session security",[1050,6572,1079],{"class":1071},[1050,6574,6575],{"class":1052,"line":1123},[1050,6576,1126],{"class":1085},[1050,6578,6579,6581,6584],{"class":1052,"line":1129},[1050,6580,2394],{"class":1056},[1050,6582,6583],{"class":1060}," DeviceFingerprintManager",[1050,6585,1065],{"class":1064},[1050,6587,6588,6590,6593],{"class":1052,"line":1141},[1050,6589,2405],{"class":1071},[1050,6591,6592],{"class":1075},"Manage device fingerprints for session security",[1050,6594,1079],{"class":1071},[1050,6596,6597],{"class":1052,"line":1160},[1050,6598,1905],{"class":1085},[1050,6600,6601,6604],{"class":1052,"line":1184},[1050,6602,6603],{"class":1064},"            @",[1050,6605,1096],{"class":1095},[1050,6607,6608,6610,6613,6615,6617],{"class":1052,"line":1205},[1050,6609,2421],{"class":1056},[1050,6611,6612],{"class":1105}," generate_device_fingerprint",[1050,6614,2428],{"class":1064},[1050,6616,2568],{"class":2438},[1050,6618,2442],{"class":1064},[1050,6620,6621,6623,6626],{"class":1052,"line":1220},[1050,6622,2685],{"class":1071},[1050,6624,6625],{"class":1075},"Generate device fingerprint from request data",[1050,6627,1079],{"class":1071},[1050,6629,6630],{"class":1052,"line":1233},[1050,6631,1929],{"class":1085},[1050,6633,6634,6636],{"class":1052,"line":1245},[1050,6635,3956],{"class":1693},[1050,6637,6638],{"class":1085}," hashlib\n",[1050,6640,6641],{"class":1052,"line":1257},[1050,6642,1929],{"class":1085},[1050,6644,6645,6648,6650],{"class":1052,"line":1268},[1050,6646,6647],{"class":1085},"                fingerprint_data ",[1050,6649,1135],{"class":1064},[1050,6651,1217],{"class":1064},[1050,6653,6654,6656,6658,6660,6662,6664,6666,6668,6670,6672,6674,6676],{"class":1052,"line":1274},[1050,6655,3158],{"class":1085},[1050,6657,2452],{"class":1064},[1050,6659,3368],{"class":3367},[1050,6661,2452],{"class":1064},[1050,6663,3123],{"class":2562},[1050,6665,2428],{"class":1064},[1050,6667,1152],{"class":1144},[1050,6669,3755],{"class":1148},[1050,6671,1152],{"class":1144},[1050,6673,2435],{"class":1064},[1050,6675,3762],{"class":1144},[1050,6677,5905],{"class":1064},[1050,6679,6680,6682,6684,6686,6688,6690,6692,6694,6697,6699,6701,6703],{"class":1052,"line":1288},[1050,6681,3158],{"class":1085},[1050,6683,2452],{"class":1064},[1050,6685,3368],{"class":3367},[1050,6687,2452],{"class":1064},[1050,6689,3123],{"class":2562},[1050,6691,2428],{"class":1064},[1050,6693,1152],{"class":1144},[1050,6695,6696],{"class":1148},"HTTP_ACCEPT_LANGUAGE",[1050,6698,1152],{"class":1144},[1050,6700,2435],{"class":1064},[1050,6702,3762],{"class":1144},[1050,6704,5905],{"class":1064},[1050,6706,6707,6709,6711,6713,6715,6717,6719,6721,6724,6726,6728,6730],{"class":1052,"line":1306},[1050,6708,3158],{"class":1085},[1050,6710,2452],{"class":1064},[1050,6712,3368],{"class":3367},[1050,6714,2452],{"class":1064},[1050,6716,3123],{"class":2562},[1050,6718,2428],{"class":1064},[1050,6720,1152],{"class":1144},[1050,6722,6723],{"class":1148},"HTTP_ACCEPT_ENCODING",[1050,6725,1152],{"class":1144},[1050,6727,2435],{"class":1064},[1050,6729,3762],{"class":1144},[1050,6731,5905],{"class":1064},[1050,6733,6734,6736,6738,6740,6742,6744,6746,6748,6751,6753,6755,6757],{"class":1052,"line":1322},[1050,6735,3158],{"class":1085},[1050,6737,2452],{"class":1064},[1050,6739,3368],{"class":3367},[1050,6741,2452],{"class":1064},[1050,6743,3123],{"class":2562},[1050,6745,2428],{"class":1064},[1050,6747,1152],{"class":1144},[1050,6749,6750],{"class":1148},"HTTP_ACCEPT",[1050,6752,1152],{"class":1144},[1050,6754,2435],{"class":1064},[1050,6756,3762],{"class":1144},[1050,6758,5905],{"class":1064},[1050,6760,6761],{"class":1052,"line":1340},[1050,6762,6763],{"class":2330},"                    # Add more headers as needed\n",[1050,6765,6766],{"class":1052,"line":1355},[1050,6767,1670],{"class":1064},[1050,6769,6770],{"class":1052,"line":1361},[1050,6771,1929],{"class":1085},[1050,6773,6774],{"class":1052,"line":1367},[1050,6775,6776],{"class":2330},"                # Create hash of combined data\n",[1050,6778,6779,6782,6784,6786,6789,6791,6793,6796,6798,6801],{"class":1052,"line":1381},[1050,6780,6781],{"class":1085},"                combined_data ",[1050,6783,1135],{"class":1064},[1050,6785,1173],{"class":1144},[1050,6787,6788],{"class":1148},"|",[1050,6790,1152],{"class":1144},[1050,6792,2452],{"class":1064},[1050,6794,6795],{"class":2562},"join",[1050,6797,2428],{"class":1064},[1050,6799,6800],{"class":2562},"fingerprint_data",[1050,6802,2590],{"class":1064},[1050,6804,6805,6808,6810,6813,6815,6818,6820,6823,6825,6828,6831,6834],{"class":1052,"line":1401},[1050,6806,6807],{"class":1085},"                fingerprint ",[1050,6809,1135],{"class":1064},[1050,6811,6812],{"class":1085}," hashlib",[1050,6814,2452],{"class":1064},[1050,6816,6817],{"class":2562},"sha256",[1050,6819,2428],{"class":1064},[1050,6821,6822],{"class":2562},"combined_data",[1050,6824,2452],{"class":1064},[1050,6826,6827],{"class":2562},"encode",[1050,6829,6830],{"class":1064},"()).",[1050,6832,6833],{"class":2562},"hexdigest",[1050,6835,3193],{"class":1064},[1050,6837,6838],{"class":1052,"line":1421},[1050,6839,1929],{"class":1085},[1050,6841,6842,6844,6847,6850,6853,6855],{"class":1052,"line":1434},[1050,6843,2653],{"class":1693},[1050,6845,6846],{"class":1085}," fingerprint",[1050,6848,6849],{"class":1064},"[:",[1050,6851,6852],{"class":1334},"16",[1050,6854,3174],{"class":1064},[1050,6856,6857],{"class":2330},"  # Use first 16 characters\n",[1050,6859,6860],{"class":1052,"line":1446},[1050,6861,1905],{"class":1085},[1050,6863,6864,6866],{"class":1052,"line":1458},[1050,6865,6603],{"class":1064},[1050,6867,1096],{"class":1095},[1050,6869,6870,6872,6875,6877,6879],{"class":1052,"line":1470},[1050,6871,2421],{"class":1056},[1050,6873,6874],{"class":1105}," validate_device_fingerprint",[1050,6876,2428],{"class":1064},[1050,6878,2568],{"class":2438},[1050,6880,2442],{"class":1064},[1050,6882,6883,6885,6888],{"class":1052,"line":1480},[1050,6884,2685],{"class":1071},[1050,6886,6887],{"class":1075},"Validate device fingerprint against stored value",[1050,6889,1079],{"class":1071},[1050,6891,6892],{"class":1052,"line":1485},[1050,6893,1929],{"class":1085},[1050,6895,6896,6899,6901,6903,6905,6908,6910,6912],{"class":1052,"line":1498},[1050,6897,6898],{"class":1085},"                current_fingerprint ",[1050,6900,1135],{"class":1064},[1050,6902,6583],{"class":1085},[1050,6904,2452],{"class":1064},[1050,6906,6907],{"class":2562},"generate_device_fingerprint",[1050,6909,2428],{"class":1064},[1050,6911,2568],{"class":2562},[1050,6913,2590],{"class":1064},[1050,6915,6916,6919,6921,6923,6925,6927,6929,6931,6933,6935,6938,6940],{"class":1052,"line":1514},[1050,6917,6918],{"class":1085},"                stored_fingerprint ",[1050,6920,1135],{"class":1064},[1050,6922,2537],{"class":1085},[1050,6924,2452],{"class":1064},[1050,6926,2716],{"class":2455},[1050,6928,2452],{"class":1064},[1050,6930,3123],{"class":2562},[1050,6932,2428],{"class":1064},[1050,6934,1152],{"class":1144},[1050,6936,6937],{"class":1148},"_device_fingerprint",[1050,6939,1152],{"class":1144},[1050,6941,2590],{"class":1064},[1050,6943,6944],{"class":1052,"line":1530},[1050,6945,1929],{"class":1085},[1050,6947,6948,6950,6952,6955],{"class":1052,"line":1544},[1050,6949,2551],{"class":1693},[1050,6951,2554],{"class":2480},[1050,6953,6954],{"class":1085}," stored_fingerprint",[1050,6956,1065],{"class":1064},[1050,6958,6959,6961,6963,6965,6967,6969,6971,6973,6975,6977],{"class":1052,"line":1549},[1050,6960,3158],{"class":1085},[1050,6962,2452],{"class":1064},[1050,6964,2716],{"class":2455},[1050,6966,3165],{"class":1064},[1050,6968,1152],{"class":1144},[1050,6970,6937],{"class":1148},[1050,6972,1152],{"class":1144},[1050,6974,3174],{"class":1064},[1050,6976,2459],{"class":1064},[1050,6978,6979],{"class":1085}," current_fingerprint\n",[1050,6981,6982,6984],{"class":1052,"line":1554},[1050,6983,2576],{"class":1693},[1050,6985,1352],{"class":1300},[1050,6987,6988],{"class":1052,"line":1568},[1050,6989,1929],{"class":1085},[1050,6991,6992],{"class":1052,"line":1588},[1050,6993,6994],{"class":2330},"                # Allow some variation in fingerprint\n",[1050,6996,6997,6999,7001,7003,7006],{"class":1052,"line":1608},[1050,6998,2653],{"class":1693},[1050,7000,6583],{"class":1085},[1050,7002,2452],{"class":1064},[1050,7004,7005],{"class":2562},"fingerprints_similar",[1050,7007,4785],{"class":1064},[1050,7009,7010,7013,7015],{"class":1052,"line":1621},[1050,7011,7012],{"class":2562},"                    stored_fingerprint",[1050,7014,2435],{"class":1064},[1050,7016,6979],{"class":2562},[1050,7018,7019],{"class":1052,"line":1633},[1050,7020,4918],{"class":1064},[1050,7022,7023],{"class":1052,"line":1645},[1050,7024,1905],{"class":1085},[1050,7026,7027,7029],{"class":1052,"line":1657},[1050,7028,6603],{"class":1064},[1050,7030,1096],{"class":1095},[1050,7032,7033,7035,7038,7040,7043,7045,7048],{"class":1052,"line":1667},[1050,7034,2421],{"class":1056},[1050,7036,7037],{"class":1105}," fingerprints_similar",[1050,7039,2428],{"class":1064},[1050,7041,7042],{"class":2438},"stored",[1050,7044,2435],{"class":1064},[1050,7046,7047],{"class":2438}," current",[1050,7049,2442],{"class":1064},[1050,7051,7052,7054,7057],{"class":1052,"line":1673},[1050,7053,2685],{"class":1071},[1050,7055,7056],{"class":1075},"Check if fingerprints are similar enough",[1050,7058,1079],{"class":1071},[1050,7060,7061],{"class":1052,"line":1679},[1050,7062,1929],{"class":1085},[1050,7064,7065],{"class":1052,"line":1685},[1050,7066,7067],{"class":2330},"                # Simple similarity check - could be enhanced\n",[1050,7069,7070,7072,7075,7077,7079],{"class":1052,"line":1690},[1050,7071,2551],{"class":1693},[1050,7073,7074],{"class":1085}," stored ",[1050,7076,3548],{"class":2480},[1050,7078,7047],{"class":1085},[1050,7080,1065],{"class":1064},[1050,7082,7083,7085],{"class":1052,"line":1700},[1050,7084,2576],{"class":1693},[1050,7086,1352],{"class":1300},[1050,7088,7089],{"class":1052,"line":1705},[1050,7090,1929],{"class":1085},[1050,7092,7093],{"class":1052,"line":1712},[1050,7094,7095],{"class":2330},"                # Allow minor differences (e.g., browser updates)\n",[1050,7097,7098,7101,7103,7106,7108,7111,7113,7116,7118,7121,7123,7125,7127,7130,7132,7134,7136,7138],{"class":1052,"line":1722},[1050,7099,7100],{"class":1085},"                differences ",[1050,7102,1135],{"class":1064},[1050,7104,7105],{"class":2424}," sum",[1050,7107,2428],{"class":1064},[1050,7109,7110],{"class":2562},"c1 ",[1050,7112,6412],{"class":2480},[1050,7114,7115],{"class":2562}," c2 ",[1050,7117,4469],{"class":1693},[1050,7119,7120],{"class":2562}," c1",[1050,7122,2435],{"class":1064},[1050,7124,7115],{"class":2562},[1050,7126,3663],{"class":1693},[1050,7128,7129],{"class":2424}," zip",[1050,7131,2428],{"class":1064},[1050,7133,7042],{"class":2562},[1050,7135,2435],{"class":1064},[1050,7137,7047],{"class":2562},[1050,7139,7140],{"class":1064},"))\n",[1050,7142,7143,7145,7148,7151,7154],{"class":1052,"line":1732},[1050,7144,2653],{"class":1693},[1050,7146,7147],{"class":1085}," differences ",[1050,7149,7150],{"class":2480},"\u003C=",[1050,7152,7153],{"class":1334}," 2",[1050,7155,7156],{"class":2330},"  # Allow up to 2 character differences\n",[1050,7158,7159],{"class":1052,"line":1737},[1050,7160,1126],{"class":1085},[1050,7162,7163,7165],{"class":1052,"line":1747},[1050,7164,1694],{"class":1693},[1050,7166,7167],{"class":1085}," DeviceFingerprintManager\n",[1050,7169,7170],{"class":1052,"line":1761},[1050,7171,1086],{"class":1085},[1050,7173,7174,7176],{"class":1052,"line":1775},[1050,7175,1092],{"class":1064},[1050,7177,1096],{"class":1095},[1050,7179,7180,7182,7185],{"class":1052,"line":1787},[1050,7181,1102],{"class":1056},[1050,7183,7184],{"class":1105}," session_encryption",[1050,7186,1109],{"class":1064},[1050,7188,7189,7191,7194],{"class":1052,"line":1799},[1050,7190,1115],{"class":1071},[1050,7192,7193],{"class":1075},"Implement session data encryption",[1050,7195,1079],{"class":1071},[1050,7197,7198],{"class":1052,"line":1810},[1050,7199,1126],{"class":1085},[1050,7201,7202,7204,7207],{"class":1052,"line":1816},[1050,7203,2394],{"class":1056},[1050,7205,7206],{"class":1060}," EncryptedSessionStore",[1050,7208,1065],{"class":1064},[1050,7210,7211,7213,7216],{"class":1052,"line":1830},[1050,7212,2405],{"class":1071},[1050,7214,7215],{"class":1075},"Session store with transparent encryption",[1050,7217,1079],{"class":1071},[1050,7219,7220],{"class":1052,"line":1842},[1050,7221,1905],{"class":1085},[1050,7223,7224,7226,7228,7230,7232,7234,7237,7239,7241],{"class":1052,"line":1854},[1050,7225,2421],{"class":1056},[1050,7227,2425],{"class":2424},[1050,7229,2428],{"class":1064},[1050,7231,2432],{"class":2431},[1050,7233,2435],{"class":1064},[1050,7235,7236],{"class":2438}," session_key",[1050,7238,1135],{"class":2480},[1050,7240,4830],{"class":1300},[1050,7242,2442],{"class":1064},[1050,7244,7245,7247,7249,7251,7253,7255,7258,7260,7263,7265,7268,7270],{"class":1052,"line":1866},[1050,7246,4962],{"class":1693},[1050,7248,4965],{"class":1085},[1050,7250,2452],{"class":1064},[1050,7252,5364],{"class":1085},[1050,7254,2452],{"class":1064},[1050,7256,7257],{"class":1085},"sessions",[1050,7259,2452],{"class":1064},[1050,7261,7262],{"class":1085},"backends",[1050,7264,2452],{"class":1064},[1050,7266,7267],{"class":1085},"db ",[1050,7269,4973],{"class":1693},[1050,7271,7272],{"class":1085}," SessionStore\n",[1050,7274,7275,7277,7279,7282,7284,7287,7289,7291],{"class":1052,"line":1876},[1050,7276,2449],{"class":2448},[1050,7278,2452],{"class":1064},[1050,7280,7281],{"class":2455},"base_store",[1050,7283,2459],{"class":1064},[1050,7285,7286],{"class":2562}," SessionStore",[1050,7288,2428],{"class":1064},[1050,7290,2889],{"class":2562},[1050,7292,2590],{"class":1064},[1050,7294,7295,7297,7299,7302,7304,7306,7308,7311],{"class":1052,"line":1881},[1050,7296,2449],{"class":2448},[1050,7298,2452],{"class":1064},[1050,7300,7301],{"class":2455},"cipher",[1050,7303,2459],{"class":1064},[1050,7305,2557],{"class":2448},[1050,7307,2452],{"class":1064},[1050,7309,7310],{"class":2562},"_get_cipher",[1050,7312,3193],{"class":1064},[1050,7314,7315],{"class":1052,"line":1896},[1050,7316,1905],{"class":1085},[1050,7318,7319,7321,7324,7326,7328],{"class":1052,"line":1902},[1050,7320,2421],{"class":1056},[1050,7322,7323],{"class":1105}," _get_cipher",[1050,7325,2428],{"class":1064},[1050,7327,2432],{"class":2431},[1050,7329,2442],{"class":1064},[1050,7331,7332,7334,7337],{"class":1052,"line":1908},[1050,7333,2685],{"class":1071},[1050,7335,7336],{"class":1075},"Get encryption cipher",[1050,7338,1079],{"class":1071},[1050,7340,7341],{"class":1052,"line":1914},[1050,7342,1929],{"class":1085},[1050,7344,7345,7347,7350,7352,7355,7357],{"class":1052,"line":1920},[1050,7346,4962],{"class":1693},[1050,7348,7349],{"class":1085}," cryptography",[1050,7351,2452],{"class":1064},[1050,7353,7354],{"class":1085},"fernet ",[1050,7356,4973],{"class":1693},[1050,7358,7359],{"class":1085}," Fernet\n",[1050,7361,7362,7364],{"class":1052,"line":1926},[1050,7363,3956],{"class":1693},[1050,7365,7366],{"class":1085}," base64\n",[1050,7368,7369,7371],{"class":1052,"line":1932},[1050,7370,3956],{"class":1693},[1050,7372,6638],{"class":1085},[1050,7374,7375],{"class":1052,"line":1938},[1050,7376,1929],{"class":1085},[1050,7378,7379],{"class":1052,"line":1944},[1050,7380,7381],{"class":2330},"                # Derive encryption key from Django SECRET_KEY\n",[1050,7383,7384,7387,7389,7392,7394,7397,7399,7401],{"class":1052,"line":1949},[1050,7385,7386],{"class":1085},"                key_material ",[1050,7388,1135],{"class":1064},[1050,7390,7391],{"class":1085}," settings",[1050,7393,2452],{"class":1064},[1050,7395,7396],{"class":3367},"SECRET_KEY",[1050,7398,2452],{"class":1064},[1050,7400,6827],{"class":2562},[1050,7402,3193],{"class":1064},[1050,7404,7405,7408,7410,7412,7414,7416,7418,7421,7423,7426],{"class":1052,"line":1955},[1050,7406,7407],{"class":1085},"                key ",[1050,7409,1135],{"class":1064},[1050,7411,6812],{"class":1085},[1050,7413,2452],{"class":1064},[1050,7415,6817],{"class":2562},[1050,7417,2428],{"class":1064},[1050,7419,7420],{"class":2562},"key_material",[1050,7422,4170],{"class":1064},[1050,7424,7425],{"class":2562},"digest",[1050,7427,3193],{"class":1064},[1050,7429,7430,7433,7435,7438,7440,7443,7445,7447],{"class":1052,"line":1961},[1050,7431,7432],{"class":1085},"                fernet_key ",[1050,7434,1135],{"class":1064},[1050,7436,7437],{"class":1085}," base64",[1050,7439,2452],{"class":1064},[1050,7441,7442],{"class":2562},"urlsafe_b64encode",[1050,7444,2428],{"class":1064},[1050,7446,5511],{"class":2562},[1050,7448,2590],{"class":1064},[1050,7450,7451],{"class":1052,"line":1967},[1050,7452,1929],{"class":1085},[1050,7454,7455,7457,7460,7462,7465],{"class":1052,"line":1973},[1050,7456,2653],{"class":1693},[1050,7458,7459],{"class":2562}," Fernet",[1050,7461,2428],{"class":1064},[1050,7463,7464],{"class":2562},"fernet_key",[1050,7466,2590],{"class":1064},[1050,7468,7469],{"class":1052,"line":1979},[1050,7470,1905],{"class":1085},[1050,7472,7473,7475,7478,7480,7482],{"class":1052,"line":1984},[1050,7474,2421],{"class":1056},[1050,7476,7477],{"class":1105}," load",[1050,7479,2428],{"class":1064},[1050,7481,2432],{"class":2431},[1050,7483,2442],{"class":1064},[1050,7485,7486,7488,7491],{"class":1052,"line":1989},[1050,7487,2685],{"class":1071},[1050,7489,7490],{"class":1075},"Load and decrypt session data",[1050,7492,1079],{"class":1071},[1050,7494,7495],{"class":1052,"line":1997},[1050,7496,1929],{"class":1085},[1050,7498,7499,7502,7504,7506,7508,7510,7512,7515],{"class":1052,"line":2002},[1050,7500,7501],{"class":1085},"                encrypted_data ",[1050,7503,1135],{"class":1064},[1050,7505,2557],{"class":2448},[1050,7507,2452],{"class":1064},[1050,7509,7281],{"class":2455},[1050,7511,2452],{"class":1064},[1050,7513,7514],{"class":2562},"load",[1050,7516,3193],{"class":1064},[1050,7518,7519],{"class":1052,"line":2009},[1050,7520,1929],{"class":1085},[1050,7522,7523,7525,7527,7530],{"class":1052,"line":2019},[1050,7524,2551],{"class":1693},[1050,7526,2554],{"class":2480},[1050,7528,7529],{"class":1085}," encrypted_data",[1050,7531,1065],{"class":1064},[1050,7533,7534,7536],{"class":1052,"line":2029},[1050,7535,2576],{"class":1693},[1050,7537,7538],{"class":1064}," {}\n",[1050,7540,7541],{"class":1052,"line":2034},[1050,7542,1929],{"class":1085},[1050,7544,7545,7547],{"class":1052,"line":2044},[1050,7546,3211],{"class":1693},[1050,7548,1065],{"class":1064},[1050,7550,7551],{"class":1052,"line":2065},[1050,7552,7553],{"class":2330},"                    # Decrypt session data\n",[1050,7555,7556,7559,7561],{"class":1052,"line":2086},[1050,7557,7558],{"class":1085},"                    decrypted_data ",[1050,7560,1135],{"class":1064},[1050,7562,7538],{"class":1064},[1050,7564,7565,7567,7569,7571,7573,7575,7577,7579,7581],{"class":1052,"line":2099},[1050,7566,4100],{"class":1693},[1050,7568,5480],{"class":1085},[1050,7570,2435],{"class":1064},[1050,7572,5485],{"class":1085},[1050,7574,3663],{"class":1693},[1050,7576,7529],{"class":1085},[1050,7578,2452],{"class":1064},[1050,7580,5495],{"class":2562},[1050,7582,1109],{"class":1064},[1050,7584,7585,7587,7589,7591,7594,7596,7598,7601,7603],{"class":1052,"line":2111},[1050,7586,4144],{"class":1693},[1050,7588,5480],{"class":1085},[1050,7590,2452],{"class":1064},[1050,7592,7593],{"class":2562},"startswith",[1050,7595,2428],{"class":1064},[1050,7597,1152],{"class":1144},[1050,7599,7600],{"class":1148},"_encrypted_",[1050,7602,1152],{"class":1144},[1050,7604,2442],{"class":1064},[1050,7606,7607],{"class":1052,"line":2123},[1050,7608,7609],{"class":2330},"                            # Decrypt encrypted fields\n",[1050,7611,7612,7615,7617,7619,7621,7624,7627],{"class":1052,"line":2135},[1050,7613,7614],{"class":1085},"                            original_key ",[1050,7616,1135],{"class":1064},[1050,7618,5480],{"class":1085},[1050,7620,3165],{"class":1064},[1050,7622,7623],{"class":1334},"11",[1050,7625,7626],{"class":1064},":]",[1050,7628,7629],{"class":2330},"  # Remove '_encrypted_' prefix\n",[1050,7631,7632,7635,7637,7639,7641,7643,7645,7648,7650,7653,7655,7657,7659,7662],{"class":1052,"line":2145},[1050,7633,7634],{"class":1085},"                            decrypted_value ",[1050,7636,1135],{"class":1064},[1050,7638,2557],{"class":2448},[1050,7640,2452],{"class":1064},[1050,7642,7301],{"class":2455},[1050,7644,2452],{"class":1064},[1050,7646,7647],{"class":2562},"decrypt",[1050,7649,2428],{"class":1064},[1050,7651,7652],{"class":2562},"value",[1050,7654,2452],{"class":1064},[1050,7656,6827],{"class":2562},[1050,7658,6830],{"class":1064},[1050,7660,7661],{"class":2562},"decode",[1050,7663,3193],{"class":1064},[1050,7665,7666,7669,7671,7674,7676,7678,7681,7683,7686,7688,7691],{"class":1052,"line":2150},[1050,7667,7668],{"class":1085},"                            decrypted_data",[1050,7670,3165],{"class":1064},[1050,7672,7673],{"class":1085},"original_key",[1050,7675,3174],{"class":1064},[1050,7677,2459],{"class":1064},[1050,7679,7680],{"class":1085}," json",[1050,7682,2452],{"class":1064},[1050,7684,7685],{"class":2562},"loads",[1050,7687,2428],{"class":1064},[1050,7689,7690],{"class":2562},"decrypted_value",[1050,7692,2590],{"class":1064},[1050,7694,7695,7698],{"class":1052,"line":2164},[1050,7696,7697],{"class":1693},"                        else",[1050,7699,1065],{"class":1064},[1050,7701,7702],{"class":1052,"line":2185},[1050,7703,7704],{"class":2330},"                            # Keep non-encrypted fields as-is\n",[1050,7706,7707,7709,7711,7713,7715,7717],{"class":1052,"line":2206},[1050,7708,7668],{"class":1085},[1050,7710,3165],{"class":1064},[1050,7712,5511],{"class":1085},[1050,7714,3174],{"class":1064},[1050,7716,2459],{"class":1064},[1050,7718,5518],{"class":1085},[1050,7720,7721],{"class":1052,"line":2227},[1050,7722,4094],{"class":1085},[1050,7724,7725,7727],{"class":1052,"line":2241},[1050,7726,2576],{"class":1693},[1050,7728,7729],{"class":1085}," decrypted_data\n",[1050,7731,7732],{"class":1052,"line":2257},[1050,7733,1929],{"class":1085},[1050,7735,7736,7738,7741,7744,7747],{"class":1052,"line":2273},[1050,7737,3294],{"class":1693},[1050,7739,7740],{"class":1095}," Exception",[1050,7742,7743],{"class":1693}," as",[1050,7745,7746],{"class":1085}," e",[1050,7748,1065],{"class":1064},[1050,7750,7751,7753,7755,7757,7759,7761,7764,7766,7769,7771,7773],{"class":1052,"line":2292},[1050,7752,2781],{"class":1085},[1050,7754,2452],{"class":1064},[1050,7756,4782],{"class":2562},[1050,7758,2428],{"class":1064},[1050,7760,2791],{"class":1056},[1050,7762,7763],{"class":1148},"\"Session decryption failed: ",[1050,7765,2798],{"class":2797},[1050,7767,7768],{"class":2562},"e",[1050,7770,2808],{"class":2797},[1050,7772,1770],{"class":1148},[1050,7774,2590],{"class":1064},[1050,7776,7777,7779],{"class":1052,"line":2297},[1050,7778,2576],{"class":1693},[1050,7780,7538],{"class":1064},[1050,7782,7783],{"class":1052,"line":2302},[1050,7784,1905],{"class":1085},[1050,7786,7787,7789,7792,7794,7796,7798,7801,7803,7805],{"class":1052,"line":2307},[1050,7788,2421],{"class":1056},[1050,7790,7791],{"class":1105}," save",[1050,7793,2428],{"class":1064},[1050,7795,2432],{"class":2431},[1050,7797,2435],{"class":1064},[1050,7799,7800],{"class":2438}," must_create",[1050,7802,1135],{"class":2480},[1050,7804,3628],{"class":1300},[1050,7806,2442],{"class":1064},[1050,7808,7809,7811,7814],{"class":1052,"line":2312},[1050,7810,2685],{"class":1071},[1050,7812,7813],{"class":1075},"Encrypt and save session data",[1050,7815,1079],{"class":1071},[1050,7817,7818],{"class":1052,"line":2320},[1050,7819,1929],{"class":1085},[1050,7821,7822,7825,7827,7829,7831,7834,7836,7839,7841,7844],{"class":1052,"line":2327},[1050,7823,7824],{"class":1085},"                session_data ",[1050,7826,1135],{"class":1064},[1050,7828,2557],{"class":2448},[1050,7830,2452],{"class":1064},[1050,7832,7833],{"class":2562},"_get_session",[1050,7835,2428],{"class":1064},[1050,7837,7838],{"class":3622},"no_load",[1050,7840,1135],{"class":1064},[1050,7842,7843],{"class":1300},"True",[1050,7845,2590],{"class":1064},[1050,7847,7848],{"class":1052,"line":2334},[1050,7849,1929],{"class":1085},[1050,7851,7852],{"class":1052,"line":2344},[1050,7853,7854],{"class":2330},"                # Identify sensitive fields to encrypt\n",[1050,7856,7857,7860,7862],{"class":1052,"line":2354},[1050,7858,7859],{"class":1085},"                sensitive_fields ",[1050,7861,1135],{"class":1064},[1050,7863,1217],{"class":1064},[1050,7865,7866,7868,7871,7873,7875,7877,7880,7882,7884,7886,7889,7891],{"class":1052,"line":2359},[1050,7867,1223],{"class":1144},[1050,7869,7870],{"class":1148},"user_data",[1050,7872,1152],{"class":1144},[1050,7874,2435],{"class":1064},[1050,7876,1173],{"class":1144},[1050,7878,7879],{"class":1148},"payment_info",[1050,7881,1152],{"class":1144},[1050,7883,2435],{"class":1064},[1050,7885,1173],{"class":1144},[1050,7887,7888],{"class":1148},"personal_info",[1050,7890,1152],{"class":1144},[1050,7892,1181],{"class":1064},[1050,7894,7895,7897,7900,7902,7904,7906,7909],{"class":1052,"line":2366},[1050,7896,1223],{"class":1144},[1050,7898,7899],{"class":1148},"api_tokens",[1050,7901,1152],{"class":1144},[1050,7903,2435],{"class":1064},[1050,7905,1173],{"class":1144},[1050,7907,7908],{"class":1148},"oauth_tokens",[1050,7910,1265],{"class":1144},[1050,7912,7913],{"class":1052,"line":2376},[1050,7914,1670],{"class":1064},[1050,7916,7917],{"class":1052,"line":2386},[1050,7918,1929],{"class":1085},[1050,7920,7921,7923,7925],{"class":1052,"line":2391},[1050,7922,7501],{"class":1085},[1050,7924,1135],{"class":1064},[1050,7926,7538],{"class":1064},[1050,7928,7929],{"class":1052,"line":2402},[1050,7930,1929],{"class":1085},[1050,7932,7933,7935,7937,7939,7941,7943,7946,7948,7950],{"class":1052,"line":2413},[1050,7934,5477],{"class":1693},[1050,7936,5480],{"class":1085},[1050,7938,2435],{"class":1064},[1050,7940,5485],{"class":1085},[1050,7942,3663],{"class":1693},[1050,7944,7945],{"class":1085}," session_data",[1050,7947,2452],{"class":1064},[1050,7949,5495],{"class":2562},[1050,7951,1109],{"class":1064},[1050,7953,7954,7956,7958,7960,7963],{"class":1052,"line":2418},[1050,7955,4483],{"class":1693},[1050,7957,5771],{"class":1085},[1050,7959,3663],{"class":2480},[1050,7961,7962],{"class":1085}," sensitive_fields",[1050,7964,1065],{"class":1064},[1050,7966,7967],{"class":1052,"line":2445},[1050,7968,7969],{"class":2330},"                        # Encrypt sensitive fields\n",[1050,7971,7972,7975,7977,7979,7981,7984,7986,7988],{"class":1052,"line":2465},[1050,7973,7974],{"class":1085},"                        json_value ",[1050,7976,1135],{"class":1064},[1050,7978,7680],{"class":1085},[1050,7980,2452],{"class":1064},[1050,7982,7983],{"class":2562},"dumps",[1050,7985,2428],{"class":1064},[1050,7987,7652],{"class":2562},[1050,7989,2590],{"class":1064},[1050,7991,7992,7995,7997,7999,8001,8003,8005,8008,8010,8013,8015,8017,8019,8021],{"class":1052,"line":2490},[1050,7993,7994],{"class":1085},"                        encrypted_value ",[1050,7996,1135],{"class":1064},[1050,7998,2557],{"class":2448},[1050,8000,2452],{"class":1064},[1050,8002,7301],{"class":2455},[1050,8004,2452],{"class":1064},[1050,8006,8007],{"class":2562},"encrypt",[1050,8009,2428],{"class":1064},[1050,8011,8012],{"class":2562},"json_value",[1050,8014,2452],{"class":1064},[1050,8016,6827],{"class":2562},[1050,8018,6830],{"class":1064},[1050,8020,7661],{"class":2562},[1050,8022,3193],{"class":1064},[1050,8024,8025,8028,8030,8032,8035,8037,8039,8041,8043,8045,8047],{"class":1052,"line":2504},[1050,8026,8027],{"class":1085},"                        encrypted_data",[1050,8029,3165],{"class":1064},[1050,8031,2791],{"class":1056},[1050,8033,8034],{"class":1148},"'_encrypted_",[1050,8036,2798],{"class":2797},[1050,8038,5511],{"class":1085},[1050,8040,2808],{"class":2797},[1050,8042,1152],{"class":1148},[1050,8044,3174],{"class":1064},[1050,8046,2459],{"class":1064},[1050,8048,8049],{"class":1085}," encrypted_value\n",[1050,8051,8052,8055],{"class":1052,"line":2518},[1050,8053,8054],{"class":1693},"                    else",[1050,8056,1065],{"class":1064},[1050,8058,8059],{"class":1052,"line":2523},[1050,8060,8061],{"class":2330},"                        # Keep non-sensitive fields unencrypted\n",[1050,8063,8064,8066,8068,8070,8072,8074],{"class":1052,"line":2542},[1050,8065,8027],{"class":1085},[1050,8067,3165],{"class":1064},[1050,8069,5511],{"class":1085},[1050,8071,3174],{"class":1064},[1050,8073,2459],{"class":1064},[1050,8075,5518],{"class":1085},[1050,8077,8078],{"class":1052,"line":2548},[1050,8079,1929],{"class":1085},[1050,8081,8082],{"class":1052,"line":2573},[1050,8083,8084],{"class":2330},"                # Save encrypted data using base store\n",[1050,8086,8087,8089,8091,8093,8095,8098,8100],{"class":1052,"line":2593},[1050,8088,2449],{"class":2448},[1050,8090,2452],{"class":1064},[1050,8092,7281],{"class":2455},[1050,8094,2452],{"class":1064},[1050,8096,8097],{"class":2455},"_session_cache",[1050,8099,2459],{"class":1064},[1050,8101,8102],{"class":1085}," encrypted_data\n",[1050,8104,8105,8107,8109,8111,8113,8116,8118,8121],{"class":1052,"line":2598},[1050,8106,2449],{"class":2448},[1050,8108,2452],{"class":1064},[1050,8110,7281],{"class":2455},[1050,8112,2452],{"class":1064},[1050,8114,8115],{"class":2562},"save",[1050,8117,2428],{"class":1064},[1050,8119,8120],{"class":2562},"must_create",[1050,8122,2590],{"class":1064},[1050,8124,8125],{"class":1052,"line":2618},[1050,8126,1905],{"class":1085},[1050,8128,8129,8131,8134,8136,8138,8140,8142,8144,8146],{"class":1052,"line":2623},[1050,8130,2421],{"class":1056},[1050,8132,8133],{"class":1105}," delete",[1050,8135,2428],{"class":1064},[1050,8137,2432],{"class":2431},[1050,8139,2435],{"class":1064},[1050,8141,7236],{"class":2438},[1050,8143,1135],{"class":2480},[1050,8145,4830],{"class":1300},[1050,8147,2442],{"class":1064},[1050,8149,8150,8152,8155],{"class":1052,"line":2629},[1050,8151,2685],{"class":1071},[1050,8153,8154],{"class":1075},"Delete session",[1050,8156,1079],{"class":1071},[1050,8158,8159,8161,8163,8165,8167,8169,8172,8174,8176],{"class":1052,"line":2645},[1050,8160,2653],{"class":1693},[1050,8162,2557],{"class":2448},[1050,8164,2452],{"class":1064},[1050,8166,7281],{"class":2455},[1050,8168,2452],{"class":1064},[1050,8170,8171],{"class":2562},"delete",[1050,8173,2428],{"class":1064},[1050,8175,2889],{"class":2562},[1050,8177,2590],{"class":1064},[1050,8179,8180],{"class":1052,"line":2650},[1050,8181,1905],{"class":1085},[1050,8183,8184],{"class":1052,"line":2659},[1050,8185,8186],{"class":2330},"            # Delegate other methods to base store\n",[1050,8188,8189,8191,8194,8196,8198,8200,8203],{"class":1052,"line":2664},[1050,8190,2421],{"class":1056},[1050,8192,8193],{"class":2424}," __getattr__",[1050,8195,2428],{"class":1064},[1050,8197,2432],{"class":2431},[1050,8199,2435],{"class":1064},[1050,8201,8202],{"class":2438}," name",[1050,8204,2442],{"class":1064},[1050,8206,8207,8209,8212,8214,8216,8218,8220,8222,8224],{"class":1052,"line":2682},[1050,8208,2653],{"class":1693},[1050,8210,8211],{"class":2424}," getattr",[1050,8213,2428],{"class":1064},[1050,8215,2432],{"class":2448},[1050,8217,2452],{"class":1064},[1050,8219,7281],{"class":2455},[1050,8221,2435],{"class":1064},[1050,8223,8202],{"class":2562},[1050,8225,2590],{"class":1064},[1050,8227,8228],{"class":1052,"line":2693},[1050,8229,1126],{"class":1085},[1050,8231,8232,8234],{"class":1052,"line":2698},[1050,8233,1694],{"class":1693},[1050,8235,8236],{"class":1085}," EncryptedSessionStore\n",[1050,8238,8239],{"class":1052,"line":2740},[1050,8240,1086],{"class":1085},[1050,8242,8243,8245],{"class":1052,"line":2747},[1050,8244,1092],{"class":1064},[1050,8246,1096],{"class":1095},[1050,8248,8249,8251,8254],{"class":1052,"line":2752},[1050,8250,1102],{"class":1056},[1050,8252,8253],{"class":1105}," session_monitoring",[1050,8255,1109],{"class":1064},[1050,8257,8258,8260,8263],{"class":1052,"line":2758},[1050,8259,1115],{"class":1071},[1050,8261,8262],{"class":1075},"Implement comprehensive session monitoring",[1050,8264,1079],{"class":1071},[1050,8266,8267],{"class":1052,"line":2778},[1050,8268,1126],{"class":1085},[1050,8270,8271,8273,8276],{"class":1052,"line":2815},[1050,8272,2394],{"class":1056},[1050,8274,8275],{"class":1060}," SessionMonitor",[1050,8277,1065],{"class":1064},[1050,8279,8280,8282,8285],{"class":1052,"line":2823},[1050,8281,2405],{"class":1071},[1050,8283,8284],{"class":1075},"Monitor and analyze session security events",[1050,8286,1079],{"class":1071},[1050,8288,8289],{"class":1052,"line":2828},[1050,8290,1905],{"class":1085},[1050,8292,8293,8295,8297,8299,8301],{"class":1052,"line":2834},[1050,8294,2421],{"class":1056},[1050,8296,2425],{"class":2424},[1050,8298,2428],{"class":1064},[1050,8300,2432],{"class":2431},[1050,8302,2442],{"class":1064},[1050,8304,8305,8307,8309,8312,8314],{"class":1052,"line":2863},[1050,8306,2449],{"class":2448},[1050,8308,2452],{"class":1064},[1050,8310,8311],{"class":2455},"suspicious_patterns",[1050,8313,2459],{"class":1064},[1050,8315,1138],{"class":1064},[1050,8317,8318,8320,8323,8325,8327,8330,8332,8335,8337,8339,8342,8344,8346,8349,8351,8353,8356,8359],{"class":1052,"line":2898},[1050,8319,1223],{"class":1144},[1050,8321,8322],{"class":1148},"rapid_requests",[1050,8324,1152],{"class":1144},[1050,8326,1155],{"class":1064},[1050,8328,8329],{"class":1064}," {",[1050,8331,1152],{"class":1144},[1050,8333,8334],{"class":1148},"threshold",[1050,8336,1152],{"class":1144},[1050,8338,1155],{"class":1064},[1050,8340,8341],{"class":1334}," 50",[1050,8343,2435],{"class":1064},[1050,8345,1173],{"class":1144},[1050,8347,8348],{"class":1148},"window",[1050,8350,1152],{"class":1144},[1050,8352,1155],{"class":1064},[1050,8354,8355],{"class":1334}," 300",[1050,8357,8358],{"class":1064},"},",[1050,8360,8361],{"class":2330},"  # 50 requests in 5 minutes\n",[1050,8363,8364,8366,8369,8371,8373,8375,8377,8379,8381,8383,8386,8388,8390,8392,8394,8396,8398,8400],{"class":1052,"line":2905},[1050,8365,1223],{"class":1144},[1050,8367,8368],{"class":1148},"multiple_ips",[1050,8370,1152],{"class":1144},[1050,8372,1155],{"class":1064},[1050,8374,8329],{"class":1064},[1050,8376,1152],{"class":1144},[1050,8378,8334],{"class":1148},[1050,8380,1152],{"class":1144},[1050,8382,1155],{"class":1064},[1050,8384,8385],{"class":1334}," 3",[1050,8387,2435],{"class":1064},[1050,8389,1173],{"class":1144},[1050,8391,8348],{"class":1148},[1050,8393,1152],{"class":1144},[1050,8395,1155],{"class":1064},[1050,8397,2484],{"class":1334},[1050,8399,8358],{"class":1064},[1050,8401,8402],{"class":2330},"   # 3 different IPs in 1 hour\n",[1050,8404,8405,8407,8410,8412,8414,8416,8418,8421,8423,8425,8427,8429,8431,8434,8436,8438,8441,8443],{"class":1052,"line":2910},[1050,8406,1223],{"class":1144},[1050,8408,8409],{"class":1148},"unusual_hours",[1050,8411,1152],{"class":1144},[1050,8413,1155],{"class":1064},[1050,8415,8329],{"class":1064},[1050,8417,1152],{"class":1144},[1050,8419,8420],{"class":1148},"start",[1050,8422,1152],{"class":1144},[1050,8424,1155],{"class":1064},[1050,8426,7153],{"class":1334},[1050,8428,2435],{"class":1064},[1050,8430,1173],{"class":1144},[1050,8432,8433],{"class":1148},"end",[1050,8435,1152],{"class":1144},[1050,8437,1155],{"class":1064},[1050,8439,8440],{"class":1334}," 6",[1050,8442,8358],{"class":1064},[1050,8444,8445],{"class":2330},"            # Activity between 2-6 AM\n",[1050,8447,8448,8450,8453,8455,8457,8459,8461,8464,8466,8468,8471,8473],{"class":1052,"line":2916},[1050,8449,1223],{"class":1144},[1050,8451,8452],{"class":1148},"geographic_anomaly",[1050,8454,1152],{"class":1144},[1050,8456,1155],{"class":1064},[1050,8458,8329],{"class":1064},[1050,8460,1152],{"class":1144},[1050,8462,8463],{"class":1148},"max_distance",[1050,8465,1152],{"class":1144},[1050,8467,1155],{"class":1064},[1050,8469,8470],{"class":1334}," 1000",[1050,8472,2808],{"class":1064},[1050,8474,8475],{"class":2330},"        # 1000km travel in short time\n",[1050,8477,8478],{"class":1052,"line":2944},[1050,8479,1358],{"class":1064},[1050,8481,8482],{"class":1052,"line":2978},[1050,8483,1905],{"class":1085},[1050,8485,8486,8488,8491,8493,8495,8497,8499,8501,8504,8506,8509,8511,8513],{"class":1052,"line":2985},[1050,8487,2421],{"class":1056},[1050,8489,8490],{"class":1105}," log_session_event",[1050,8492,2428],{"class":1064},[1050,8494,2432],{"class":2431},[1050,8496,2435],{"class":1064},[1050,8498,2537],{"class":2438},[1050,8500,2435],{"class":1064},[1050,8502,8503],{"class":2438}," event_type",[1050,8505,2435],{"class":1064},[1050,8507,8508],{"class":2438}," details",[1050,8510,1135],{"class":2480},[1050,8512,4830],{"class":1300},[1050,8514,2442],{"class":1064},[1050,8516,8517,8519,8522],{"class":1052,"line":2990},[1050,8518,2685],{"class":1071},[1050,8520,8521],{"class":1075},"Log session security event",[1050,8523,1079],{"class":1071},[1050,8525,8526],{"class":1052,"line":2996},[1050,8527,1929],{"class":1085},[1050,8529,8530,8533,8535],{"class":1052,"line":3016},[1050,8531,8532],{"class":1085},"                event_data ",[1050,8534,1135],{"class":1064},[1050,8536,1138],{"class":1064},[1050,8538,8539,8541,8543,8545,8547,8549,8551,8553,8555,8557],{"class":1052,"line":3050},[1050,8540,1223],{"class":1144},[1050,8542,4498],{"class":1148},[1050,8544,1152],{"class":1144},[1050,8546,1155],{"class":1064},[1050,8548,3179],{"class":1085},[1050,8550,2452],{"class":1064},[1050,8552,3184],{"class":2562},[1050,8554,3187],{"class":1064},[1050,8556,3190],{"class":2562},[1050,8558,5873],{"class":1064},[1050,8560,8561,8563,8565,8567,8569,8571,8573,8575,8577,8579,8581,8583,8585,8587,8589,8591],{"class":1052,"line":3057},[1050,8562,1223],{"class":1144},[1050,8564,2889],{"class":1148},[1050,8566,1152],{"class":1144},[1050,8568,1155],{"class":1064},[1050,8570,8211],{"class":2424},[1050,8572,2428],{"class":1064},[1050,8574,2568],{"class":2562},[1050,8576,2452],{"class":1064},[1050,8578,2716],{"class":2455},[1050,8580,2435],{"class":1064},[1050,8582,1173],{"class":1144},[1050,8584,2889],{"class":1148},[1050,8586,1152],{"class":1144},[1050,8588,2435],{"class":1064},[1050,8590,4216],{"class":1300},[1050,8592,5905],{"class":1064},[1050,8594,8595,8597,8600,8602,8604,8606,8608,8610,8612,8614,8616,8618,8620,8622,8624,8626],{"class":1052,"line":3062},[1050,8596,1223],{"class":1144},[1050,8598,8599],{"class":1148},"user_id",[1050,8601,1152],{"class":1144},[1050,8603,1155],{"class":1064},[1050,8605,8211],{"class":2424},[1050,8607,2428],{"class":1064},[1050,8609,2568],{"class":2562},[1050,8611,2452],{"class":1064},[1050,8613,2805],{"class":2455},[1050,8615,2435],{"class":1064},[1050,8617,1173],{"class":1144},[1050,8619,5959],{"class":1148},[1050,8621,1152],{"class":1144},[1050,8623,2435],{"class":1064},[1050,8625,4216],{"class":1300},[1050,8627,5905],{"class":1064},[1050,8629,8630,8632,8634,8636,8638,8640,8642,8644,8646,8648,8650,8652,8654,8656],{"class":1052,"line":3069},[1050,8631,1223],{"class":1144},[1050,8633,3645],{"class":1148},[1050,8635,1152],{"class":1144},[1050,8637,1155],{"class":1064},[1050,8639,2537],{"class":1085},[1050,8641,2452],{"class":1064},[1050,8643,3368],{"class":3367},[1050,8645,2452],{"class":1064},[1050,8647,3123],{"class":2562},[1050,8649,2428],{"class":1064},[1050,8651,1152],{"class":1144},[1050,8653,3379],{"class":1148},[1050,8655,1152],{"class":1144},[1050,8657,5905],{"class":1064},[1050,8659,8660,8662,8665,8667,8669,8671,8673,8675,8677,8679,8681,8683,8685,8687,8689,8691],{"class":1052,"line":3074},[1050,8661,1223],{"class":1144},[1050,8663,8664],{"class":1148},"user_agent",[1050,8666,1152],{"class":1144},[1050,8668,1155],{"class":1064},[1050,8670,2537],{"class":1085},[1050,8672,2452],{"class":1064},[1050,8674,3368],{"class":3367},[1050,8676,2452],{"class":1064},[1050,8678,3123],{"class":2562},[1050,8680,2428],{"class":1064},[1050,8682,1152],{"class":1144},[1050,8684,3755],{"class":1148},[1050,8686,1152],{"class":1144},[1050,8688,2435],{"class":1064},[1050,8690,3762],{"class":1144},[1050,8692,5905],{"class":1064},[1050,8694,8695,8697,8700,8702,8704,8706],{"class":1052,"line":3092},[1050,8696,1223],{"class":1144},[1050,8698,8699],{"class":1148},"event_type",[1050,8701,1152],{"class":1144},[1050,8703,1155],{"class":1064},[1050,8705,8503],{"class":1085},[1050,8707,1181],{"class":1064},[1050,8709,8710,8712,8715,8717,8719,8722,8725],{"class":1052,"line":3102},[1050,8711,1223],{"class":1144},[1050,8713,8714],{"class":1148},"details",[1050,8716,1152],{"class":1144},[1050,8718,1155],{"class":1064},[1050,8720,8721],{"class":1085}," details ",[1050,8723,8724],{"class":2480},"or",[1050,8726,7538],{"class":1064},[1050,8728,8729],{"class":1052,"line":3107},[1050,8730,1358],{"class":1064},[1050,8732,8733],{"class":1052,"line":3137},[1050,8734,1929],{"class":1085},[1050,8736,8737],{"class":1052,"line":3149},[1050,8738,8739],{"class":2330},"                # Store in session for analysis\n",[1050,8741,8742,8745,8747,8749,8751,8753,8755,8757,8759,8761,8764,8766,8768],{"class":1052,"line":3155},[1050,8743,8744],{"class":1085},"                events ",[1050,8746,1135],{"class":1064},[1050,8748,2537],{"class":1085},[1050,8750,2452],{"class":1064},[1050,8752,2716],{"class":2455},[1050,8754,2452],{"class":1064},[1050,8756,3123],{"class":2562},[1050,8758,2428],{"class":1064},[1050,8760,1152],{"class":1144},[1050,8762,8763],{"class":1148},"_security_events",[1050,8765,1152],{"class":1144},[1050,8767,2435],{"class":1064},[1050,8769,4408],{"class":1064},[1050,8771,8772,8775,8777,8779,8781,8784],{"class":1052,"line":3196},[1050,8773,8774],{"class":1085},"                events",[1050,8776,2452],{"class":1064},[1050,8778,4533],{"class":2562},[1050,8780,2428],{"class":1064},[1050,8782,8783],{"class":2562},"event_data",[1050,8785,2590],{"class":1064},[1050,8787,8788],{"class":1052,"line":3203},[1050,8789,1929],{"class":1085},[1050,8791,8792],{"class":1052,"line":3208},[1050,8793,8794],{"class":2330},"                # Keep only recent events (last 24 hours)\n",[1050,8796,8797,8799,8801,8803,8805,8807,8809,8811,8813,8815,8817,8819,8821,8823,8826],{"class":1052,"line":3216},[1050,8798,4425],{"class":1085},[1050,8800,1135],{"class":1064},[1050,8802,3179],{"class":1085},[1050,8804,2452],{"class":1064},[1050,8806,3184],{"class":2562},[1050,8808,3257],{"class":1064},[1050,8810,3260],{"class":2480},[1050,8812,3179],{"class":1085},[1050,8814,2452],{"class":1064},[1050,8816,4440],{"class":2562},[1050,8818,2428],{"class":1064},[1050,8820,4445],{"class":3622},[1050,8822,1135],{"class":1064},[1050,8824,8825],{"class":1334},"24",[1050,8827,2590],{"class":1064},[1050,8829,8830,8832,8834],{"class":1052,"line":3243},[1050,8831,8744],{"class":1085},[1050,8833,1135],{"class":1064},[1050,8835,1217],{"class":1064},[1050,8837,8838,8841,8843,8846,8848],{"class":1052,"line":3266},[1050,8839,8840],{"class":1085},"                    event ",[1050,8842,4469],{"class":1693},[1050,8844,8845],{"class":1085}," event ",[1050,8847,3663],{"class":1693},[1050,8849,8850],{"class":1085}," events\n",[1050,8852,8853,8855,8857,8859,8861,8863,8865,8867,8870,8872,8874,8876,8878,8881,8883],{"class":1052,"line":3291},[1050,8854,4483],{"class":1693},[1050,8856,3179],{"class":1085},[1050,8858,2452],{"class":1064},[1050,8860,3228],{"class":2455},[1050,8862,2452],{"class":1064},[1050,8864,3233],{"class":2562},[1050,8866,2428],{"class":1064},[1050,8868,8869],{"class":2562},"event",[1050,8871,3165],{"class":1064},[1050,8873,1152],{"class":1144},[1050,8875,4498],{"class":1148},[1050,8877,1152],{"class":1144},[1050,8879,8880],{"class":1064},"])",[1050,8882,4503],{"class":2480},[1050,8884,4506],{"class":1085},[1050,8886,8887],{"class":1052,"line":3310},[1050,8888,1670],{"class":1064},[1050,8890,8891],{"class":1052,"line":3317},[1050,8892,1929],{"class":1085},[1050,8894,8895,8897,8899,8901,8903,8905,8907,8909,8911,8913],{"class":1052,"line":3322},[1050,8896,4550],{"class":1085},[1050,8898,2452],{"class":1064},[1050,8900,2716],{"class":2455},[1050,8902,3165],{"class":1064},[1050,8904,1152],{"class":1144},[1050,8906,8763],{"class":1148},[1050,8908,1152],{"class":1144},[1050,8910,3174],{"class":1064},[1050,8912,2459],{"class":1064},[1050,8914,8850],{"class":1085},[1050,8916,8917],{"class":1052,"line":3340},[1050,8918,1929],{"class":1085},[1050,8920,8921],{"class":1052,"line":3350},[1050,8922,8923],{"class":2330},"                # Analyze for suspicious patterns\n",[1050,8925,8926,8928,8930,8933,8935,8937,8939,8942],{"class":1052,"line":3355},[1050,8927,2449],{"class":2448},[1050,8929,2452],{"class":1064},[1050,8931,8932],{"class":2562},"analyze_security_events",[1050,8934,2428],{"class":1064},[1050,8936,2568],{"class":2562},[1050,8938,2435],{"class":1064},[1050,8940,8941],{"class":2562}," events",[1050,8943,2590],{"class":1064},[1050,8945,8946],{"class":1052,"line":3386},[1050,8947,1905],{"class":1085},[1050,8949,8950,8952,8955,8957,8959,8961,8963,8965,8967],{"class":1052,"line":3415},[1050,8951,2421],{"class":1056},[1050,8953,8954],{"class":1105}," analyze_security_events",[1050,8956,2428],{"class":1064},[1050,8958,2432],{"class":2431},[1050,8960,2435],{"class":1064},[1050,8962,2537],{"class":2438},[1050,8964,2435],{"class":1064},[1050,8966,8941],{"class":2438},[1050,8968,2442],{"class":1064},[1050,8970,8971,8973,8976],{"class":1052,"line":3420},[1050,8972,2685],{"class":1071},[1050,8974,8975],{"class":1075},"Analyze events for suspicious patterns",[1050,8977,1079],{"class":1071},[1050,8979,8980],{"class":1052,"line":3432},[1050,8981,1929],{"class":1085},[1050,8983,8984],{"class":1052,"line":3456},[1050,8985,8986],{"class":2330},"                # Check for rapid requests\n",[1050,8988,8989,8991,8993,8995,8998,9000,9003],{"class":1052,"line":3463},[1050,8990,2551],{"class":1693},[1050,8992,2557],{"class":2448},[1050,8994,2452],{"class":1064},[1050,8996,8997],{"class":2562},"detect_rapid_requests",[1050,8999,2428],{"class":1064},[1050,9001,9002],{"class":2562},"events",[1050,9004,2442],{"class":1064},[1050,9006,9007,9010,9012,9015,9017,9019,9021,9023,9025,9027,9029,9031],{"class":1052,"line":3468},[1050,9008,9009],{"class":2448},"                    self",[1050,9011,2452],{"class":1064},[1050,9013,9014],{"class":2562},"handle_security_alert",[1050,9016,2428],{"class":1064},[1050,9018,2568],{"class":2562},[1050,9020,2435],{"class":1064},[1050,9022,1173],{"class":1144},[1050,9024,8322],{"class":1148},[1050,9026,1152],{"class":1144},[1050,9028,2435],{"class":1064},[1050,9030,8941],{"class":2562},[1050,9032,2590],{"class":1064},[1050,9034,9035],{"class":1052,"line":3474},[1050,9036,1929],{"class":1085},[1050,9038,9039],{"class":1052,"line":3498},[1050,9040,9041],{"class":2330},"                # Check for multiple IP addresses\n",[1050,9043,9044,9046,9048,9050,9053,9055,9057],{"class":1052,"line":3503},[1050,9045,2551],{"class":1693},[1050,9047,2557],{"class":2448},[1050,9049,2452],{"class":1064},[1050,9051,9052],{"class":2562},"detect_multiple_ips",[1050,9054,2428],{"class":1064},[1050,9056,9002],{"class":2562},[1050,9058,2442],{"class":1064},[1050,9060,9061,9063,9065,9067,9069,9071,9073,9075,9077,9079,9081,9083],{"class":1052,"line":3525},[1050,9062,9009],{"class":2448},[1050,9064,2452],{"class":1064},[1050,9066,9014],{"class":2562},[1050,9068,2428],{"class":1064},[1050,9070,2568],{"class":2562},[1050,9072,2435],{"class":1064},[1050,9074,1173],{"class":1144},[1050,9076,8368],{"class":1148},[1050,9078,1152],{"class":1144},[1050,9080,2435],{"class":1064},[1050,9082,8941],{"class":2562},[1050,9084,2590],{"class":1064},[1050,9086,9087],{"class":1052,"line":3535},[1050,9088,1929],{"class":1085},[1050,9090,9091],{"class":1052,"line":3540},[1050,9092,9093],{"class":2330},"                # Check for unusual activity hours\n",[1050,9095,9096,9098,9100,9102,9105,9107,9109],{"class":1052,"line":3555},[1050,9097,2551],{"class":1693},[1050,9099,2557],{"class":2448},[1050,9101,2452],{"class":1064},[1050,9103,9104],{"class":2562},"detect_unusual_hours",[1050,9106,2428],{"class":1064},[1050,9108,9002],{"class":2562},[1050,9110,2442],{"class":1064},[1050,9112,9113,9115,9117,9119,9121,9123,9125,9127,9129,9131,9133,9135],{"class":1052,"line":3562},[1050,9114,9009],{"class":2448},[1050,9116,2452],{"class":1064},[1050,9118,9014],{"class":2562},[1050,9120,2428],{"class":1064},[1050,9122,2568],{"class":2562},[1050,9124,2435],{"class":1064},[1050,9126,1173],{"class":1144},[1050,9128,8409],{"class":1148},[1050,9130,1152],{"class":1144},[1050,9132,2435],{"class":1064},[1050,9134,8941],{"class":2562},[1050,9136,2590],{"class":1064},[1050,9138,9139],{"class":1052,"line":3567},[1050,9140,1905],{"class":1085},[1050,9142,9143,9145,9148,9150,9152,9154,9156],{"class":1052,"line":3573},[1050,9144,2421],{"class":1056},[1050,9146,9147],{"class":1105}," detect_rapid_requests",[1050,9149,2428],{"class":1064},[1050,9151,2432],{"class":2431},[1050,9153,2435],{"class":1064},[1050,9155,8941],{"class":2438},[1050,9157,2442],{"class":1064},[1050,9159,9160,9162,9165],{"class":1052,"line":3580},[1050,9161,2685],{"class":1071},[1050,9163,9164],{"class":1075},"Detect rapid request patterns",[1050,9166,1079],{"class":1071},[1050,9168,9169],{"class":1052,"line":3589},[1050,9170,1929],{"class":1085},[1050,9172,9173,9176,9178,9180,9182,9184,9186,9188,9190,9192],{"class":1052,"line":3633},[1050,9174,9175],{"class":1085},"                pattern ",[1050,9177,1135],{"class":1064},[1050,9179,2557],{"class":2448},[1050,9181,2452],{"class":1064},[1050,9183,8311],{"class":2455},[1050,9185,3165],{"class":1064},[1050,9187,1152],{"class":1144},[1050,9189,8322],{"class":1148},[1050,9191,1152],{"class":1144},[1050,9193,5763],{"class":1064},[1050,9195,9196,9198,9200,9202,9204,9206,9208,9210,9212,9214,9216,9218,9221,9223,9225,9227,9229,9231,9233],{"class":1052,"line":3655},[1050,9197,4425],{"class":1085},[1050,9199,1135],{"class":1064},[1050,9201,3179],{"class":1085},[1050,9203,2452],{"class":1064},[1050,9205,3184],{"class":2562},[1050,9207,3257],{"class":1064},[1050,9209,3260],{"class":2480},[1050,9211,3179],{"class":1085},[1050,9213,2452],{"class":1064},[1050,9215,4440],{"class":2562},[1050,9217,2428],{"class":1064},[1050,9219,9220],{"class":3622},"seconds",[1050,9222,1135],{"class":1064},[1050,9224,4131],{"class":2562},[1050,9226,3165],{"class":1064},[1050,9228,1152],{"class":1144},[1050,9230,8348],{"class":1148},[1050,9232,1152],{"class":1144},[1050,9234,9235],{"class":1064},"])\n",[1050,9237,9238],{"class":1052,"line":3669},[1050,9239,1929],{"class":1085},[1050,9241,9242,9245,9247],{"class":1052,"line":3689},[1050,9243,9244],{"class":1085},"                recent_events ",[1050,9246,1135],{"class":1064},[1050,9248,1217],{"class":1064},[1050,9250,9251,9253,9255,9257,9259],{"class":1052,"line":3696},[1050,9252,8840],{"class":1085},[1050,9254,4469],{"class":1693},[1050,9256,8845],{"class":1085},[1050,9258,3663],{"class":1693},[1050,9260,8850],{"class":1085},[1050,9262,9263,9265,9267,9269,9271,9273,9275,9277,9279,9281,9283,9285,9287,9289,9291],{"class":1052,"line":3701},[1050,9264,4483],{"class":1693},[1050,9266,3179],{"class":1085},[1050,9268,2452],{"class":1064},[1050,9270,3228],{"class":2455},[1050,9272,2452],{"class":1064},[1050,9274,3233],{"class":2562},[1050,9276,2428],{"class":1064},[1050,9278,8869],{"class":2562},[1050,9280,3165],{"class":1064},[1050,9282,1152],{"class":1144},[1050,9284,4498],{"class":1148},[1050,9286,1152],{"class":1144},[1050,9288,8880],{"class":1064},[1050,9290,4503],{"class":2480},[1050,9292,4506],{"class":1085},[1050,9294,9295],{"class":1052,"line":3719},[1050,9296,1670],{"class":1064},[1050,9298,9299],{"class":1052,"line":3728},[1050,9300,1929],{"class":1085},[1050,9302,9303,9305,9307,9309,9312,9314,9316,9319,9321,9323,9325,9327],{"class":1052,"line":3733},[1050,9304,2653],{"class":1693},[1050,9306,4587],{"class":2424},[1050,9308,2428],{"class":1064},[1050,9310,9311],{"class":2562},"recent_events",[1050,9313,2721],{"class":1064},[1050,9315,4503],{"class":2480},[1050,9317,9318],{"class":1085}," pattern",[1050,9320,3165],{"class":1064},[1050,9322,1152],{"class":1144},[1050,9324,8334],{"class":1148},[1050,9326,1152],{"class":1144},[1050,9328,5763],{"class":1064},[1050,9330,9331],{"class":1052,"line":3767},[1050,9332,1905],{"class":1085},[1050,9334,9335,9337,9340,9342,9344,9346,9348],{"class":1052,"line":3796},[1050,9336,2421],{"class":1056},[1050,9338,9339],{"class":1105}," detect_multiple_ips",[1050,9341,2428],{"class":1064},[1050,9343,2432],{"class":2431},[1050,9345,2435],{"class":1064},[1050,9347,8941],{"class":2438},[1050,9349,2442],{"class":1064},[1050,9351,9352,9354,9357],{"class":1052,"line":3801},[1050,9353,2685],{"class":1071},[1050,9355,9356],{"class":1075},"Detect multiple IP addresses",[1050,9358,1079],{"class":1071},[1050,9360,9361],{"class":1052,"line":3813},[1050,9362,1929],{"class":1085},[1050,9364,9365,9367,9369,9371,9373,9375,9377,9379,9381,9383],{"class":1052,"line":3837},[1050,9366,9175],{"class":1085},[1050,9368,1135],{"class":1064},[1050,9370,2557],{"class":2448},[1050,9372,2452],{"class":1064},[1050,9374,8311],{"class":2455},[1050,9376,3165],{"class":1064},[1050,9378,1152],{"class":1144},[1050,9380,8368],{"class":1148},[1050,9382,1152],{"class":1144},[1050,9384,5763],{"class":1064},[1050,9386,9387,9389,9391,9393,9395,9397,9399,9401,9403,9405,9407,9409,9411,9413,9415,9417,9419,9421,9423],{"class":1052,"line":3844},[1050,9388,4425],{"class":1085},[1050,9390,1135],{"class":1064},[1050,9392,3179],{"class":1085},[1050,9394,2452],{"class":1064},[1050,9396,3184],{"class":2562},[1050,9398,3257],{"class":1064},[1050,9400,3260],{"class":2480},[1050,9402,3179],{"class":1085},[1050,9404,2452],{"class":1064},[1050,9406,4440],{"class":2562},[1050,9408,2428],{"class":1064},[1050,9410,9220],{"class":3622},[1050,9412,1135],{"class":1064},[1050,9414,4131],{"class":2562},[1050,9416,3165],{"class":1064},[1050,9418,1152],{"class":1144},[1050,9420,8348],{"class":1148},[1050,9422,1152],{"class":1144},[1050,9424,9235],{"class":1064},[1050,9426,9427],{"class":1052,"line":3849},[1050,9428,1929],{"class":1085},[1050,9430,9431,9433,9435],{"class":1052,"line":3855},[1050,9432,9244],{"class":1085},[1050,9434,1135],{"class":1064},[1050,9436,1217],{"class":1064},[1050,9438,9439,9441,9443,9445,9447],{"class":1052,"line":3879},[1050,9440,8840],{"class":1085},[1050,9442,4469],{"class":1693},[1050,9444,8845],{"class":1085},[1050,9446,3663],{"class":1693},[1050,9448,8850],{"class":1085},[1050,9450,9451,9453,9455,9457,9459,9461,9463,9465,9467,9469,9471,9473,9475,9477,9479],{"class":1052,"line":3884},[1050,9452,4483],{"class":1693},[1050,9454,3179],{"class":1085},[1050,9456,2452],{"class":1064},[1050,9458,3228],{"class":2455},[1050,9460,2452],{"class":1064},[1050,9462,3233],{"class":2562},[1050,9464,2428],{"class":1064},[1050,9466,8869],{"class":2562},[1050,9468,3165],{"class":1064},[1050,9470,1152],{"class":1144},[1050,9472,4498],{"class":1148},[1050,9474,1152],{"class":1144},[1050,9476,8880],{"class":1064},[1050,9478,4503],{"class":2480},[1050,9480,4506],{"class":1085},[1050,9482,9483],{"class":1052,"line":3906},[1050,9484,1670],{"class":1064},[1050,9486,9487],{"class":1052,"line":3916},[1050,9488,1929],{"class":1085},[1050,9490,9491,9494,9496,9499,9501,9503,9505,9507,9509,9511,9513,9516,9518,9520,9523],{"class":1052,"line":3921},[1050,9492,9493],{"class":1085},"                unique_ips ",[1050,9495,1135],{"class":1064},[1050,9497,9498],{"class":1095}," set",[1050,9500,2428],{"class":1064},[1050,9502,8869],{"class":2562},[1050,9504,3165],{"class":1064},[1050,9506,1152],{"class":1144},[1050,9508,3645],{"class":1148},[1050,9510,1152],{"class":1144},[1050,9512,3174],{"class":1064},[1050,9514,9515],{"class":1693}," for",[1050,9517,8845],{"class":2562},[1050,9519,3663],{"class":1693},[1050,9521,9522],{"class":2562}," recent_events",[1050,9524,2590],{"class":1064},[1050,9526,9527,9529,9531,9533,9536,9538,9540,9542,9544,9546,9548,9550],{"class":1052,"line":3935},[1050,9528,2653],{"class":1693},[1050,9530,4587],{"class":2424},[1050,9532,2428],{"class":1064},[1050,9534,9535],{"class":2562},"unique_ips",[1050,9537,2721],{"class":1064},[1050,9539,4503],{"class":2480},[1050,9541,9318],{"class":1085},[1050,9543,3165],{"class":1064},[1050,9545,1152],{"class":1144},[1050,9547,8334],{"class":1148},[1050,9549,1152],{"class":1144},[1050,9551,5763],{"class":1064},[1050,9553,9554],{"class":1052,"line":3942},[1050,9555,1905],{"class":1085},[1050,9557,9558,9560,9563,9565,9567,9569,9571],{"class":1052,"line":3947},[1050,9559,2421],{"class":1056},[1050,9561,9562],{"class":1105}," detect_unusual_hours",[1050,9564,2428],{"class":1064},[1050,9566,2432],{"class":2431},[1050,9568,2435],{"class":1064},[1050,9570,8941],{"class":2438},[1050,9572,2442],{"class":1064},[1050,9574,9575,9577,9580],{"class":1052,"line":3953},[1050,9576,2685],{"class":1071},[1050,9578,9579],{"class":1075},"Detect activity during unusual hours",[1050,9581,1079],{"class":1071},[1050,9583,9584],{"class":1052,"line":3962},[1050,9585,1929],{"class":1085},[1050,9587,9588,9590,9592,9594,9596,9598,9600,9602,9604,9606],{"class":1052,"line":3967},[1050,9589,9175],{"class":1085},[1050,9591,1135],{"class":1064},[1050,9593,2557],{"class":2448},[1050,9595,2452],{"class":1064},[1050,9597,8311],{"class":2455},[1050,9599,3165],{"class":1064},[1050,9601,1152],{"class":1144},[1050,9603,8409],{"class":1148},[1050,9605,1152],{"class":1144},[1050,9607,5763],{"class":1064},[1050,9609,9610],{"class":1052,"line":3983},[1050,9611,1929],{"class":1085},[1050,9613,9614,9616,9618,9620,9622,9624,9626,9629,9632],{"class":1052,"line":3993},[1050,9615,5477],{"class":1693},[1050,9617,8845],{"class":1085},[1050,9619,3663],{"class":1693},[1050,9621,8941],{"class":1085},[1050,9623,3165],{"class":1064},[1050,9625,4433],{"class":2480},[1050,9627,9628],{"class":1334},"5",[1050,9630,9631],{"class":1064},":]:",[1050,9633,9634],{"class":2330},"  # Check last 5 events\n",[1050,9636,9637,9640,9642,9644,9646,9648,9650,9652,9654,9656,9658,9660,9662,9664],{"class":1052,"line":4021},[1050,9638,9639],{"class":1085},"                    event_time ",[1050,9641,1135],{"class":1064},[1050,9643,3179],{"class":1085},[1050,9645,2452],{"class":1064},[1050,9647,3228],{"class":2455},[1050,9649,2452],{"class":1064},[1050,9651,3233],{"class":2562},[1050,9653,2428],{"class":1064},[1050,9655,8869],{"class":2562},[1050,9657,3165],{"class":1064},[1050,9659,1152],{"class":1144},[1050,9661,4498],{"class":1148},[1050,9663,1152],{"class":1144},[1050,9665,9235],{"class":1064},[1050,9667,9668,9671,9673,9676,9678],{"class":1052,"line":4043},[1050,9669,9670],{"class":1085},"                    hour ",[1050,9672,1135],{"class":1064},[1050,9674,9675],{"class":1085}," event_time",[1050,9677,2452],{"class":1064},[1050,9679,9680],{"class":2455},"hour\n",[1050,9682,9683],{"class":1052,"line":4065},[1050,9684,4094],{"class":1085},[1050,9686,9687,9689,9691,9693,9695,9697,9699,9701,9703,9706,9708,9710,9712,9714,9716,9718],{"class":1052,"line":4085},[1050,9688,4483],{"class":1693},[1050,9690,9318],{"class":1085},[1050,9692,3165],{"class":1064},[1050,9694,1152],{"class":1144},[1050,9696,8420],{"class":1148},[1050,9698,1152],{"class":1144},[1050,9700,3174],{"class":1064},[1050,9702,4724],{"class":2480},[1050,9704,9705],{"class":1085}," hour ",[1050,9707,7150],{"class":2480},[1050,9709,9318],{"class":1085},[1050,9711,3165],{"class":1064},[1050,9713,1152],{"class":1144},[1050,9715,8433],{"class":1148},[1050,9717,1152],{"class":1144},[1050,9719,9720],{"class":1064},"]:\n",[1050,9722,9723,9726],{"class":1052,"line":4091},[1050,9724,9725],{"class":1693},"                        return",[1050,9727,1352],{"class":1300},[1050,9729,9730],{"class":1052,"line":4097},[1050,9731,1929],{"class":1085},[1050,9733,9734,9736],{"class":1052,"line":4113},[1050,9735,2653],{"class":1693},[1050,9737,2820],{"class":1300},[1050,9739,9740],{"class":1052,"line":4141},[1050,9741,1905],{"class":1085},[1050,9743,9744,9746,9749,9751,9753,9755,9757,9759,9762,9764,9766],{"class":1052,"line":4152},[1050,9745,2421],{"class":1056},[1050,9747,9748],{"class":1105}," handle_security_alert",[1050,9750,2428],{"class":1064},[1050,9752,2432],{"class":2431},[1050,9754,2435],{"class":1064},[1050,9756,2537],{"class":2438},[1050,9758,2435],{"class":1064},[1050,9760,9761],{"class":2438}," alert_type",[1050,9763,2435],{"class":1064},[1050,9765,8941],{"class":2438},[1050,9767,2442],{"class":1064},[1050,9769,9770,9772,9775],{"class":1052,"line":4206},[1050,9771,2685],{"class":1071},[1050,9773,9774],{"class":1075},"Handle security alert",[1050,9776,1079],{"class":1071},[1050,9778,9779],{"class":1052,"line":4211},[1050,9780,1929],{"class":1085},[1050,9782,9783,9785,9787,9789],{"class":1052,"line":4224},[1050,9784,4777],{"class":1085},[1050,9786,2452],{"class":1064},[1050,9788,2786],{"class":2562},[1050,9790,4785],{"class":1064},[1050,9792,9793,9795,9798,9800,9803,9805],{"class":1052,"line":4229},[1050,9794,4791],{"class":1056},[1050,9796,9797],{"class":1148},"\"Security alert: ",[1050,9799,2798],{"class":2797},[1050,9801,9802],{"class":2562},"alert_type",[1050,9804,2808],{"class":2797},[1050,9806,9807],{"class":1148}," detected for session \"\n",[1050,9809,9810,9812,9814,9816,9818,9820,9822,9824,9826,9828],{"class":1052,"line":4250},[1050,9811,4791],{"class":1056},[1050,9813,1770],{"class":1148},[1050,9815,2798],{"class":2797},[1050,9817,2568],{"class":2562},[1050,9819,2452],{"class":1064},[1050,9821,2716],{"class":2455},[1050,9823,2452],{"class":1064},[1050,9825,2889],{"class":2455},[1050,9827,2808],{"class":2797},[1050,9829,1807],{"class":1148},[1050,9831,9832],{"class":1052,"line":4272},[1050,9833,4918],{"class":1064},[1050,9835,9836],{"class":1052,"line":4277},[1050,9837,1929],{"class":1085},[1050,9839,9840],{"class":1052,"line":4283},[1050,9841,9842],{"class":2330},"                # Implement response based on alert type\n",[1050,9844,9845,9847,9850,9852,9854,9856,9858],{"class":1052,"line":4304},[1050,9846,2551],{"class":1693},[1050,9848,9849],{"class":1085}," alert_type ",[1050,9851,3548],{"class":2480},[1050,9853,1173],{"class":1144},[1050,9855,8322],{"class":1148},[1050,9857,1152],{"class":1144},[1050,9859,1065],{"class":1064},[1050,9861,9862],{"class":1052,"line":4319},[1050,9863,9864],{"class":2330},"                    # Implement rate limiting\n",[1050,9866,9867,9869,9871,9873,9875,9877,9880,9882,9884,9886],{"class":1052,"line":4324},[1050,9868,3158],{"class":1085},[1050,9870,2452],{"class":1064},[1050,9872,2716],{"class":2455},[1050,9874,3165],{"class":1064},[1050,9876,1152],{"class":1144},[1050,9878,9879],{"class":1148},"_rate_limited",[1050,9881,1152],{"class":1144},[1050,9883,3174],{"class":1064},[1050,9885,2459],{"class":1064},[1050,9887,1352],{"class":1300},[1050,9889,9890,9892,9894,9896,9898,9900,9903,9905,9907,9909],{"class":1052,"line":4342},[1050,9891,3158],{"class":1085},[1050,9893,2452],{"class":1064},[1050,9895,2716],{"class":2455},[1050,9897,3165],{"class":1064},[1050,9899,1152],{"class":1144},[1050,9901,9902],{"class":1148},"_rate_limit_until",[1050,9904,1152],{"class":1144},[1050,9906,3174],{"class":1064},[1050,9908,2459],{"class":1064},[1050,9910,9911],{"class":1064}," (\n",[1050,9913,9914,9917,9919,9921,9923,9926,9928,9930,9932,9934,9936,9938,9941],{"class":1052,"line":4352},[1050,9915,9916],{"class":1085},"                        timezone",[1050,9918,2452],{"class":1064},[1050,9920,3184],{"class":2562},[1050,9922,3257],{"class":1064},[1050,9924,9925],{"class":2480}," +",[1050,9927,3179],{"class":1085},[1050,9929,2452],{"class":1064},[1050,9931,4440],{"class":2562},[1050,9933,2428],{"class":1064},[1050,9935,4642],{"class":3622},[1050,9937,1135],{"class":1064},[1050,9939,9940],{"class":1334},"15",[1050,9942,2590],{"class":1064},[1050,9944,9945,9948,9950],{"class":1052,"line":4357},[1050,9946,9947],{"class":1064},"                    ).",[1050,9949,3190],{"class":2562},[1050,9951,3193],{"class":1064},[1050,9953,9954],{"class":1052,"line":4363},[1050,9955,1929],{"class":1085},[1050,9957,9958,9961,9963,9965,9967,9969,9971],{"class":1052,"line":4379},[1050,9959,9960],{"class":1693},"                elif",[1050,9962,9849],{"class":1085},[1050,9964,3548],{"class":2480},[1050,9966,1173],{"class":1144},[1050,9968,8368],{"class":1148},[1050,9970,1152],{"class":1144},[1050,9972,1065],{"class":1064},[1050,9974,9975],{"class":1052,"line":4411},[1050,9976,9977],{"class":2330},"                    # Require re-authentication\n",[1050,9979,9980,9982,9984,9986,9988,9990,9993,9995,9997,9999],{"class":1052,"line":4416},[1050,9981,3158],{"class":1085},[1050,9983,2452],{"class":1064},[1050,9985,2716],{"class":2455},[1050,9987,3165],{"class":1064},[1050,9989,1152],{"class":1144},[1050,9991,9992],{"class":1148},"_require_reauth",[1050,9994,1152],{"class":1144},[1050,9996,3174],{"class":1064},[1050,9998,2459],{"class":1064},[1050,10000,1352],{"class":1300},[1050,10002,10003],{"class":1052,"line":4422},[1050,10004,1929],{"class":1085},[1050,10006,10007,10009,10011,10013,10015,10017,10019],{"class":1052,"line":4454},[1050,10008,9960],{"class":1693},[1050,10010,9849],{"class":1085},[1050,10012,3548],{"class":2480},[1050,10014,1173],{"class":1144},[1050,10016,8409],{"class":1148},[1050,10018,1152],{"class":1144},[1050,10020,1065],{"class":1064},[1050,10022,10023],{"class":1052,"line":4463},[1050,10024,10025],{"class":2330},"                    # Log for review but don't block\n",[1050,10027,10028,10030,10032,10034,10036,10038,10041,10043,10045,10047],{"class":1052,"line":4480},[1050,10029,3158],{"class":1085},[1050,10031,2452],{"class":1064},[1050,10033,2716],{"class":2455},[1050,10035,3165],{"class":1064},[1050,10037,1152],{"class":1144},[1050,10039,10040],{"class":1148},"_flagged_for_review",[1050,10042,1152],{"class":1144},[1050,10044,3174],{"class":1064},[1050,10046,2459],{"class":1064},[1050,10048,1352],{"class":1300},[1050,10050,10051],{"class":1052,"line":4509},[1050,10052,1126],{"class":1085},[1050,10054,10055,10057],{"class":1052,"line":4514},[1050,10056,1694],{"class":1693},[1050,10058,10059],{"class":1085}," SessionMonitor\n",[1030,10061,10063],{"id":10062},"security-configuration-and-best-practices","Security Configuration and Best Practices",[1035,10065,10067],{"id":10066},"production-security-settings","Production Security Settings",[1040,10069,10071],{"className":1042,"code":10070,"language":1044,"meta":1045,"style":1045},"# Production security configuration\nPRODUCTION_SESSION_SECURITY = {\n    # Core session settings\n    'SESSION_COOKIE_SECURE': True,\n    'SESSION_COOKIE_HTTPONLY': True,\n    'SESSION_COOKIE_SAMESITE': 'Strict',\n    'SESSION_COOKIE_AGE': 3600,  # 1 hour for high security\n    'SESSION_EXPIRE_AT_BROWSER_CLOSE': True,\n    'SESSION_SAVE_EVERY_REQUEST': False,\n    \n    # CSRF protection\n    'CSRF_COOKIE_SECURE': True,\n    'CSRF_COOKIE_HTTPONLY': True,\n    'CSRF_COOKIE_SAMESITE': 'Strict',\n    'CSRF_FAILURE_VIEW': 'myapp.views.csrf_failure',\n    \n    # General security\n    'SECURE_SSL_REDIRECT': True,\n    'SECURE_HSTS_SECONDS': 31536000,  # 1 year\n    'SECURE_HSTS_INCLUDE_SUBDOMAINS': True,\n    'SECURE_HSTS_PRELOAD': True,\n    'SECURE_CONTENT_TYPE_NOSNIFF': True,\n    'SECURE_BROWSER_XSS_FILTER': True,\n    'SECURE_REFERRER_POLICY': 'strict-origin-when-cross-origin',\n    \n    # Content Security Policy\n    'CSP_DEFAULT_SRC': [\"'self'\"],\n    'CSP_SCRIPT_SRC': [\"'self'\", \"'unsafe-inline'\"],\n    'CSP_STYLE_SRC': [\"'self'\", \"'unsafe-inline'\"],\n    'CSP_IMG_SRC': [\"'self'\", \"data:\", \"https:\"],\n    'CSP_CONNECT_SRC': [\"'self'\"],\n    'CSP_FONT_SRC': [\"'self'\"],\n    'CSP_OBJECT_SRC': [\"'none'\"],\n    'CSP_BASE_URI': [\"'self'\"],\n    'CSP_FRAME_ANCESTORS': [\"'none'\"],\n}\n\n# Security middleware configuration\nSECURITY_MIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'myapp.middleware.SecureSessionMiddleware',  # Custom security middleware\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'myapp.middleware.SessionMonitoringMiddleware',  # Custom monitoring\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n]\n\n# Security best practices implementation\nclass SessionSecurityBestPractices:\n    \"\"\"Implementation of session security best practices\"\"\"\n    \n    @staticmethod\n    def security_checklist():\n        \"\"\"Comprehensive security checklist\"\"\"\n        \n        checklist = {\n            'cookie_security': [\n                'Set Secure flag for HTTPS-only transmission',\n                'Set HttpOnly flag to prevent JavaScript access',\n                'Use SameSite=Strict for CSRF protection',\n                'Set appropriate expiration times',\n                'Use secure domain and path restrictions'\n            ],\n            'session_management': [\n                'Regenerate session ID on authentication',\n                'Regenerate session ID on privilege changes',\n                'Implement proper session timeout',\n                'Clear sessions on logout',\n                'Use secure session storage backend'\n            ],\n            'validation_and_monitoring': [\n                'Validate session integrity',\n                'Monitor for suspicious activity',\n                'Implement rate limiting',\n                'Log security events',\n                'Set up alerting for anomalies'\n            ],\n            'infrastructure_security': [\n                'Use HTTPS for all authenticated pages',\n                'Implement proper firewall rules',\n                'Secure session storage backend',\n                'Regular security updates',\n                'Monitor server security logs'\n            ],\n            'application_security': [\n                'Implement proper input validation',\n                'Use parameterized queries',\n                'Implement XSS protection',\n                'Use Content Security Policy',\n                'Regular security code reviews'\n            ]\n        }\n        \n        return checklist\n    \n    @staticmethod\n    def security_testing():\n        \"\"\"Security testing procedures\"\"\"\n        \n        testing_procedures = {\n            'session_hijacking_tests': [\n                'Test session cookie interception',\n                'Verify HTTPS enforcement',\n                'Test session replay attacks',\n                'Validate IP binding (if implemented)'\n            ],\n            'session_fixation_tests': [\n                'Test session ID regeneration on login',\n                'Verify session ID changes on privilege escalation',\n                'Test session validation mechanisms'\n            ],\n            'csrf_protection_tests': [\n                'Test CSRF token validation',\n                'Verify SameSite cookie policy',\n                'Test cross-origin request blocking'\n            ],\n            'automated_security_scanning': [\n                'Use OWASP ZAP for vulnerability scanning',\n                'Implement security unit tests',\n                'Use static code analysis tools',\n                'Regular penetration testing'\n            ]\n        }\n        \n        return testing_procedures\n    \n    @staticmethod\n    def incident_response():\n        \"\"\"Security incident response procedures\"\"\"\n        \n        response_procedures = {\n            'detection': [\n                'Monitor security logs for anomalies',\n                'Set up automated alerting',\n                'Implement real-time monitoring',\n                'Regular security audits'\n            ],\n            'immediate_response': [\n                'Isolate affected systems',\n                'Revoke compromised sessions',\n                'Change authentication credentials',\n                'Document incident details'\n            ],\n            'investigation': [\n                'Analyze security logs',\n                'Identify attack vectors',\n                'Assess data exposure',\n                'Determine root cause'\n            ],\n            'recovery': [\n                'Patch security vulnerabilities',\n                'Restore from clean backups',\n                'Implement additional security measures',\n                'Monitor for continued threats'\n            ],\n            'post_incident': [\n                'Update security procedures',\n                'Conduct lessons learned review',\n                'Improve monitoring and detection',\n                'Update incident response plan'\n            ]\n        }\n        \n        return response_procedures\n\n# Security monitoring and alerting\nclass SecurityMonitoringSystem:\n    \"\"\"Comprehensive security monitoring system\"\"\"\n    \n    def __init__(self):\n        self.alert_thresholds = {\n            'failed_logins': 5,\n            'session_anomalies': 3,\n            'suspicious_ips': 10,\n            'rapid_requests': 100\n        }\n    \n    def monitor_security_events(self):\n        \"\"\"Monitor and analyze security events\"\"\"\n        \n        # This would typically run as a background task\n        monitoring_queries = {\n            'failed_login_attempts': \"\"\"\n                SELECT ip_address, COUNT(*) as attempts\n                FROM security_log \n                WHERE event_type = 'failed_login' \n                AND timestamp > NOW() - INTERVAL 1 HOUR\n                GROUP BY ip_address\n                HAVING attempts > %s\n            \"\"\",\n            'session_anomalies': \"\"\"\n                SELECT session_key, COUNT(*) as anomalies\n                FROM security_log \n                WHERE event_type IN ('ip_change', 'ua_change', 'suspicious_activity')\n                AND timestamp > NOW() - INTERVAL 1 HOUR\n                GROUP BY session_key\n                HAVING anomalies > %s\n            \"\"\",\n            'geographic_anomalies': \"\"\"\n                SELECT user_id, ip_address, location, timestamp\n                FROM security_log \n                WHERE event_type = 'login'\n                AND timestamp > NOW() - INTERVAL 24 HOUR\n                ORDER BY user_id, timestamp\n            \"\"\"\n        }\n        \n        return monitoring_queries\n    \n    def generate_security_report(self):\n        \"\"\"Generate comprehensive security report\"\"\"\n        \n        report_sections = {\n            'session_statistics': 'Active sessions, average duration, geographic distribution',\n            'security_events': 'Failed logins, blocked requests, anomalies detected',\n            'threat_analysis': 'Attack patterns, source analysis, trend identification',\n            'system_health': 'Security system performance, alert response times',\n            'recommendations': 'Security improvements, policy updates, system changes'\n        }\n        \n        return report_sections\n",[1047,10072,10073,10078,10087,10092,10107,10121,10140,10158,10173,10189,10193,10198,10212,10226,10244,10264,10268,10273,10287,10304,10318,10333,10347,10361,10381,10385,10390,10414,10445,10474,10513,10534,10555,10577,10598,10619,10624,10628,10633,10642,10653,10667,10678,10689,10699,10710,10724,10735,10746,10750,10754,10759,10768,10777,10781,10787,10796,10805,10809,10818,10831,10842,10853,10864,10875,10884,10888,10901,10911,10922,10933,10944,10953,10957,10970,10981,10992,11003,11014,11023,11027,11040,11050,11061,11072,11083,11092,11096,11109,11120,11131,11142,11153,11162,11167,11171,11175,11182,11186,11192,11201,11210,11214,11223,11236,11247,11258,11269,11278,11282,11295,11306,11317,11326,11330,11343,11354,11365,11374,11378,11391,11402,11413,11424,11433,11437,11441,11445,11452,11456,11462,11471,11480,11484,11493,11506,11517,11528,11539,11548,11552,11565,11576,11587,11598,11607,11611,11624,11635,11646,11657,11666,11670,11683,11694,11705,11716,11725,11729,11742,11753,11764,11775,11784,11788,11792,11796,11803,11807,11812,11821,11830,11834,11846,11860,11876,11891,11907,11920,11924,11928,11941,11950,11954,11959,11968,11981,11986,11991,11996,12001,12006,12014,12020,12032,12037,12041,12046,12050,12055,12062,12068,12081,12086,12090,12095,12100,12105,12109,12113,12117,12124,12128,12141,12150,12154,12163,12183,12203,12223,12243,12261,12265,12269],{"__ignoreMap":1045},[1050,10074,10075],{"class":1052,"line":1053},[1050,10076,10077],{"class":2330},"# Production security configuration\n",[1050,10079,10080,10083,10085],{"class":1052,"line":1068},[1050,10081,10082],{"class":2448},"PRODUCTION_SESSION_SECURITY",[1050,10084,2459],{"class":1064},[1050,10086,1138],{"class":1064},[1050,10088,10089],{"class":1052,"line":1082},[1050,10090,10091],{"class":2330},"    # Core session settings\n",[1050,10093,10094,10097,10099,10101,10103,10105],{"class":1052,"line":1089},[1050,10095,10096],{"class":1144},"    '",[1050,10098,1293],{"class":1148},[1050,10100,1152],{"class":1144},[1050,10102,1155],{"class":1064},[1050,10104,1301],{"class":1300},[1050,10106,1181],{"class":1064},[1050,10108,10109,10111,10113,10115,10117,10119],{"class":1052,"line":1099},[1050,10110,10096],{"class":1144},[1050,10112,1503],{"class":1148},[1050,10114,1152],{"class":1144},[1050,10116,1155],{"class":1064},[1050,10118,1301],{"class":1300},[1050,10120,1181],{"class":1064},[1050,10122,10123,10125,10128,10130,10132,10134,10136,10138],{"class":1052,"line":1112},[1050,10124,10096],{"class":1144},[1050,10126,10127],{"class":1148},"SESSION_COOKIE_SAMESITE",[1050,10129,1152],{"class":1144},[1050,10131,1155],{"class":1064},[1050,10133,1173],{"class":1144},[1050,10135,2287],{"class":1148},[1050,10137,1152],{"class":1144},[1050,10139,1181],{"class":1064},[1050,10141,10142,10144,10147,10149,10151,10153,10155],{"class":1052,"line":1123},[1050,10143,10096],{"class":1144},[1050,10145,10146],{"class":1148},"SESSION_COOKIE_AGE",[1050,10148,1152],{"class":1144},[1050,10150,1155],{"class":1064},[1050,10152,2484],{"class":1334},[1050,10154,2435],{"class":1064},[1050,10156,10157],{"class":2330},"  # 1 hour for high security\n",[1050,10159,10160,10162,10165,10167,10169,10171],{"class":1052,"line":1129},[1050,10161,10096],{"class":1144},[1050,10163,10164],{"class":1148},"SESSION_EXPIRE_AT_BROWSER_CLOSE",[1050,10166,1152],{"class":1144},[1050,10168,1155],{"class":1064},[1050,10170,1301],{"class":1300},[1050,10172,1181],{"class":1064},[1050,10174,10175,10177,10180,10182,10184,10187],{"class":1052,"line":1141},[1050,10176,10096],{"class":1144},[1050,10178,10179],{"class":1148},"SESSION_SAVE_EVERY_REQUEST",[1050,10181,1152],{"class":1144},[1050,10183,1155],{"class":1064},[1050,10185,10186],{"class":1300}," False",[1050,10188,1181],{"class":1064},[1050,10190,10191],{"class":1052,"line":1160},[1050,10192,1086],{"class":1085},[1050,10194,10195],{"class":1052,"line":1184},[1050,10196,10197],{"class":2330},"    # CSRF protection\n",[1050,10199,10200,10202,10204,10206,10208,10210],{"class":1052,"line":1205},[1050,10201,10096],{"class":1144},[1050,10203,2246],{"class":1148},[1050,10205,1152],{"class":1144},[1050,10207,1155],{"class":1064},[1050,10209,1301],{"class":1300},[1050,10211,1181],{"class":1064},[1050,10213,10214,10216,10218,10220,10222,10224],{"class":1052,"line":1220},[1050,10215,10096],{"class":1144},[1050,10217,2262],{"class":1148},[1050,10219,1152],{"class":1144},[1050,10221,1155],{"class":1064},[1050,10223,1301],{"class":1300},[1050,10225,1181],{"class":1064},[1050,10227,10228,10230,10232,10234,10236,10238,10240,10242],{"class":1052,"line":1233},[1050,10229,10096],{"class":1144},[1050,10231,2278],{"class":1148},[1050,10233,1152],{"class":1144},[1050,10235,1155],{"class":1064},[1050,10237,1173],{"class":1144},[1050,10239,2287],{"class":1148},[1050,10241,1152],{"class":1144},[1050,10243,1181],{"class":1064},[1050,10245,10246,10248,10251,10253,10255,10257,10260,10262],{"class":1052,"line":1245},[1050,10247,10096],{"class":1144},[1050,10249,10250],{"class":1148},"CSRF_FAILURE_VIEW",[1050,10252,1152],{"class":1144},[1050,10254,1155],{"class":1064},[1050,10256,1173],{"class":1144},[1050,10258,10259],{"class":1148},"myapp.views.csrf_failure",[1050,10261,1152],{"class":1144},[1050,10263,1181],{"class":1064},[1050,10265,10266],{"class":1052,"line":1257},[1050,10267,1086],{"class":1085},[1050,10269,10270],{"class":1052,"line":1268},[1050,10271,10272],{"class":2330},"    # General security\n",[1050,10274,10275,10277,10279,10281,10283,10285],{"class":1052,"line":1274},[1050,10276,10096],{"class":1144},[1050,10278,1311],{"class":1148},[1050,10280,1152],{"class":1144},[1050,10282,1155],{"class":1064},[1050,10284,1301],{"class":1300},[1050,10286,1181],{"class":1064},[1050,10288,10289,10291,10293,10295,10297,10299,10301],{"class":1052,"line":1288},[1050,10290,10096],{"class":1144},[1050,10292,1327],{"class":1148},[1050,10294,1152],{"class":1144},[1050,10296,1155],{"class":1064},[1050,10298,1335],{"class":1334},[1050,10300,2435],{"class":1064},[1050,10302,10303],{"class":2330},"  # 1 year\n",[1050,10305,10306,10308,10310,10312,10314,10316],{"class":1052,"line":1306},[1050,10307,10096],{"class":1144},[1050,10309,1345],{"class":1148},[1050,10311,1152],{"class":1144},[1050,10313,1155],{"class":1064},[1050,10315,1301],{"class":1300},[1050,10317,1181],{"class":1064},[1050,10319,10320,10322,10325,10327,10329,10331],{"class":1052,"line":1322},[1050,10321,10096],{"class":1144},[1050,10323,10324],{"class":1148},"SECURE_HSTS_PRELOAD",[1050,10326,1152],{"class":1144},[1050,10328,1155],{"class":1064},[1050,10330,1301],{"class":1300},[1050,10332,1181],{"class":1064},[1050,10334,10335,10337,10339,10341,10343,10345],{"class":1052,"line":1340},[1050,10336,10096],{"class":1144},[1050,10338,1519],{"class":1148},[1050,10340,1152],{"class":1144},[1050,10342,1155],{"class":1064},[1050,10344,1301],{"class":1300},[1050,10346,1181],{"class":1064},[1050,10348,10349,10351,10353,10355,10357,10359],{"class":1052,"line":1355},[1050,10350,10096],{"class":1144},[1050,10352,1535],{"class":1148},[1050,10354,1152],{"class":1144},[1050,10356,1155],{"class":1064},[1050,10358,1301],{"class":1300},[1050,10360,1181],{"class":1064},[1050,10362,10363,10365,10368,10370,10372,10374,10377,10379],{"class":1052,"line":1361},[1050,10364,10096],{"class":1144},[1050,10366,10367],{"class":1148},"SECURE_REFERRER_POLICY",[1050,10369,1152],{"class":1144},[1050,10371,1155],{"class":1064},[1050,10373,1173],{"class":1144},[1050,10375,10376],{"class":1148},"strict-origin-when-cross-origin",[1050,10378,1152],{"class":1144},[1050,10380,1181],{"class":1064},[1050,10382,10383],{"class":1052,"line":1367},[1050,10384,1086],{"class":1085},[1050,10386,10387],{"class":1052,"line":1381},[1050,10388,10389],{"class":2330},"    # Content Security Policy\n",[1050,10391,10392,10394,10397,10399,10401,10404,10406,10409,10411],{"class":1052,"line":1401},[1050,10393,10096],{"class":1144},[1050,10395,10396],{"class":1148},"CSP_DEFAULT_SRC",[1050,10398,1152],{"class":1144},[1050,10400,1155],{"class":1064},[1050,10402,10403],{"class":1064}," [",[1050,10405,1770],{"class":1144},[1050,10407,10408],{"class":1148},"'self'",[1050,10410,1770],{"class":1144},[1050,10412,10413],{"class":1064},"],\n",[1050,10415,10416,10418,10421,10423,10425,10427,10429,10431,10433,10435,10438,10441,10443],{"class":1052,"line":1421},[1050,10417,10096],{"class":1144},[1050,10419,10420],{"class":1148},"CSP_SCRIPT_SRC",[1050,10422,1152],{"class":1144},[1050,10424,1155],{"class":1064},[1050,10426,10403],{"class":1064},[1050,10428,1770],{"class":1144},[1050,10430,10408],{"class":1148},[1050,10432,1770],{"class":1144},[1050,10434,2435],{"class":1064},[1050,10436,10437],{"class":1144}," \"",[1050,10439,10440],{"class":1148},"'unsafe-inline'",[1050,10442,1770],{"class":1144},[1050,10444,10413],{"class":1064},[1050,10446,10447,10449,10452,10454,10456,10458,10460,10462,10464,10466,10468,10470,10472],{"class":1052,"line":1434},[1050,10448,10096],{"class":1144},[1050,10450,10451],{"class":1148},"CSP_STYLE_SRC",[1050,10453,1152],{"class":1144},[1050,10455,1155],{"class":1064},[1050,10457,10403],{"class":1064},[1050,10459,1770],{"class":1144},[1050,10461,10408],{"class":1148},[1050,10463,1770],{"class":1144},[1050,10465,2435],{"class":1064},[1050,10467,10437],{"class":1144},[1050,10469,10440],{"class":1148},[1050,10471,1770],{"class":1144},[1050,10473,10413],{"class":1064},[1050,10475,10476,10478,10481,10483,10485,10487,10489,10491,10493,10495,10497,10500,10502,10504,10506,10509,10511],{"class":1052,"line":1446},[1050,10477,10096],{"class":1144},[1050,10479,10480],{"class":1148},"CSP_IMG_SRC",[1050,10482,1152],{"class":1144},[1050,10484,1155],{"class":1064},[1050,10486,10403],{"class":1064},[1050,10488,1770],{"class":1144},[1050,10490,10408],{"class":1148},[1050,10492,1770],{"class":1144},[1050,10494,2435],{"class":1064},[1050,10496,10437],{"class":1144},[1050,10498,10499],{"class":1148},"data:",[1050,10501,1770],{"class":1144},[1050,10503,2435],{"class":1064},[1050,10505,10437],{"class":1144},[1050,10507,10508],{"class":1148},"https:",[1050,10510,1770],{"class":1144},[1050,10512,10413],{"class":1064},[1050,10514,10515,10517,10520,10522,10524,10526,10528,10530,10532],{"class":1052,"line":1458},[1050,10516,10096],{"class":1144},[1050,10518,10519],{"class":1148},"CSP_CONNECT_SRC",[1050,10521,1152],{"class":1144},[1050,10523,1155],{"class":1064},[1050,10525,10403],{"class":1064},[1050,10527,1770],{"class":1144},[1050,10529,10408],{"class":1148},[1050,10531,1770],{"class":1144},[1050,10533,10413],{"class":1064},[1050,10535,10536,10538,10541,10543,10545,10547,10549,10551,10553],{"class":1052,"line":1470},[1050,10537,10096],{"class":1144},[1050,10539,10540],{"class":1148},"CSP_FONT_SRC",[1050,10542,1152],{"class":1144},[1050,10544,1155],{"class":1064},[1050,10546,10403],{"class":1064},[1050,10548,1770],{"class":1144},[1050,10550,10408],{"class":1148},[1050,10552,1770],{"class":1144},[1050,10554,10413],{"class":1064},[1050,10556,10557,10559,10562,10564,10566,10568,10570,10573,10575],{"class":1052,"line":1480},[1050,10558,10096],{"class":1144},[1050,10560,10561],{"class":1148},"CSP_OBJECT_SRC",[1050,10563,1152],{"class":1144},[1050,10565,1155],{"class":1064},[1050,10567,10403],{"class":1064},[1050,10569,1770],{"class":1144},[1050,10571,10572],{"class":1148},"'none'",[1050,10574,1770],{"class":1144},[1050,10576,10413],{"class":1064},[1050,10578,10579,10581,10584,10586,10588,10590,10592,10594,10596],{"class":1052,"line":1485},[1050,10580,10096],{"class":1144},[1050,10582,10583],{"class":1148},"CSP_BASE_URI",[1050,10585,1152],{"class":1144},[1050,10587,1155],{"class":1064},[1050,10589,10403],{"class":1064},[1050,10591,1770],{"class":1144},[1050,10593,10408],{"class":1148},[1050,10595,1770],{"class":1144},[1050,10597,10413],{"class":1064},[1050,10599,10600,10602,10605,10607,10609,10611,10613,10615,10617],{"class":1052,"line":1498},[1050,10601,10096],{"class":1144},[1050,10603,10604],{"class":1148},"CSP_FRAME_ANCESTORS",[1050,10606,1152],{"class":1144},[1050,10608,1155],{"class":1064},[1050,10610,10403],{"class":1064},[1050,10612,1770],{"class":1144},[1050,10614,10572],{"class":1148},[1050,10616,1770],{"class":1144},[1050,10618,10413],{"class":1064},[1050,10620,10621],{"class":1052,"line":1514},[1050,10622,10623],{"class":1064},"}\n",[1050,10625,10626],{"class":1052,"line":1530},[1050,10627,2324],{"emptyLinePlaceholder":2323},[1050,10629,10630],{"class":1052,"line":1544},[1050,10631,10632],{"class":2330},"# Security middleware configuration\n",[1050,10634,10635,10638,10640],{"class":1052,"line":1549},[1050,10636,10637],{"class":2448},"SECURITY_MIDDLEWARE",[1050,10639,2459],{"class":1064},[1050,10641,1217],{"class":1064},[1050,10643,10644,10646,10649,10651],{"class":1052,"line":1554},[1050,10645,10096],{"class":1144},[1050,10647,10648],{"class":1148},"django.middleware.security.SecurityMiddleware",[1050,10650,1152],{"class":1144},[1050,10652,1181],{"class":1064},[1050,10654,10655,10657,10660,10662,10664],{"class":1052,"line":1568},[1050,10656,10096],{"class":1144},[1050,10658,10659],{"class":1148},"myapp.middleware.SecureSessionMiddleware",[1050,10661,1152],{"class":1144},[1050,10663,2435],{"class":1064},[1050,10665,10666],{"class":2330},"  # Custom security middleware\n",[1050,10668,10669,10671,10674,10676],{"class":1052,"line":1588},[1050,10670,10096],{"class":1144},[1050,10672,10673],{"class":1148},"django.contrib.sessions.middleware.SessionMiddleware",[1050,10675,1152],{"class":1144},[1050,10677,1181],{"class":1064},[1050,10679,10680,10682,10685,10687],{"class":1052,"line":1608},[1050,10681,10096],{"class":1144},[1050,10683,10684],{"class":1148},"django.middleware.common.CommonMiddleware",[1050,10686,1152],{"class":1144},[1050,10688,1181],{"class":1064},[1050,10690,10691,10693,10695,10697],{"class":1052,"line":1621},[1050,10692,10096],{"class":1144},[1050,10694,2178],{"class":1148},[1050,10696,1152],{"class":1144},[1050,10698,1181],{"class":1064},[1050,10700,10701,10703,10706,10708],{"class":1052,"line":1633},[1050,10702,10096],{"class":1144},[1050,10704,10705],{"class":1148},"django.contrib.auth.middleware.AuthenticationMiddleware",[1050,10707,1152],{"class":1144},[1050,10709,1181],{"class":1064},[1050,10711,10712,10714,10717,10719,10721],{"class":1052,"line":1645},[1050,10713,10096],{"class":1144},[1050,10715,10716],{"class":1148},"myapp.middleware.SessionMonitoringMiddleware",[1050,10718,1152],{"class":1144},[1050,10720,2435],{"class":1064},[1050,10722,10723],{"class":2330},"  # Custom monitoring\n",[1050,10725,10726,10728,10731,10733],{"class":1052,"line":1657},[1050,10727,10096],{"class":1144},[1050,10729,10730],{"class":1148},"django.contrib.messages.middleware.MessageMiddleware",[1050,10732,1152],{"class":1144},[1050,10734,1181],{"class":1064},[1050,10736,10737,10739,10742,10744],{"class":1052,"line":1667},[1050,10738,10096],{"class":1144},[1050,10740,10741],{"class":1148},"django.middleware.clickjacking.XFrameOptionsMiddleware",[1050,10743,1152],{"class":1144},[1050,10745,1181],{"class":1064},[1050,10747,10748],{"class":1052,"line":1673},[1050,10749,5763],{"class":1064},[1050,10751,10752],{"class":1052,"line":1679},[1050,10753,2324],{"emptyLinePlaceholder":2323},[1050,10755,10756],{"class":1052,"line":1685},[1050,10757,10758],{"class":2330},"# Security best practices implementation\n",[1050,10760,10761,10763,10766],{"class":1052,"line":1690},[1050,10762,1057],{"class":1056},[1050,10764,10765],{"class":1060}," SessionSecurityBestPractices",[1050,10767,1065],{"class":1064},[1050,10769,10770,10772,10775],{"class":1052,"line":1700},[1050,10771,1072],{"class":1071},[1050,10773,10774],{"class":1075},"Implementation of session security best practices",[1050,10776,1079],{"class":1071},[1050,10778,10779],{"class":1052,"line":1705},[1050,10780,1086],{"class":1085},[1050,10782,10783,10785],{"class":1052,"line":1712},[1050,10784,1092],{"class":1064},[1050,10786,1096],{"class":1095},[1050,10788,10789,10791,10794],{"class":1052,"line":1722},[1050,10790,1102],{"class":1056},[1050,10792,10793],{"class":1105}," security_checklist",[1050,10795,1109],{"class":1064},[1050,10797,10798,10800,10803],{"class":1052,"line":1732},[1050,10799,1115],{"class":1071},[1050,10801,10802],{"class":1075},"Comprehensive security checklist",[1050,10804,1079],{"class":1071},[1050,10806,10807],{"class":1052,"line":1737},[1050,10808,1126],{"class":1085},[1050,10810,10811,10814,10816],{"class":1052,"line":1747},[1050,10812,10813],{"class":1085},"        checklist ",[1050,10815,1135],{"class":1064},[1050,10817,1138],{"class":1064},[1050,10819,10820,10822,10825,10827,10829],{"class":1052,"line":1761},[1050,10821,1145],{"class":1144},[1050,10823,10824],{"class":1148},"cookie_security",[1050,10826,1152],{"class":1144},[1050,10828,1155],{"class":1064},[1050,10830,1217],{"class":1064},[1050,10832,10833,10835,10838,10840],{"class":1052,"line":1775},[1050,10834,1163],{"class":1144},[1050,10836,10837],{"class":1148},"Set Secure flag for HTTPS-only transmission",[1050,10839,1152],{"class":1144},[1050,10841,1181],{"class":1064},[1050,10843,10844,10846,10849,10851],{"class":1052,"line":1787},[1050,10845,1163],{"class":1144},[1050,10847,10848],{"class":1148},"Set HttpOnly flag to prevent JavaScript access",[1050,10850,1152],{"class":1144},[1050,10852,1181],{"class":1064},[1050,10854,10855,10857,10860,10862],{"class":1052,"line":1799},[1050,10856,1163],{"class":1144},[1050,10858,10859],{"class":1148},"Use SameSite=Strict for CSRF protection",[1050,10861,1152],{"class":1144},[1050,10863,1181],{"class":1064},[1050,10865,10866,10868,10871,10873],{"class":1052,"line":1810},[1050,10867,1163],{"class":1144},[1050,10869,10870],{"class":1148},"Set appropriate expiration times",[1050,10872,1152],{"class":1144},[1050,10874,1181],{"class":1064},[1050,10876,10877,10879,10882],{"class":1052,"line":1816},[1050,10878,1163],{"class":1144},[1050,10880,10881],{"class":1148},"Use secure domain and path restrictions",[1050,10883,1265],{"class":1144},[1050,10885,10886],{"class":1052,"line":1830},[1050,10887,1813],{"class":1064},[1050,10889,10890,10892,10895,10897,10899],{"class":1052,"line":1842},[1050,10891,1145],{"class":1144},[1050,10893,10894],{"class":1148},"session_management",[1050,10896,1152],{"class":1144},[1050,10898,1155],{"class":1064},[1050,10900,1217],{"class":1064},[1050,10902,10903,10905,10907,10909],{"class":1052,"line":1854},[1050,10904,1163],{"class":1144},[1050,10906,1835],{"class":1148},[1050,10908,1152],{"class":1144},[1050,10910,1181],{"class":1064},[1050,10912,10913,10915,10918,10920],{"class":1052,"line":1866},[1050,10914,1163],{"class":1144},[1050,10916,10917],{"class":1148},"Regenerate session ID on privilege changes",[1050,10919,1152],{"class":1144},[1050,10921,1181],{"class":1064},[1050,10923,10924,10926,10929,10931],{"class":1052,"line":1876},[1050,10925,1163],{"class":1144},[1050,10927,10928],{"class":1148},"Implement proper session timeout",[1050,10930,1152],{"class":1144},[1050,10932,1181],{"class":1064},[1050,10934,10935,10937,10940,10942],{"class":1052,"line":1881},[1050,10936,1163],{"class":1144},[1050,10938,10939],{"class":1148},"Clear sessions on logout",[1050,10941,1152],{"class":1144},[1050,10943,1181],{"class":1064},[1050,10945,10946,10948,10951],{"class":1052,"line":1896},[1050,10947,1163],{"class":1144},[1050,10949,10950],{"class":1148},"Use secure session storage backend",[1050,10952,1265],{"class":1144},[1050,10954,10955],{"class":1052,"line":1902},[1050,10956,1813],{"class":1064},[1050,10958,10959,10961,10964,10966,10968],{"class":1052,"line":1908},[1050,10960,1145],{"class":1144},[1050,10962,10963],{"class":1148},"validation_and_monitoring",[1050,10965,1152],{"class":1144},[1050,10967,1155],{"class":1064},[1050,10969,1217],{"class":1064},[1050,10971,10972,10974,10977,10979],{"class":1052,"line":1914},[1050,10973,1163],{"class":1144},[1050,10975,10976],{"class":1148},"Validate session integrity",[1050,10978,1152],{"class":1144},[1050,10980,1181],{"class":1064},[1050,10982,10983,10985,10988,10990],{"class":1052,"line":1920},[1050,10984,1163],{"class":1144},[1050,10986,10987],{"class":1148},"Monitor for suspicious activity",[1050,10989,1152],{"class":1144},[1050,10991,1181],{"class":1064},[1050,10993,10994,10996,10999,11001],{"class":1052,"line":1926},[1050,10995,1163],{"class":1144},[1050,10997,10998],{"class":1148},"Implement rate limiting",[1050,11000,1152],{"class":1144},[1050,11002,1181],{"class":1064},[1050,11004,11005,11007,11010,11012],{"class":1052,"line":1932},[1050,11006,1163],{"class":1144},[1050,11008,11009],{"class":1148},"Log security events",[1050,11011,1152],{"class":1144},[1050,11013,1181],{"class":1064},[1050,11015,11016,11018,11021],{"class":1052,"line":1938},[1050,11017,1163],{"class":1144},[1050,11019,11020],{"class":1148},"Set up alerting for anomalies",[1050,11022,1265],{"class":1144},[1050,11024,11025],{"class":1052,"line":1944},[1050,11026,1813],{"class":1064},[1050,11028,11029,11031,11034,11036,11038],{"class":1052,"line":1949},[1050,11030,1145],{"class":1144},[1050,11032,11033],{"class":1148},"infrastructure_security",[1050,11035,1152],{"class":1144},[1050,11037,1155],{"class":1064},[1050,11039,1217],{"class":1064},[1050,11041,11042,11044,11046,11048],{"class":1052,"line":1955},[1050,11043,1163],{"class":1144},[1050,11045,1226],{"class":1148},[1050,11047,1152],{"class":1144},[1050,11049,1181],{"class":1064},[1050,11051,11052,11054,11057,11059],{"class":1052,"line":1961},[1050,11053,1163],{"class":1144},[1050,11055,11056],{"class":1148},"Implement proper firewall rules",[1050,11058,1152],{"class":1144},[1050,11060,1181],{"class":1064},[1050,11062,11063,11065,11068,11070],{"class":1052,"line":1967},[1050,11064,1163],{"class":1144},[1050,11066,11067],{"class":1148},"Secure session storage backend",[1050,11069,1152],{"class":1144},[1050,11071,1181],{"class":1064},[1050,11073,11074,11076,11079,11081],{"class":1052,"line":1973},[1050,11075,1163],{"class":1144},[1050,11077,11078],{"class":1148},"Regular security updates",[1050,11080,1152],{"class":1144},[1050,11082,1181],{"class":1064},[1050,11084,11085,11087,11090],{"class":1052,"line":1979},[1050,11086,1163],{"class":1144},[1050,11088,11089],{"class":1148},"Monitor server security logs",[1050,11091,1265],{"class":1144},[1050,11093,11094],{"class":1052,"line":1984},[1050,11095,1813],{"class":1064},[1050,11097,11098,11100,11103,11105,11107],{"class":1052,"line":1989},[1050,11099,1145],{"class":1144},[1050,11101,11102],{"class":1148},"application_security",[1050,11104,1152],{"class":1144},[1050,11106,1155],{"class":1064},[1050,11108,1217],{"class":1064},[1050,11110,11111,11113,11116,11118],{"class":1052,"line":1997},[1050,11112,1163],{"class":1144},[1050,11114,11115],{"class":1148},"Implement proper input validation",[1050,11117,1152],{"class":1144},[1050,11119,1181],{"class":1064},[1050,11121,11122,11124,11127,11129],{"class":1052,"line":2002},[1050,11123,1163],{"class":1144},[1050,11125,11126],{"class":1148},"Use parameterized queries",[1050,11128,1152],{"class":1144},[1050,11130,1181],{"class":1064},[1050,11132,11133,11135,11138,11140],{"class":1052,"line":2009},[1050,11134,1163],{"class":1144},[1050,11136,11137],{"class":1148},"Implement XSS protection",[1050,11139,1152],{"class":1144},[1050,11141,1181],{"class":1064},[1050,11143,11144,11146,11149,11151],{"class":1052,"line":2019},[1050,11145,1163],{"class":1144},[1050,11147,11148],{"class":1148},"Use Content Security Policy",[1050,11150,1152],{"class":1144},[1050,11152,1181],{"class":1064},[1050,11154,11155,11157,11160],{"class":1052,"line":2029},[1050,11156,1163],{"class":1144},[1050,11158,11159],{"class":1148},"Regular security code reviews",[1050,11161,1265],{"class":1144},[1050,11163,11164],{"class":1052,"line":2034},[1050,11165,11166],{"class":1064},"            ]\n",[1050,11168,11169],{"class":1052,"line":2044},[1050,11170,1682],{"class":1064},[1050,11172,11173],{"class":1052,"line":2065},[1050,11174,1126],{"class":1085},[1050,11176,11177,11179],{"class":1052,"line":2086},[1050,11178,1694],{"class":1693},[1050,11180,11181],{"class":1085}," checklist\n",[1050,11183,11184],{"class":1052,"line":2099},[1050,11185,1086],{"class":1085},[1050,11187,11188,11190],{"class":1052,"line":2111},[1050,11189,1092],{"class":1064},[1050,11191,1096],{"class":1095},[1050,11193,11194,11196,11199],{"class":1052,"line":2123},[1050,11195,1102],{"class":1056},[1050,11197,11198],{"class":1105}," security_testing",[1050,11200,1109],{"class":1064},[1050,11202,11203,11205,11208],{"class":1052,"line":2135},[1050,11204,1115],{"class":1071},[1050,11206,11207],{"class":1075},"Security testing procedures",[1050,11209,1079],{"class":1071},[1050,11211,11212],{"class":1052,"line":2145},[1050,11213,1126],{"class":1085},[1050,11215,11216,11219,11221],{"class":1052,"line":2150},[1050,11217,11218],{"class":1085},"        testing_procedures ",[1050,11220,1135],{"class":1064},[1050,11222,1138],{"class":1064},[1050,11224,11225,11227,11230,11232,11234],{"class":1052,"line":2164},[1050,11226,1145],{"class":1144},[1050,11228,11229],{"class":1148},"session_hijacking_tests",[1050,11231,1152],{"class":1144},[1050,11233,1155],{"class":1064},[1050,11235,1217],{"class":1064},[1050,11237,11238,11240,11243,11245],{"class":1052,"line":2185},[1050,11239,1163],{"class":1144},[1050,11241,11242],{"class":1148},"Test session cookie interception",[1050,11244,1152],{"class":1144},[1050,11246,1181],{"class":1064},[1050,11248,11249,11251,11254,11256],{"class":1052,"line":2206},[1050,11250,1163],{"class":1144},[1050,11252,11253],{"class":1148},"Verify HTTPS enforcement",[1050,11255,1152],{"class":1144},[1050,11257,1181],{"class":1064},[1050,11259,11260,11262,11265,11267],{"class":1052,"line":2227},[1050,11261,1163],{"class":1144},[1050,11263,11264],{"class":1148},"Test session replay attacks",[1050,11266,1152],{"class":1144},[1050,11268,1181],{"class":1064},[1050,11270,11271,11273,11276],{"class":1052,"line":2241},[1050,11272,1163],{"class":1144},[1050,11274,11275],{"class":1148},"Validate IP binding (if implemented)",[1050,11277,1265],{"class":1144},[1050,11279,11280],{"class":1052,"line":2257},[1050,11281,1813],{"class":1064},[1050,11283,11284,11286,11289,11291,11293],{"class":1052,"line":2273},[1050,11285,1145],{"class":1144},[1050,11287,11288],{"class":1148},"session_fixation_tests",[1050,11290,1152],{"class":1144},[1050,11292,1155],{"class":1064},[1050,11294,1217],{"class":1064},[1050,11296,11297,11299,11302,11304],{"class":1052,"line":2292},[1050,11298,1163],{"class":1144},[1050,11300,11301],{"class":1148},"Test session ID regeneration on login",[1050,11303,1152],{"class":1144},[1050,11305,1181],{"class":1064},[1050,11307,11308,11310,11313,11315],{"class":1052,"line":2297},[1050,11309,1163],{"class":1144},[1050,11311,11312],{"class":1148},"Verify session ID changes on privilege escalation",[1050,11314,1152],{"class":1144},[1050,11316,1181],{"class":1064},[1050,11318,11319,11321,11324],{"class":1052,"line":2302},[1050,11320,1163],{"class":1144},[1050,11322,11323],{"class":1148},"Test session validation mechanisms",[1050,11325,1265],{"class":1144},[1050,11327,11328],{"class":1052,"line":2307},[1050,11329,1813],{"class":1064},[1050,11331,11332,11334,11337,11339,11341],{"class":1052,"line":2312},[1050,11333,1145],{"class":1144},[1050,11335,11336],{"class":1148},"csrf_protection_tests",[1050,11338,1152],{"class":1144},[1050,11340,1155],{"class":1064},[1050,11342,1217],{"class":1064},[1050,11344,11345,11347,11350,11352],{"class":1052,"line":2320},[1050,11346,1163],{"class":1144},[1050,11348,11349],{"class":1148},"Test CSRF token validation",[1050,11351,1152],{"class":1144},[1050,11353,1181],{"class":1064},[1050,11355,11356,11358,11361,11363],{"class":1052,"line":2327},[1050,11357,1163],{"class":1144},[1050,11359,11360],{"class":1148},"Verify SameSite cookie policy",[1050,11362,1152],{"class":1144},[1050,11364,1181],{"class":1064},[1050,11366,11367,11369,11372],{"class":1052,"line":2334},[1050,11368,1163],{"class":1144},[1050,11370,11371],{"class":1148},"Test cross-origin request blocking",[1050,11373,1265],{"class":1144},[1050,11375,11376],{"class":1052,"line":2344},[1050,11377,1813],{"class":1064},[1050,11379,11380,11382,11385,11387,11389],{"class":1052,"line":2354},[1050,11381,1145],{"class":1144},[1050,11383,11384],{"class":1148},"automated_security_scanning",[1050,11386,1152],{"class":1144},[1050,11388,1155],{"class":1064},[1050,11390,1217],{"class":1064},[1050,11392,11393,11395,11398,11400],{"class":1052,"line":2359},[1050,11394,1163],{"class":1144},[1050,11396,11397],{"class":1148},"Use OWASP ZAP for vulnerability scanning",[1050,11399,1152],{"class":1144},[1050,11401,1181],{"class":1064},[1050,11403,11404,11406,11409,11411],{"class":1052,"line":2366},[1050,11405,1163],{"class":1144},[1050,11407,11408],{"class":1148},"Implement security unit tests",[1050,11410,1152],{"class":1144},[1050,11412,1181],{"class":1064},[1050,11414,11415,11417,11420,11422],{"class":1052,"line":2376},[1050,11416,1163],{"class":1144},[1050,11418,11419],{"class":1148},"Use static code analysis tools",[1050,11421,1152],{"class":1144},[1050,11423,1181],{"class":1064},[1050,11425,11426,11428,11431],{"class":1052,"line":2386},[1050,11427,1163],{"class":1144},[1050,11429,11430],{"class":1148},"Regular penetration testing",[1050,11432,1265],{"class":1144},[1050,11434,11435],{"class":1052,"line":2391},[1050,11436,11166],{"class":1064},[1050,11438,11439],{"class":1052,"line":2402},[1050,11440,1682],{"class":1064},[1050,11442,11443],{"class":1052,"line":2413},[1050,11444,1126],{"class":1085},[1050,11446,11447,11449],{"class":1052,"line":2418},[1050,11448,1694],{"class":1693},[1050,11450,11451],{"class":1085}," testing_procedures\n",[1050,11453,11454],{"class":1052,"line":2445},[1050,11455,1086],{"class":1085},[1050,11457,11458,11460],{"class":1052,"line":2465},[1050,11459,1092],{"class":1064},[1050,11461,1096],{"class":1095},[1050,11463,11464,11466,11469],{"class":1052,"line":2490},[1050,11465,1102],{"class":1056},[1050,11467,11468],{"class":1105}," incident_response",[1050,11470,1109],{"class":1064},[1050,11472,11473,11475,11478],{"class":1052,"line":2504},[1050,11474,1115],{"class":1071},[1050,11476,11477],{"class":1075},"Security incident response procedures",[1050,11479,1079],{"class":1071},[1050,11481,11482],{"class":1052,"line":2518},[1050,11483,1126],{"class":1085},[1050,11485,11486,11489,11491],{"class":1052,"line":2523},[1050,11487,11488],{"class":1085},"        response_procedures ",[1050,11490,1135],{"class":1064},[1050,11492,1138],{"class":1064},[1050,11494,11495,11497,11500,11502,11504],{"class":1052,"line":2542},[1050,11496,1145],{"class":1144},[1050,11498,11499],{"class":1148},"detection",[1050,11501,1152],{"class":1144},[1050,11503,1155],{"class":1064},[1050,11505,1217],{"class":1064},[1050,11507,11508,11510,11513,11515],{"class":1052,"line":2548},[1050,11509,1163],{"class":1144},[1050,11511,11512],{"class":1148},"Monitor security logs for anomalies",[1050,11514,1152],{"class":1144},[1050,11516,1181],{"class":1064},[1050,11518,11519,11521,11524,11526],{"class":1052,"line":2573},[1050,11520,1163],{"class":1144},[1050,11522,11523],{"class":1148},"Set up automated alerting",[1050,11525,1152],{"class":1144},[1050,11527,1181],{"class":1064},[1050,11529,11530,11532,11535,11537],{"class":1052,"line":2593},[1050,11531,1163],{"class":1144},[1050,11533,11534],{"class":1148},"Implement real-time monitoring",[1050,11536,1152],{"class":1144},[1050,11538,1181],{"class":1064},[1050,11540,11541,11543,11546],{"class":1052,"line":2598},[1050,11542,1163],{"class":1144},[1050,11544,11545],{"class":1148},"Regular security audits",[1050,11547,1265],{"class":1144},[1050,11549,11550],{"class":1052,"line":2618},[1050,11551,1813],{"class":1064},[1050,11553,11554,11556,11559,11561,11563],{"class":1052,"line":2623},[1050,11555,1145],{"class":1144},[1050,11557,11558],{"class":1148},"immediate_response",[1050,11560,1152],{"class":1144},[1050,11562,1155],{"class":1064},[1050,11564,1217],{"class":1064},[1050,11566,11567,11569,11572,11574],{"class":1052,"line":2629},[1050,11568,1163],{"class":1144},[1050,11570,11571],{"class":1148},"Isolate affected systems",[1050,11573,1152],{"class":1144},[1050,11575,1181],{"class":1064},[1050,11577,11578,11580,11583,11585],{"class":1052,"line":2645},[1050,11579,1163],{"class":1144},[1050,11581,11582],{"class":1148},"Revoke compromised sessions",[1050,11584,1152],{"class":1144},[1050,11586,1181],{"class":1064},[1050,11588,11589,11591,11594,11596],{"class":1052,"line":2650},[1050,11590,1163],{"class":1144},[1050,11592,11593],{"class":1148},"Change authentication credentials",[1050,11595,1152],{"class":1144},[1050,11597,1181],{"class":1064},[1050,11599,11600,11602,11605],{"class":1052,"line":2659},[1050,11601,1163],{"class":1144},[1050,11603,11604],{"class":1148},"Document incident details",[1050,11606,1265],{"class":1144},[1050,11608,11609],{"class":1052,"line":2664},[1050,11610,1813],{"class":1064},[1050,11612,11613,11615,11618,11620,11622],{"class":1052,"line":2682},[1050,11614,1145],{"class":1144},[1050,11616,11617],{"class":1148},"investigation",[1050,11619,1152],{"class":1144},[1050,11621,1155],{"class":1064},[1050,11623,1217],{"class":1064},[1050,11625,11626,11628,11631,11633],{"class":1052,"line":2693},[1050,11627,1163],{"class":1144},[1050,11629,11630],{"class":1148},"Analyze security logs",[1050,11632,1152],{"class":1144},[1050,11634,1181],{"class":1064},[1050,11636,11637,11639,11642,11644],{"class":1052,"line":2698},[1050,11638,1163],{"class":1144},[1050,11640,11641],{"class":1148},"Identify attack vectors",[1050,11643,1152],{"class":1144},[1050,11645,1181],{"class":1064},[1050,11647,11648,11650,11653,11655],{"class":1052,"line":2740},[1050,11649,1163],{"class":1144},[1050,11651,11652],{"class":1148},"Assess data exposure",[1050,11654,1152],{"class":1144},[1050,11656,1181],{"class":1064},[1050,11658,11659,11661,11664],{"class":1052,"line":2747},[1050,11660,1163],{"class":1144},[1050,11662,11663],{"class":1148},"Determine root cause",[1050,11665,1265],{"class":1144},[1050,11667,11668],{"class":1052,"line":2752},[1050,11669,1813],{"class":1064},[1050,11671,11672,11674,11677,11679,11681],{"class":1052,"line":2758},[1050,11673,1145],{"class":1144},[1050,11675,11676],{"class":1148},"recovery",[1050,11678,1152],{"class":1144},[1050,11680,1155],{"class":1064},[1050,11682,1217],{"class":1064},[1050,11684,11685,11687,11690,11692],{"class":1052,"line":2778},[1050,11686,1163],{"class":1144},[1050,11688,11689],{"class":1148},"Patch security vulnerabilities",[1050,11691,1152],{"class":1144},[1050,11693,1181],{"class":1064},[1050,11695,11696,11698,11701,11703],{"class":1052,"line":2815},[1050,11697,1163],{"class":1144},[1050,11699,11700],{"class":1148},"Restore from clean backups",[1050,11702,1152],{"class":1144},[1050,11704,1181],{"class":1064},[1050,11706,11707,11709,11712,11714],{"class":1052,"line":2823},[1050,11708,1163],{"class":1144},[1050,11710,11711],{"class":1148},"Implement additional security measures",[1050,11713,1152],{"class":1144},[1050,11715,1181],{"class":1064},[1050,11717,11718,11720,11723],{"class":1052,"line":2828},[1050,11719,1163],{"class":1144},[1050,11721,11722],{"class":1148},"Monitor for continued threats",[1050,11724,1265],{"class":1144},[1050,11726,11727],{"class":1052,"line":2834},[1050,11728,1813],{"class":1064},[1050,11730,11731,11733,11736,11738,11740],{"class":1052,"line":2863},[1050,11732,1145],{"class":1144},[1050,11734,11735],{"class":1148},"post_incident",[1050,11737,1152],{"class":1144},[1050,11739,1155],{"class":1064},[1050,11741,1217],{"class":1064},[1050,11743,11744,11746,11749,11751],{"class":1052,"line":2898},[1050,11745,1163],{"class":1144},[1050,11747,11748],{"class":1148},"Update security procedures",[1050,11750,1152],{"class":1144},[1050,11752,1181],{"class":1064},[1050,11754,11755,11757,11760,11762],{"class":1052,"line":2905},[1050,11756,1163],{"class":1144},[1050,11758,11759],{"class":1148},"Conduct lessons learned review",[1050,11761,1152],{"class":1144},[1050,11763,1181],{"class":1064},[1050,11765,11766,11768,11771,11773],{"class":1052,"line":2910},[1050,11767,1163],{"class":1144},[1050,11769,11770],{"class":1148},"Improve monitoring and detection",[1050,11772,1152],{"class":1144},[1050,11774,1181],{"class":1064},[1050,11776,11777,11779,11782],{"class":1052,"line":2916},[1050,11778,1163],{"class":1144},[1050,11780,11781],{"class":1148},"Update incident response plan",[1050,11783,1265],{"class":1144},[1050,11785,11786],{"class":1052,"line":2944},[1050,11787,11166],{"class":1064},[1050,11789,11790],{"class":1052,"line":2978},[1050,11791,1682],{"class":1064},[1050,11793,11794],{"class":1052,"line":2985},[1050,11795,1126],{"class":1085},[1050,11797,11798,11800],{"class":1052,"line":2990},[1050,11799,1694],{"class":1693},[1050,11801,11802],{"class":1085}," response_procedures\n",[1050,11804,11805],{"class":1052,"line":2996},[1050,11806,2324],{"emptyLinePlaceholder":2323},[1050,11808,11809],{"class":1052,"line":3016},[1050,11810,11811],{"class":2330},"# Security monitoring and alerting\n",[1050,11813,11814,11816,11819],{"class":1052,"line":3050},[1050,11815,1057],{"class":1056},[1050,11817,11818],{"class":1060}," SecurityMonitoringSystem",[1050,11820,1065],{"class":1064},[1050,11822,11823,11825,11828],{"class":1052,"line":3057},[1050,11824,1072],{"class":1071},[1050,11826,11827],{"class":1075},"Comprehensive security monitoring system",[1050,11829,1079],{"class":1071},[1050,11831,11832],{"class":1052,"line":3062},[1050,11833,1086],{"class":1085},[1050,11835,11836,11838,11840,11842,11844],{"class":1052,"line":3069},[1050,11837,1102],{"class":1056},[1050,11839,2425],{"class":2424},[1050,11841,2428],{"class":1064},[1050,11843,2432],{"class":2431},[1050,11845,2442],{"class":1064},[1050,11847,11848,11851,11853,11856,11858],{"class":1052,"line":3074},[1050,11849,11850],{"class":2448},"        self",[1050,11852,2452],{"class":1064},[1050,11854,11855],{"class":2455},"alert_thresholds",[1050,11857,2459],{"class":1064},[1050,11859,1138],{"class":1064},[1050,11861,11862,11864,11867,11869,11871,11874],{"class":1052,"line":3092},[1050,11863,1145],{"class":1144},[1050,11865,11866],{"class":1148},"failed_logins",[1050,11868,1152],{"class":1144},[1050,11870,1155],{"class":1064},[1050,11872,11873],{"class":1334}," 5",[1050,11875,1181],{"class":1064},[1050,11877,11878,11880,11883,11885,11887,11889],{"class":1052,"line":3102},[1050,11879,1145],{"class":1144},[1050,11881,11882],{"class":1148},"session_anomalies",[1050,11884,1152],{"class":1144},[1050,11886,1155],{"class":1064},[1050,11888,8385],{"class":1334},[1050,11890,1181],{"class":1064},[1050,11892,11893,11895,11898,11900,11902,11905],{"class":1052,"line":3107},[1050,11894,1145],{"class":1144},[1050,11896,11897],{"class":1148},"suspicious_ips",[1050,11899,1152],{"class":1144},[1050,11901,1155],{"class":1064},[1050,11903,11904],{"class":1334}," 10",[1050,11906,1181],{"class":1064},[1050,11908,11909,11911,11913,11915,11917],{"class":1052,"line":3137},[1050,11910,1145],{"class":1144},[1050,11912,8322],{"class":1148},[1050,11914,1152],{"class":1144},[1050,11916,1155],{"class":1064},[1050,11918,11919],{"class":1334}," 100\n",[1050,11921,11922],{"class":1052,"line":3149},[1050,11923,1682],{"class":1064},[1050,11925,11926],{"class":1052,"line":3155},[1050,11927,1086],{"class":1085},[1050,11929,11930,11932,11935,11937,11939],{"class":1052,"line":3196},[1050,11931,1102],{"class":1056},[1050,11933,11934],{"class":1105}," monitor_security_events",[1050,11936,2428],{"class":1064},[1050,11938,2432],{"class":2431},[1050,11940,2442],{"class":1064},[1050,11942,11943,11945,11948],{"class":1052,"line":3203},[1050,11944,1115],{"class":1071},[1050,11946,11947],{"class":1075},"Monitor and analyze security events",[1050,11949,1079],{"class":1071},[1050,11951,11952],{"class":1052,"line":3208},[1050,11953,1126],{"class":1085},[1050,11955,11956],{"class":1052,"line":3216},[1050,11957,11958],{"class":2330},"        # This would typically run as a background task\n",[1050,11960,11961,11964,11966],{"class":1052,"line":3243},[1050,11962,11963],{"class":1085},"        monitoring_queries ",[1050,11965,1135],{"class":1064},[1050,11967,1138],{"class":1064},[1050,11969,11970,11972,11975,11977,11979],{"class":1052,"line":3266},[1050,11971,1145],{"class":1144},[1050,11973,11974],{"class":1148},"failed_login_attempts",[1050,11976,1152],{"class":1144},[1050,11978,1155],{"class":1064},[1050,11980,1893],{"class":1144},[1050,11982,11983],{"class":1052,"line":3291},[1050,11984,11985],{"class":1148},"                SELECT ip_address, COUNT(*) as attempts\n",[1050,11987,11988],{"class":1052,"line":3310},[1050,11989,11990],{"class":1148},"                FROM security_log \n",[1050,11992,11993],{"class":1052,"line":3317},[1050,11994,11995],{"class":1148},"                WHERE event_type = 'failed_login' \n",[1050,11997,11998],{"class":1052,"line":3322},[1050,11999,12000],{"class":1148},"                AND timestamp > NOW() - INTERVAL 1 HOUR\n",[1050,12002,12003],{"class":1052,"line":3340},[1050,12004,12005],{"class":1148},"                GROUP BY ip_address\n",[1050,12007,12008,12011],{"class":1052,"line":3350},[1050,12009,12010],{"class":1148},"                HAVING attempts > ",[1050,12012,12013],{"class":2797},"%s\n",[1050,12015,12016,12018],{"class":1052,"line":3355},[1050,12017,2405],{"class":1144},[1050,12019,1181],{"class":1064},[1050,12021,12022,12024,12026,12028,12030],{"class":1052,"line":3386},[1050,12023,1145],{"class":1144},[1050,12025,11882],{"class":1148},[1050,12027,1152],{"class":1144},[1050,12029,1155],{"class":1064},[1050,12031,1893],{"class":1144},[1050,12033,12034],{"class":1052,"line":3415},[1050,12035,12036],{"class":1148},"                SELECT session_key, COUNT(*) as anomalies\n",[1050,12038,12039],{"class":1052,"line":3420},[1050,12040,11990],{"class":1148},[1050,12042,12043],{"class":1052,"line":3432},[1050,12044,12045],{"class":1148},"                WHERE event_type IN ('ip_change', 'ua_change', 'suspicious_activity')\n",[1050,12047,12048],{"class":1052,"line":3456},[1050,12049,12000],{"class":1148},[1050,12051,12052],{"class":1052,"line":3463},[1050,12053,12054],{"class":1148},"                GROUP BY session_key\n",[1050,12056,12057,12060],{"class":1052,"line":3468},[1050,12058,12059],{"class":1148},"                HAVING anomalies > ",[1050,12061,12013],{"class":2797},[1050,12063,12064,12066],{"class":1052,"line":3474},[1050,12065,2405],{"class":1144},[1050,12067,1181],{"class":1064},[1050,12069,12070,12072,12075,12077,12079],{"class":1052,"line":3498},[1050,12071,1145],{"class":1144},[1050,12073,12074],{"class":1148},"geographic_anomalies",[1050,12076,1152],{"class":1144},[1050,12078,1155],{"class":1064},[1050,12080,1893],{"class":1144},[1050,12082,12083],{"class":1052,"line":3503},[1050,12084,12085],{"class":1148},"                SELECT user_id, ip_address, location, timestamp\n",[1050,12087,12088],{"class":1052,"line":3525},[1050,12089,11990],{"class":1148},[1050,12091,12092],{"class":1052,"line":3535},[1050,12093,12094],{"class":1148},"                WHERE event_type = 'login'\n",[1050,12096,12097],{"class":1052,"line":3540},[1050,12098,12099],{"class":1148},"                AND timestamp > NOW() - INTERVAL 24 HOUR\n",[1050,12101,12102],{"class":1052,"line":3555},[1050,12103,12104],{"class":1148},"                ORDER BY user_id, timestamp\n",[1050,12106,12107],{"class":1052,"line":3562},[1050,12108,1976],{"class":1144},[1050,12110,12111],{"class":1052,"line":3567},[1050,12112,1682],{"class":1064},[1050,12114,12115],{"class":1052,"line":3573},[1050,12116,1126],{"class":1085},[1050,12118,12119,12121],{"class":1052,"line":3580},[1050,12120,1694],{"class":1693},[1050,12122,12123],{"class":1085}," monitoring_queries\n",[1050,12125,12126],{"class":1052,"line":3589},[1050,12127,1086],{"class":1085},[1050,12129,12130,12132,12135,12137,12139],{"class":1052,"line":3633},[1050,12131,1102],{"class":1056},[1050,12133,12134],{"class":1105}," generate_security_report",[1050,12136,2428],{"class":1064},[1050,12138,2432],{"class":2431},[1050,12140,2442],{"class":1064},[1050,12142,12143,12145,12148],{"class":1052,"line":3655},[1050,12144,1115],{"class":1071},[1050,12146,12147],{"class":1075},"Generate comprehensive security report",[1050,12149,1079],{"class":1071},[1050,12151,12152],{"class":1052,"line":3669},[1050,12153,1126],{"class":1085},[1050,12155,12156,12159,12161],{"class":1052,"line":3689},[1050,12157,12158],{"class":1085},"        report_sections ",[1050,12160,1135],{"class":1064},[1050,12162,1138],{"class":1064},[1050,12164,12165,12167,12170,12172,12174,12176,12179,12181],{"class":1052,"line":3696},[1050,12166,1145],{"class":1144},[1050,12168,12169],{"class":1148},"session_statistics",[1050,12171,1152],{"class":1144},[1050,12173,1155],{"class":1064},[1050,12175,1173],{"class":1144},[1050,12177,12178],{"class":1148},"Active sessions, average duration, geographic distribution",[1050,12180,1152],{"class":1144},[1050,12182,1181],{"class":1064},[1050,12184,12185,12187,12190,12192,12194,12196,12199,12201],{"class":1052,"line":3701},[1050,12186,1145],{"class":1144},[1050,12188,12189],{"class":1148},"security_events",[1050,12191,1152],{"class":1144},[1050,12193,1155],{"class":1064},[1050,12195,1173],{"class":1144},[1050,12197,12198],{"class":1148},"Failed logins, blocked requests, anomalies detected",[1050,12200,1152],{"class":1144},[1050,12202,1181],{"class":1064},[1050,12204,12205,12207,12210,12212,12214,12216,12219,12221],{"class":1052,"line":3719},[1050,12206,1145],{"class":1144},[1050,12208,12209],{"class":1148},"threat_analysis",[1050,12211,1152],{"class":1144},[1050,12213,1155],{"class":1064},[1050,12215,1173],{"class":1144},[1050,12217,12218],{"class":1148},"Attack patterns, source analysis, trend identification",[1050,12220,1152],{"class":1144},[1050,12222,1181],{"class":1064},[1050,12224,12225,12227,12230,12232,12234,12236,12239,12241],{"class":1052,"line":3728},[1050,12226,1145],{"class":1144},[1050,12228,12229],{"class":1148},"system_health",[1050,12231,1152],{"class":1144},[1050,12233,1155],{"class":1064},[1050,12235,1173],{"class":1144},[1050,12237,12238],{"class":1148},"Security system performance, alert response times",[1050,12240,1152],{"class":1144},[1050,12242,1181],{"class":1064},[1050,12244,12245,12247,12250,12252,12254,12256,12259],{"class":1052,"line":3733},[1050,12246,1145],{"class":1144},[1050,12248,12249],{"class":1148},"recommendations",[1050,12251,1152],{"class":1144},[1050,12253,1155],{"class":1064},[1050,12255,1173],{"class":1144},[1050,12257,12258],{"class":1148},"Security improvements, policy updates, system changes",[1050,12260,1265],{"class":1144},[1050,12262,12263],{"class":1052,"line":3767},[1050,12264,1682],{"class":1064},[1050,12266,12267],{"class":1052,"line":3796},[1050,12268,1126],{"class":1085},[1050,12270,12271,12273],{"class":1052,"line":3801},[1050,12272,1694],{"class":1693},[1050,12274,12275],{"class":1085}," report_sections\n",[1026,12277,12278],{},"Session security is a critical aspect of web application security. By implementing comprehensive security measures, monitoring systems, and following best practices, you can protect user sessions from various attack vectors and maintain the integrity of your application's authentication system.",[12280,12281,12282],"style",{},"html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .s27EL, html code.shiki .s27EL{--shiki-light:#91B859;--shiki-default:#AB5E3F;--shiki-dark:#C4704F}html pre.shiki code .sRJPX, html code.shiki .sRJPX{--shiki-light:#91B859;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sGuSu, html code.shiki .sGuSu{--shiki-light:#39ADB5;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1045,"searchDepth":1053,"depth":1068,"links":12284},[12285,12288,12291],{"id":1032,"depth":1068,"text":1033,"children":12286},[12287],{"id":1037,"depth":1082,"text":1038},{"id":6516,"depth":1068,"text":6517,"children":12289},[12290],{"id":6520,"depth":1082,"text":6521},{"id":10062,"depth":1068,"text":10063,"children":12292},[12293],{"id":10066,"depth":1082,"text":10067},"md",null,{},{"title":459,"description":1028},"8myolaibnWypCVpdwyWRRcZY9G7g5FuZnx2Ovw6axXU",[12300,12302],{"title":455,"path":456,"stem":457,"description":12301,"children":-1},"Django provides multiple backend options for storing session data on the server side. Each backend has different characteristics in terms of performance, persistence, scalability, and complexity. Understanding these options helps you choose the right storage mechanism for your application's needs.",{"title":463,"path":464,"stem":465,"description":12303,"children":-1},"Django provides powerful tools for handling file uploads, storage, and management. Whether you're dealing with user-uploaded images, documents, or any other file type, Django's file handling system offers flexibility, security, and scalability.",1772474932488]