[{"data":1,"prerenderedAt":14423},["ShallowReactive",2],{"navigation":3,"/forms-and-user-input/security-considerations-for-forms":1016,"/forms-and-user-input/security-considerations-for-forms-surround":14418},[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":250,"body":1018,"description":1028,"extension":14413,"links":14414,"meta":14415,"navigation":1176,"path":251,"seo":14416,"stem":252,"__hash__":14417},"docs/06.forms-and-user-input/10.security-considerations-for-forms.md",{"type":1019,"value":1020,"toc":14394},"minimark",[1021,1025,1029,1034,1039,2277,2281,2977,2981,2985,5661,5665,5669,7770,7774,9991,9995,9999,13131,13134,13138,14388,14391],[1022,1023,250],"h1",{"id":1024},"security-considerations-for-forms",[1026,1027,1028],"p",{},"Form security is critical for protecting applications from various attacks and ensuring data integrity. This chapter covers comprehensive security measures, from CSRF protection to input validation and advanced security patterns.",[1030,1031,1033],"h2",{"id":1032},"csrf-protection","CSRF Protection",[1035,1036,1038],"h3",{"id":1037},"understanding-and-implementing-csrf-protection","Understanding and Implementing CSRF Protection",[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","# settings.py - CSRF configuration\nMIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',  # CSRF middleware\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n]\n\n# CSRF settings\nCSRF_COOKIE_SECURE = True  # Use HTTPS only\nCSRF_COOKIE_HTTPONLY = True  # Prevent JavaScript access\nCSRF_COOKIE_SAMESITE = 'Strict'  # Strict same-site policy\nCSRF_COOKIE_AGE = 3600  # 1 hour expiration\nCSRF_USE_SESSIONS = False  # Use cookies instead of sessions\nCSRF_COOKIE_NAME = 'csrftoken'  # Custom cookie name\n\n# Trusted origins for CSRF\nCSRF_TRUSTED_ORIGINS = [\n    'https://yourdomain.com',\n    'https://api.yourdomain.com',\n]\n\n# views.py - CSRF protection in views\nfrom django.views.decorators.csrf import csrf_protect, csrf_exempt\nfrom django.utils.decorators import method_decorator\nfrom django.middleware.csrf import get_token\nfrom django.http import JsonResponse\n\n@csrf_protect\ndef secure_form_view(request):\n    \"\"\"View with explicit CSRF protection\"\"\"\n    if request.method == 'POST':\n        form = SecureForm(request.POST)\n        if form.is_valid():\n            # Process form securely\n            process_secure_data(form.cleaned_data)\n            return redirect('success')\n    else:\n        form = SecureForm()\n    \n    return render(request, 'secure_form.html', {\n        'form': form,\n        'csrf_token': get_token(request)\n    })\n\n@method_decorator(csrf_protect, name='dispatch')\nclass SecureFormView(View):\n    \"\"\"Class-based view with CSRF protection\"\"\"\n    \n    def get(self, request):\n        form = SecureForm()\n        return render(request, 'secure_form.html', {'form': form})\n    \n    def post(self, request):\n        form = SecureForm(request.POST)\n        if form.is_valid():\n            self.process_form(form)\n            return JsonResponse({'success': True})\n        return JsonResponse({'errors': form.errors}, status=400)\n\n# AJAX CSRF handling\ndef get_csrf_token(request):\n    \"\"\"API endpoint to get CSRF token for AJAX\"\"\"\n    return JsonResponse({'csrf_token': get_token(request)})\n\n# JavaScript CSRF handling\n\"\"\"\n// static/js/csrf.js\nfunction getCSRFToken() {\n    const cookies = document.cookie.split(';');\n    for (let cookie of cookies) {\n        const [name, value] = cookie.trim().split('=');\n        if (name === 'csrftoken') {\n            return decodeURIComponent(value);\n        }\n    }\n    return null;\n}\n\n// Setup CSRF for all AJAX requests\nfunction setupCSRF() {\n    const csrfToken = getCSRFToken();\n    \n    // jQuery setup\n    if (typeof $ !== 'undefined') {\n        $.ajaxSetup({\n            beforeSend: function(xhr, settings) {\n                if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {\n                    xhr.setRequestHeader(\"X-CSRFToken\", csrfToken);\n                }\n            }\n        });\n    }\n    \n    // Fetch API setup\n    const originalFetch = window.fetch;\n    window.fetch = function(url, options = {}) {\n        if (options.method && !/^(GET|HEAD|OPTIONS|TRACE)$/i.test(options.method)) {\n            options.headers = options.headers || {};\n            options.headers['X-CSRFToken'] = csrfToken;\n        }\n        return originalFetch(url, options);\n    };\n}\n\ndocument.addEventListener('DOMContentLoaded', setupCSRF);\n\"\"\"\n","python","",[1047,1048,1049,1058,1072,1089,1101,1113,1129,1141,1153,1165,1171,1178,1184,1199,1212,1231,1246,1260,1278,1283,1289,1299,1311,1323,1328,1333,1339,1377,1399,1420,1437,1442,1452,1472,1486,1515,1540,1557,1563,1581,1601,1609,1621,1627,1654,1671,1692,1698,1703,1733,1751,1761,1766,1787,1798,1836,1841,1859,1878,1891,1908,1931,1968,1973,1979,1993,2003,2029,2034,2040,2045,2051,2057,2063,2069,2075,2081,2087,2093,2099,2105,2111,2116,2122,2128,2134,2139,2145,2151,2157,2163,2169,2175,2181,2187,2193,2198,2203,2209,2215,2221,2227,2233,2239,2244,2250,2256,2261,2266,2272],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# settings.py - CSRF configuration\n",[1050,1059,1061,1065,1069],{"class":1052,"line":1060},2,[1050,1062,1064],{"class":1063},"se3Ec","MIDDLEWARE",[1050,1066,1068],{"class":1067},"soVBu"," =",[1050,1070,1071],{"class":1067}," [\n",[1050,1073,1075,1079,1083,1086],{"class":1052,"line":1074},3,[1050,1076,1078],{"class":1077},"sbYkP","    '",[1050,1080,1082],{"class":1081},"sTbE_","django.middleware.security.SecurityMiddleware",[1050,1084,1085],{"class":1077},"'",[1050,1087,1088],{"class":1067},",\n",[1050,1090,1092,1094,1097,1099],{"class":1052,"line":1091},4,[1050,1093,1078],{"class":1077},[1050,1095,1096],{"class":1081},"django.contrib.sessions.middleware.SessionMiddleware",[1050,1098,1085],{"class":1077},[1050,1100,1088],{"class":1067},[1050,1102,1104,1106,1109,1111],{"class":1052,"line":1103},5,[1050,1105,1078],{"class":1077},[1050,1107,1108],{"class":1081},"django.middleware.common.CommonMiddleware",[1050,1110,1085],{"class":1077},[1050,1112,1088],{"class":1067},[1050,1114,1116,1118,1121,1123,1126],{"class":1052,"line":1115},6,[1050,1117,1078],{"class":1077},[1050,1119,1120],{"class":1081},"django.middleware.csrf.CsrfViewMiddleware",[1050,1122,1085],{"class":1077},[1050,1124,1125],{"class":1067},",",[1050,1127,1128],{"class":1056},"  # CSRF middleware\n",[1050,1130,1132,1134,1137,1139],{"class":1052,"line":1131},7,[1050,1133,1078],{"class":1077},[1050,1135,1136],{"class":1081},"django.contrib.auth.middleware.AuthenticationMiddleware",[1050,1138,1085],{"class":1077},[1050,1140,1088],{"class":1067},[1050,1142,1144,1146,1149,1151],{"class":1052,"line":1143},8,[1050,1145,1078],{"class":1077},[1050,1147,1148],{"class":1081},"django.contrib.messages.middleware.MessageMiddleware",[1050,1150,1085],{"class":1077},[1050,1152,1088],{"class":1067},[1050,1154,1156,1158,1161,1163],{"class":1052,"line":1155},9,[1050,1157,1078],{"class":1077},[1050,1159,1160],{"class":1081},"django.middleware.clickjacking.XFrameOptionsMiddleware",[1050,1162,1085],{"class":1077},[1050,1164,1088],{"class":1067},[1050,1166,1168],{"class":1052,"line":1167},10,[1050,1169,1170],{"class":1067},"]\n",[1050,1172,1174],{"class":1052,"line":1173},11,[1050,1175,1177],{"emptyLinePlaceholder":1176},true,"\n",[1050,1179,1181],{"class":1052,"line":1180},12,[1050,1182,1183],{"class":1056},"# CSRF settings\n",[1050,1185,1187,1190,1192,1196],{"class":1052,"line":1186},13,[1050,1188,1189],{"class":1063},"CSRF_COOKIE_SECURE",[1050,1191,1068],{"class":1067},[1050,1193,1195],{"class":1194},"s8XtY"," True",[1050,1197,1198],{"class":1056},"  # Use HTTPS only\n",[1050,1200,1202,1205,1207,1209],{"class":1052,"line":1201},14,[1050,1203,1204],{"class":1063},"CSRF_COOKIE_HTTPONLY",[1050,1206,1068],{"class":1067},[1050,1208,1195],{"class":1194},[1050,1210,1211],{"class":1056},"  # Prevent JavaScript access\n",[1050,1213,1215,1218,1220,1223,1226,1228],{"class":1052,"line":1214},15,[1050,1216,1217],{"class":1063},"CSRF_COOKIE_SAMESITE",[1050,1219,1068],{"class":1067},[1050,1221,1222],{"class":1077}," '",[1050,1224,1225],{"class":1081},"Strict",[1050,1227,1085],{"class":1077},[1050,1229,1230],{"class":1056},"  # Strict same-site policy\n",[1050,1232,1234,1237,1239,1243],{"class":1052,"line":1233},16,[1050,1235,1236],{"class":1063},"CSRF_COOKIE_AGE",[1050,1238,1068],{"class":1067},[1050,1240,1242],{"class":1241},"s7CZa"," 3600",[1050,1244,1245],{"class":1056},"  # 1 hour expiration\n",[1050,1247,1249,1252,1254,1257],{"class":1052,"line":1248},17,[1050,1250,1251],{"class":1063},"CSRF_USE_SESSIONS",[1050,1253,1068],{"class":1067},[1050,1255,1256],{"class":1194}," False",[1050,1258,1259],{"class":1056},"  # Use cookies instead of sessions\n",[1050,1261,1263,1266,1268,1270,1273,1275],{"class":1052,"line":1262},18,[1050,1264,1265],{"class":1063},"CSRF_COOKIE_NAME",[1050,1267,1068],{"class":1067},[1050,1269,1222],{"class":1077},[1050,1271,1272],{"class":1081},"csrftoken",[1050,1274,1085],{"class":1077},[1050,1276,1277],{"class":1056},"  # Custom cookie name\n",[1050,1279,1281],{"class":1052,"line":1280},19,[1050,1282,1177],{"emptyLinePlaceholder":1176},[1050,1284,1286],{"class":1052,"line":1285},20,[1050,1287,1288],{"class":1056},"# Trusted origins for CSRF\n",[1050,1290,1292,1295,1297],{"class":1052,"line":1291},21,[1050,1293,1294],{"class":1063},"CSRF_TRUSTED_ORIGINS",[1050,1296,1068],{"class":1067},[1050,1298,1071],{"class":1067},[1050,1300,1302,1304,1307,1309],{"class":1052,"line":1301},22,[1050,1303,1078],{"class":1077},[1050,1305,1306],{"class":1081},"https://yourdomain.com",[1050,1308,1085],{"class":1077},[1050,1310,1088],{"class":1067},[1050,1312,1314,1316,1319,1321],{"class":1052,"line":1313},23,[1050,1315,1078],{"class":1077},[1050,1317,1318],{"class":1081},"https://api.yourdomain.com",[1050,1320,1085],{"class":1077},[1050,1322,1088],{"class":1067},[1050,1324,1326],{"class":1052,"line":1325},24,[1050,1327,1170],{"class":1067},[1050,1329,1331],{"class":1052,"line":1330},25,[1050,1332,1177],{"emptyLinePlaceholder":1176},[1050,1334,1336],{"class":1052,"line":1335},26,[1050,1337,1338],{"class":1056},"# views.py - CSRF protection in views\n",[1050,1340,1342,1346,1350,1353,1356,1358,1361,1363,1366,1369,1372,1374],{"class":1052,"line":1341},27,[1050,1343,1345],{"class":1344},"siDh9","from",[1050,1347,1349],{"class":1348},"sftqT"," django",[1050,1351,1352],{"class":1067},".",[1050,1354,1355],{"class":1348},"views",[1050,1357,1352],{"class":1067},[1050,1359,1360],{"class":1348},"decorators",[1050,1362,1352],{"class":1067},[1050,1364,1365],{"class":1348},"csrf ",[1050,1367,1368],{"class":1344},"import",[1050,1370,1371],{"class":1348}," csrf_protect",[1050,1373,1125],{"class":1067},[1050,1375,1376],{"class":1348}," csrf_exempt\n",[1050,1378,1380,1382,1384,1386,1389,1391,1394,1396],{"class":1052,"line":1379},28,[1050,1381,1345],{"class":1344},[1050,1383,1349],{"class":1348},[1050,1385,1352],{"class":1067},[1050,1387,1388],{"class":1348},"utils",[1050,1390,1352],{"class":1067},[1050,1392,1393],{"class":1348},"decorators ",[1050,1395,1368],{"class":1344},[1050,1397,1398],{"class":1348}," method_decorator\n",[1050,1400,1402,1404,1406,1408,1411,1413,1415,1417],{"class":1052,"line":1401},29,[1050,1403,1345],{"class":1344},[1050,1405,1349],{"class":1348},[1050,1407,1352],{"class":1067},[1050,1409,1410],{"class":1348},"middleware",[1050,1412,1352],{"class":1067},[1050,1414,1365],{"class":1348},[1050,1416,1368],{"class":1344},[1050,1418,1419],{"class":1348}," get_token\n",[1050,1421,1423,1425,1427,1429,1432,1434],{"class":1052,"line":1422},30,[1050,1424,1345],{"class":1344},[1050,1426,1349],{"class":1348},[1050,1428,1352],{"class":1067},[1050,1430,1431],{"class":1348},"http ",[1050,1433,1368],{"class":1344},[1050,1435,1436],{"class":1348}," JsonResponse\n",[1050,1438,1440],{"class":1052,"line":1439},31,[1050,1441,1177],{"emptyLinePlaceholder":1176},[1050,1443,1445,1448],{"class":1052,"line":1444},32,[1050,1446,1447],{"class":1067},"@",[1050,1449,1451],{"class":1450},"sljsM","csrf_protect\n",[1050,1453,1455,1459,1462,1465,1469],{"class":1052,"line":1454},33,[1050,1456,1458],{"class":1457},"s5Kfy","def",[1050,1460,1461],{"class":1450}," secure_form_view",[1050,1463,1464],{"class":1067},"(",[1050,1466,1468],{"class":1467},"sCyAa","request",[1050,1470,1471],{"class":1067},"):\n",[1050,1473,1475,1479,1483],{"class":1052,"line":1474},34,[1050,1476,1478],{"class":1477},"sm7ve","    \"\"\"",[1050,1480,1482],{"class":1481},"sVyVU","View with explicit CSRF protection",[1050,1484,1485],{"class":1477},"\"\"\"\n",[1050,1487,1489,1492,1495,1497,1501,1505,1507,1510,1512],{"class":1052,"line":1488},35,[1050,1490,1491],{"class":1344},"    if",[1050,1493,1494],{"class":1348}," request",[1050,1496,1352],{"class":1067},[1050,1498,1500],{"class":1499},"sBPpx","method",[1050,1502,1504],{"class":1503},"sVsLi"," ==",[1050,1506,1222],{"class":1077},[1050,1508,1509],{"class":1081},"POST",[1050,1511,1085],{"class":1077},[1050,1513,1514],{"class":1067},":\n",[1050,1516,1518,1521,1524,1528,1530,1532,1534,1537],{"class":1052,"line":1517},36,[1050,1519,1520],{"class":1348},"        form ",[1050,1522,1523],{"class":1067},"=",[1050,1525,1527],{"class":1526},"siWMO"," SecureForm",[1050,1529,1464],{"class":1067},[1050,1531,1468],{"class":1526},[1050,1533,1352],{"class":1067},[1050,1535,1509],{"class":1536},"sFGJz",[1050,1538,1539],{"class":1067},")\n",[1050,1541,1543,1546,1549,1551,1554],{"class":1052,"line":1542},37,[1050,1544,1545],{"class":1344},"        if",[1050,1547,1548],{"class":1348}," form",[1050,1550,1352],{"class":1067},[1050,1552,1553],{"class":1526},"is_valid",[1050,1555,1556],{"class":1067},"():\n",[1050,1558,1560],{"class":1052,"line":1559},38,[1050,1561,1562],{"class":1056},"            # Process form securely\n",[1050,1564,1566,1569,1571,1574,1576,1579],{"class":1052,"line":1565},39,[1050,1567,1568],{"class":1526},"            process_secure_data",[1050,1570,1464],{"class":1067},[1050,1572,1573],{"class":1526},"form",[1050,1575,1352],{"class":1067},[1050,1577,1578],{"class":1499},"cleaned_data",[1050,1580,1539],{"class":1067},[1050,1582,1584,1587,1590,1592,1594,1597,1599],{"class":1052,"line":1583},40,[1050,1585,1586],{"class":1344},"            return",[1050,1588,1589],{"class":1526}," redirect",[1050,1591,1464],{"class":1067},[1050,1593,1085],{"class":1077},[1050,1595,1596],{"class":1081},"success",[1050,1598,1085],{"class":1077},[1050,1600,1539],{"class":1067},[1050,1602,1604,1607],{"class":1052,"line":1603},41,[1050,1605,1606],{"class":1344},"    else",[1050,1608,1514],{"class":1067},[1050,1610,1612,1614,1616,1618],{"class":1052,"line":1611},42,[1050,1613,1520],{"class":1348},[1050,1615,1523],{"class":1067},[1050,1617,1527],{"class":1526},[1050,1619,1620],{"class":1067},"()\n",[1050,1622,1624],{"class":1052,"line":1623},43,[1050,1625,1626],{"class":1348},"    \n",[1050,1628,1630,1633,1636,1638,1640,1642,1644,1647,1649,1651],{"class":1052,"line":1629},44,[1050,1631,1632],{"class":1344},"    return",[1050,1634,1635],{"class":1526}," render",[1050,1637,1464],{"class":1067},[1050,1639,1468],{"class":1526},[1050,1641,1125],{"class":1067},[1050,1643,1222],{"class":1077},[1050,1645,1646],{"class":1081},"secure_form.html",[1050,1648,1085],{"class":1077},[1050,1650,1125],{"class":1067},[1050,1652,1653],{"class":1067}," {\n",[1050,1655,1657,1660,1662,1664,1667,1669],{"class":1052,"line":1656},45,[1050,1658,1659],{"class":1077},"        '",[1050,1661,1573],{"class":1081},[1050,1663,1085],{"class":1077},[1050,1665,1666],{"class":1067},":",[1050,1668,1548],{"class":1526},[1050,1670,1088],{"class":1067},[1050,1672,1674,1676,1679,1681,1683,1686,1688,1690],{"class":1052,"line":1673},46,[1050,1675,1659],{"class":1077},[1050,1677,1678],{"class":1081},"csrf_token",[1050,1680,1085],{"class":1077},[1050,1682,1666],{"class":1067},[1050,1684,1685],{"class":1526}," get_token",[1050,1687,1464],{"class":1067},[1050,1689,1468],{"class":1526},[1050,1691,1539],{"class":1067},[1050,1693,1695],{"class":1052,"line":1694},47,[1050,1696,1697],{"class":1067},"    })\n",[1050,1699,1701],{"class":1052,"line":1700},48,[1050,1702,1177],{"emptyLinePlaceholder":1176},[1050,1704,1706,1708,1711,1713,1716,1718,1722,1724,1726,1729,1731],{"class":1052,"line":1705},49,[1050,1707,1447],{"class":1067},[1050,1709,1710],{"class":1450},"method_decorator",[1050,1712,1464],{"class":1067},[1050,1714,1715],{"class":1526},"csrf_protect",[1050,1717,1125],{"class":1067},[1050,1719,1721],{"class":1720},"sqOPj"," name",[1050,1723,1523],{"class":1067},[1050,1725,1085],{"class":1077},[1050,1727,1728],{"class":1081},"dispatch",[1050,1730,1085],{"class":1077},[1050,1732,1539],{"class":1067},[1050,1734,1736,1739,1743,1745,1749],{"class":1052,"line":1735},50,[1050,1737,1738],{"class":1457},"class",[1050,1740,1742],{"class":1741},"sD-vU"," SecureFormView",[1050,1744,1464],{"class":1067},[1050,1746,1748],{"class":1747},"sYn-s","View",[1050,1750,1471],{"class":1067},[1050,1752,1754,1756,1759],{"class":1052,"line":1753},51,[1050,1755,1478],{"class":1477},[1050,1757,1758],{"class":1481},"Class-based view with CSRF protection",[1050,1760,1485],{"class":1477},[1050,1762,1764],{"class":1052,"line":1763},52,[1050,1765,1626],{"class":1348},[1050,1767,1769,1772,1775,1777,1781,1783,1785],{"class":1052,"line":1768},53,[1050,1770,1771],{"class":1457},"    def",[1050,1773,1774],{"class":1450}," get",[1050,1776,1464],{"class":1067},[1050,1778,1780],{"class":1779},"sRjD_","self",[1050,1782,1125],{"class":1067},[1050,1784,1494],{"class":1467},[1050,1786,1471],{"class":1067},[1050,1788,1790,1792,1794,1796],{"class":1052,"line":1789},54,[1050,1791,1520],{"class":1348},[1050,1793,1523],{"class":1067},[1050,1795,1527],{"class":1526},[1050,1797,1620],{"class":1067},[1050,1799,1801,1804,1806,1808,1810,1812,1814,1816,1818,1820,1823,1825,1827,1829,1831,1833],{"class":1052,"line":1800},55,[1050,1802,1803],{"class":1344},"        return",[1050,1805,1635],{"class":1526},[1050,1807,1464],{"class":1067},[1050,1809,1468],{"class":1526},[1050,1811,1125],{"class":1067},[1050,1813,1222],{"class":1077},[1050,1815,1646],{"class":1081},[1050,1817,1085],{"class":1077},[1050,1819,1125],{"class":1067},[1050,1821,1822],{"class":1067}," {",[1050,1824,1085],{"class":1077},[1050,1826,1573],{"class":1081},[1050,1828,1085],{"class":1077},[1050,1830,1666],{"class":1067},[1050,1832,1548],{"class":1526},[1050,1834,1835],{"class":1067},"})\n",[1050,1837,1839],{"class":1052,"line":1838},56,[1050,1840,1626],{"class":1348},[1050,1842,1844,1846,1849,1851,1853,1855,1857],{"class":1052,"line":1843},57,[1050,1845,1771],{"class":1457},[1050,1847,1848],{"class":1450}," post",[1050,1850,1464],{"class":1067},[1050,1852,1780],{"class":1779},[1050,1854,1125],{"class":1067},[1050,1856,1494],{"class":1467},[1050,1858,1471],{"class":1067},[1050,1860,1862,1864,1866,1868,1870,1872,1874,1876],{"class":1052,"line":1861},58,[1050,1863,1520],{"class":1348},[1050,1865,1523],{"class":1067},[1050,1867,1527],{"class":1526},[1050,1869,1464],{"class":1067},[1050,1871,1468],{"class":1526},[1050,1873,1352],{"class":1067},[1050,1875,1509],{"class":1536},[1050,1877,1539],{"class":1067},[1050,1879,1881,1883,1885,1887,1889],{"class":1052,"line":1880},59,[1050,1882,1545],{"class":1344},[1050,1884,1548],{"class":1348},[1050,1886,1352],{"class":1067},[1050,1888,1553],{"class":1526},[1050,1890,1556],{"class":1067},[1050,1892,1894,1897,1899,1902,1904,1906],{"class":1052,"line":1893},60,[1050,1895,1896],{"class":1063},"            self",[1050,1898,1352],{"class":1067},[1050,1900,1901],{"class":1526},"process_form",[1050,1903,1464],{"class":1067},[1050,1905,1573],{"class":1526},[1050,1907,1539],{"class":1067},[1050,1909,1911,1913,1916,1919,1921,1923,1925,1927,1929],{"class":1052,"line":1910},61,[1050,1912,1586],{"class":1344},[1050,1914,1915],{"class":1526}," JsonResponse",[1050,1917,1918],{"class":1067},"({",[1050,1920,1085],{"class":1077},[1050,1922,1596],{"class":1081},[1050,1924,1085],{"class":1077},[1050,1926,1666],{"class":1067},[1050,1928,1195],{"class":1194},[1050,1930,1835],{"class":1067},[1050,1932,1934,1936,1938,1940,1942,1945,1947,1949,1951,1953,1955,1958,1961,1963,1966],{"class":1052,"line":1933},62,[1050,1935,1803],{"class":1344},[1050,1937,1915],{"class":1526},[1050,1939,1918],{"class":1067},[1050,1941,1085],{"class":1077},[1050,1943,1944],{"class":1081},"errors",[1050,1946,1085],{"class":1077},[1050,1948,1666],{"class":1067},[1050,1950,1548],{"class":1526},[1050,1952,1352],{"class":1067},[1050,1954,1944],{"class":1499},[1050,1956,1957],{"class":1067},"},",[1050,1959,1960],{"class":1720}," status",[1050,1962,1523],{"class":1067},[1050,1964,1965],{"class":1241},"400",[1050,1967,1539],{"class":1067},[1050,1969,1971],{"class":1052,"line":1970},63,[1050,1972,1177],{"emptyLinePlaceholder":1176},[1050,1974,1976],{"class":1052,"line":1975},64,[1050,1977,1978],{"class":1056},"# AJAX CSRF handling\n",[1050,1980,1982,1984,1987,1989,1991],{"class":1052,"line":1981},65,[1050,1983,1458],{"class":1457},[1050,1985,1986],{"class":1450}," get_csrf_token",[1050,1988,1464],{"class":1067},[1050,1990,1468],{"class":1467},[1050,1992,1471],{"class":1067},[1050,1994,1996,1998,2001],{"class":1052,"line":1995},66,[1050,1997,1478],{"class":1477},[1050,1999,2000],{"class":1481},"API endpoint to get CSRF token for AJAX",[1050,2002,1485],{"class":1477},[1050,2004,2006,2008,2010,2012,2014,2016,2018,2020,2022,2024,2026],{"class":1052,"line":2005},67,[1050,2007,1632],{"class":1344},[1050,2009,1915],{"class":1526},[1050,2011,1918],{"class":1067},[1050,2013,1085],{"class":1077},[1050,2015,1678],{"class":1081},[1050,2017,1085],{"class":1077},[1050,2019,1666],{"class":1067},[1050,2021,1685],{"class":1526},[1050,2023,1464],{"class":1067},[1050,2025,1468],{"class":1526},[1050,2027,2028],{"class":1067},")})\n",[1050,2030,2032],{"class":1052,"line":2031},68,[1050,2033,1177],{"emptyLinePlaceholder":1176},[1050,2035,2037],{"class":1052,"line":2036},69,[1050,2038,2039],{"class":1056},"# JavaScript CSRF handling\n",[1050,2041,2043],{"class":1052,"line":2042},70,[1050,2044,1485],{"class":1477},[1050,2046,2048],{"class":1052,"line":2047},71,[1050,2049,2050],{"class":1481},"// static/js/csrf.js\n",[1050,2052,2054],{"class":1052,"line":2053},72,[1050,2055,2056],{"class":1481},"function getCSRFToken() {\n",[1050,2058,2060],{"class":1052,"line":2059},73,[1050,2061,2062],{"class":1481},"    const cookies = document.cookie.split(';');\n",[1050,2064,2066],{"class":1052,"line":2065},74,[1050,2067,2068],{"class":1481},"    for (let cookie of cookies) {\n",[1050,2070,2072],{"class":1052,"line":2071},75,[1050,2073,2074],{"class":1481},"        const [name, value] = cookie.trim().split('=');\n",[1050,2076,2078],{"class":1052,"line":2077},76,[1050,2079,2080],{"class":1481},"        if (name === 'csrftoken') {\n",[1050,2082,2084],{"class":1052,"line":2083},77,[1050,2085,2086],{"class":1481},"            return decodeURIComponent(value);\n",[1050,2088,2090],{"class":1052,"line":2089},78,[1050,2091,2092],{"class":1481},"        }\n",[1050,2094,2096],{"class":1052,"line":2095},79,[1050,2097,2098],{"class":1481},"    }\n",[1050,2100,2102],{"class":1052,"line":2101},80,[1050,2103,2104],{"class":1481},"    return null;\n",[1050,2106,2108],{"class":1052,"line":2107},81,[1050,2109,2110],{"class":1481},"}\n",[1050,2112,2114],{"class":1052,"line":2113},82,[1050,2115,1177],{"emptyLinePlaceholder":1176},[1050,2117,2119],{"class":1052,"line":2118},83,[1050,2120,2121],{"class":1481},"// Setup CSRF for all AJAX requests\n",[1050,2123,2125],{"class":1052,"line":2124},84,[1050,2126,2127],{"class":1481},"function setupCSRF() {\n",[1050,2129,2131],{"class":1052,"line":2130},85,[1050,2132,2133],{"class":1481},"    const csrfToken = getCSRFToken();\n",[1050,2135,2137],{"class":1052,"line":2136},86,[1050,2138,1626],{"class":1481},[1050,2140,2142],{"class":1052,"line":2141},87,[1050,2143,2144],{"class":1481},"    // jQuery setup\n",[1050,2146,2148],{"class":1052,"line":2147},88,[1050,2149,2150],{"class":1481},"    if (typeof $ !== 'undefined') {\n",[1050,2152,2154],{"class":1052,"line":2153},89,[1050,2155,2156],{"class":1481},"        $.ajaxSetup({\n",[1050,2158,2160],{"class":1052,"line":2159},90,[1050,2161,2162],{"class":1481},"            beforeSend: function(xhr, settings) {\n",[1050,2164,2166],{"class":1052,"line":2165},91,[1050,2167,2168],{"class":1481},"                if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {\n",[1050,2170,2172],{"class":1052,"line":2171},92,[1050,2173,2174],{"class":1481},"                    xhr.setRequestHeader(\"X-CSRFToken\", csrfToken);\n",[1050,2176,2178],{"class":1052,"line":2177},93,[1050,2179,2180],{"class":1481},"                }\n",[1050,2182,2184],{"class":1052,"line":2183},94,[1050,2185,2186],{"class":1481},"            }\n",[1050,2188,2190],{"class":1052,"line":2189},95,[1050,2191,2192],{"class":1481},"        });\n",[1050,2194,2196],{"class":1052,"line":2195},96,[1050,2197,2098],{"class":1481},[1050,2199,2201],{"class":1052,"line":2200},97,[1050,2202,1626],{"class":1481},[1050,2204,2206],{"class":1052,"line":2205},98,[1050,2207,2208],{"class":1481},"    // Fetch API setup\n",[1050,2210,2212],{"class":1052,"line":2211},99,[1050,2213,2214],{"class":1481},"    const originalFetch = window.fetch;\n",[1050,2216,2218],{"class":1052,"line":2217},100,[1050,2219,2220],{"class":1481},"    window.fetch = function(url, options = {}) {\n",[1050,2222,2224],{"class":1052,"line":2223},101,[1050,2225,2226],{"class":1481},"        if (options.method && !/^(GET|HEAD|OPTIONS|TRACE)$/i.test(options.method)) {\n",[1050,2228,2230],{"class":1052,"line":2229},102,[1050,2231,2232],{"class":1481},"            options.headers = options.headers || {};\n",[1050,2234,2236],{"class":1052,"line":2235},103,[1050,2237,2238],{"class":1481},"            options.headers['X-CSRFToken'] = csrfToken;\n",[1050,2240,2242],{"class":1052,"line":2241},104,[1050,2243,2092],{"class":1481},[1050,2245,2247],{"class":1052,"line":2246},105,[1050,2248,2249],{"class":1481},"        return originalFetch(url, options);\n",[1050,2251,2253],{"class":1052,"line":2252},106,[1050,2254,2255],{"class":1481},"    };\n",[1050,2257,2259],{"class":1052,"line":2258},107,[1050,2260,2110],{"class":1481},[1050,2262,2264],{"class":1052,"line":2263},108,[1050,2265,1177],{"emptyLinePlaceholder":1176},[1050,2267,2269],{"class":1052,"line":2268},109,[1050,2270,2271],{"class":1481},"document.addEventListener('DOMContentLoaded', setupCSRF);\n",[1050,2273,2275],{"class":1052,"line":2274},110,[1050,2276,1485],{"class":1477},[1035,2278,2280],{"id":2279},"custom-csrf-validation","Custom CSRF Validation",[1040,2282,2284],{"className":1042,"code":2283,"language":1044,"meta":1045,"style":1045},"# forms.py - Custom CSRF validation\nfrom django import forms\nfrom django.middleware.csrf import get_token\nfrom django.core.exceptions import ValidationError\n\nclass CSRFValidatedForm(forms.Form):\n    \"\"\"Form with additional CSRF validation\"\"\"\n    \n    csrf_token = forms.CharField(widget=forms.HiddenInput(), required=False)\n    \n    def __init__(self, request=None, *args, **kwargs):\n        self.request = request\n        super().__init__(*args, **kwargs)\n        \n        if request:\n            self.fields['csrf_token'].initial = get_token(request)\n    \n    def clean_csrf_token(self):\n        \"\"\"Additional CSRF token validation\"\"\"\n        token = self.cleaned_data.get('csrf_token')\n        \n        if self.request:\n            expected_token = get_token(self.request)\n            if token != expected_token:\n                raise ValidationError('CSRF token mismatch.')\n        \n        return token\n\n# Custom CSRF failure handling\ndef csrf_failure_view(request, reason=\"\"):\n    \"\"\"Custom CSRF failure response\"\"\"\n    context = {\n        'reason': reason,\n        'request_path': request.path,\n        'referer': request.META.get('HTTP_REFERER', ''),\n    }\n    \n    if request.headers.get('X-Requested-With') == 'XMLHttpRequest':\n        return JsonResponse({\n            'error': 'CSRF verification failed',\n            'reason': reason\n        }, status=403)\n    \n    return render(request, 'csrf_failure.html', context, status=403)\n\n# settings.py\nCSRF_FAILURE_VIEW = 'myapp.views.csrf_failure_view'\n",[1047,2285,2286,2291,2303,2321,2342,2346,2365,2374,2378,2420,2424,2463,2477,2504,2509,2517,2551,2555,2568,2578,2607,2611,2623,2642,2658,2677,2681,2688,2692,2697,2720,2729,2738,2753,2773,2812,2816,2820,2858,2867,2888,2901,2915,2919,2953,2957,2962],{"__ignoreMap":1045},[1050,2287,2288],{"class":1052,"line":1053},[1050,2289,2290],{"class":1056},"# forms.py - Custom CSRF validation\n",[1050,2292,2293,2295,2298,2300],{"class":1052,"line":1060},[1050,2294,1345],{"class":1344},[1050,2296,2297],{"class":1348}," django ",[1050,2299,1368],{"class":1344},[1050,2301,2302],{"class":1348}," forms\n",[1050,2304,2305,2307,2309,2311,2313,2315,2317,2319],{"class":1052,"line":1074},[1050,2306,1345],{"class":1344},[1050,2308,1349],{"class":1348},[1050,2310,1352],{"class":1067},[1050,2312,1410],{"class":1348},[1050,2314,1352],{"class":1067},[1050,2316,1365],{"class":1348},[1050,2318,1368],{"class":1344},[1050,2320,1419],{"class":1348},[1050,2322,2323,2325,2327,2329,2332,2334,2337,2339],{"class":1052,"line":1091},[1050,2324,1345],{"class":1344},[1050,2326,1349],{"class":1348},[1050,2328,1352],{"class":1067},[1050,2330,2331],{"class":1348},"core",[1050,2333,1352],{"class":1067},[1050,2335,2336],{"class":1348},"exceptions ",[1050,2338,1368],{"class":1344},[1050,2340,2341],{"class":1348}," ValidationError\n",[1050,2343,2344],{"class":1052,"line":1103},[1050,2345,1177],{"emptyLinePlaceholder":1176},[1050,2347,2348,2350,2353,2355,2358,2360,2363],{"class":1052,"line":1115},[1050,2349,1738],{"class":1457},[1050,2351,2352],{"class":1741}," CSRFValidatedForm",[1050,2354,1464],{"class":1067},[1050,2356,2357],{"class":1747},"forms",[1050,2359,1352],{"class":1067},[1050,2361,2362],{"class":1747},"Form",[1050,2364,1471],{"class":1067},[1050,2366,2367,2369,2372],{"class":1052,"line":1131},[1050,2368,1478],{"class":1477},[1050,2370,2371],{"class":1481},"Form with additional CSRF validation",[1050,2373,1485],{"class":1477},[1050,2375,2376],{"class":1052,"line":1143},[1050,2377,1626],{"class":1348},[1050,2379,2380,2383,2385,2388,2390,2393,2395,2398,2400,2402,2404,2407,2410,2413,2415,2418],{"class":1052,"line":1155},[1050,2381,2382],{"class":1348},"    csrf_token ",[1050,2384,1523],{"class":1067},[1050,2386,2387],{"class":1348}," forms",[1050,2389,1352],{"class":1067},[1050,2391,2392],{"class":1526},"CharField",[1050,2394,1464],{"class":1067},[1050,2396,2397],{"class":1720},"widget",[1050,2399,1523],{"class":1067},[1050,2401,2357],{"class":1526},[1050,2403,1352],{"class":1067},[1050,2405,2406],{"class":1526},"HiddenInput",[1050,2408,2409],{"class":1067},"(),",[1050,2411,2412],{"class":1720}," required",[1050,2414,1523],{"class":1067},[1050,2416,2417],{"class":1194},"False",[1050,2419,1539],{"class":1067},[1050,2421,2422],{"class":1052,"line":1167},[1050,2423,1626],{"class":1348},[1050,2425,2426,2428,2432,2434,2436,2438,2440,2442,2445,2447,2450,2453,2455,2458,2461],{"class":1052,"line":1173},[1050,2427,1771],{"class":1457},[1050,2429,2431],{"class":2430},"sJdAF"," __init__",[1050,2433,1464],{"class":1067},[1050,2435,1780],{"class":1779},[1050,2437,1125],{"class":1067},[1050,2439,1494],{"class":1467},[1050,2441,1523],{"class":1503},[1050,2443,2444],{"class":1194},"None",[1050,2446,1125],{"class":1067},[1050,2448,2449],{"class":1503}," *",[1050,2451,2452],{"class":1467},"args",[1050,2454,1125],{"class":1067},[1050,2456,2457],{"class":1503}," **",[1050,2459,2460],{"class":1467},"kwargs",[1050,2462,1471],{"class":1067},[1050,2464,2465,2468,2470,2472,2474],{"class":1052,"line":1180},[1050,2466,2467],{"class":1063},"        self",[1050,2469,1352],{"class":1067},[1050,2471,1468],{"class":1499},[1050,2473,1068],{"class":1067},[1050,2475,2476],{"class":1348}," request\n",[1050,2478,2479,2483,2486,2489,2491,2494,2496,2498,2500,2502],{"class":1052,"line":1186},[1050,2480,2482],{"class":2481},"sa2tF","        super",[1050,2484,2485],{"class":1067},"().",[1050,2487,2488],{"class":2430},"__init__",[1050,2490,1464],{"class":1067},[1050,2492,2493],{"class":1503},"*",[1050,2495,2452],{"class":1526},[1050,2497,1125],{"class":1067},[1050,2499,2457],{"class":1503},[1050,2501,2460],{"class":1526},[1050,2503,1539],{"class":1067},[1050,2505,2506],{"class":1052,"line":1201},[1050,2507,2508],{"class":1348},"        \n",[1050,2510,2511,2513,2515],{"class":1052,"line":1214},[1050,2512,1545],{"class":1344},[1050,2514,1494],{"class":1348},[1050,2516,1514],{"class":1067},[1050,2518,2519,2521,2523,2526,2529,2531,2533,2535,2538,2541,2543,2545,2547,2549],{"class":1052,"line":1233},[1050,2520,1896],{"class":1063},[1050,2522,1352],{"class":1067},[1050,2524,2525],{"class":1499},"fields",[1050,2527,2528],{"class":1067},"[",[1050,2530,1085],{"class":1077},[1050,2532,1678],{"class":1081},[1050,2534,1085],{"class":1077},[1050,2536,2537],{"class":1067},"].",[1050,2539,2540],{"class":1499},"initial",[1050,2542,1068],{"class":1067},[1050,2544,1685],{"class":1526},[1050,2546,1464],{"class":1067},[1050,2548,1468],{"class":1526},[1050,2550,1539],{"class":1067},[1050,2552,2553],{"class":1052,"line":1248},[1050,2554,1626],{"class":1348},[1050,2556,2557,2559,2562,2564,2566],{"class":1052,"line":1262},[1050,2558,1771],{"class":1457},[1050,2560,2561],{"class":1450}," clean_csrf_token",[1050,2563,1464],{"class":1067},[1050,2565,1780],{"class":1779},[1050,2567,1471],{"class":1067},[1050,2569,2570,2573,2576],{"class":1052,"line":1280},[1050,2571,2572],{"class":1477},"        \"\"\"",[1050,2574,2575],{"class":1481},"Additional CSRF token validation",[1050,2577,1485],{"class":1477},[1050,2579,2580,2583,2585,2588,2590,2592,2594,2597,2599,2601,2603,2605],{"class":1052,"line":1285},[1050,2581,2582],{"class":1348},"        token ",[1050,2584,1523],{"class":1067},[1050,2586,2587],{"class":1063}," self",[1050,2589,1352],{"class":1067},[1050,2591,1578],{"class":1499},[1050,2593,1352],{"class":1067},[1050,2595,2596],{"class":1526},"get",[1050,2598,1464],{"class":1067},[1050,2600,1085],{"class":1077},[1050,2602,1678],{"class":1081},[1050,2604,1085],{"class":1077},[1050,2606,1539],{"class":1067},[1050,2608,2609],{"class":1052,"line":1291},[1050,2610,2508],{"class":1348},[1050,2612,2613,2615,2617,2619,2621],{"class":1052,"line":1301},[1050,2614,1545],{"class":1344},[1050,2616,2587],{"class":1063},[1050,2618,1352],{"class":1067},[1050,2620,1468],{"class":1499},[1050,2622,1514],{"class":1067},[1050,2624,2625,2628,2630,2632,2634,2636,2638,2640],{"class":1052,"line":1313},[1050,2626,2627],{"class":1348},"            expected_token ",[1050,2629,1523],{"class":1067},[1050,2631,1685],{"class":1526},[1050,2633,1464],{"class":1067},[1050,2635,1780],{"class":1063},[1050,2637,1352],{"class":1067},[1050,2639,1468],{"class":1499},[1050,2641,1539],{"class":1067},[1050,2643,2644,2647,2650,2653,2656],{"class":1052,"line":1325},[1050,2645,2646],{"class":1344},"            if",[1050,2648,2649],{"class":1348}," token ",[1050,2651,2652],{"class":1503},"!=",[1050,2654,2655],{"class":1348}," expected_token",[1050,2657,1514],{"class":1067},[1050,2659,2660,2663,2666,2668,2670,2673,2675],{"class":1052,"line":1330},[1050,2661,2662],{"class":1344},"                raise",[1050,2664,2665],{"class":1526}," ValidationError",[1050,2667,1464],{"class":1067},[1050,2669,1085],{"class":1077},[1050,2671,2672],{"class":1081},"CSRF token mismatch.",[1050,2674,1085],{"class":1077},[1050,2676,1539],{"class":1067},[1050,2678,2679],{"class":1052,"line":1335},[1050,2680,2508],{"class":1348},[1050,2682,2683,2685],{"class":1052,"line":1341},[1050,2684,1803],{"class":1344},[1050,2686,2687],{"class":1348}," token\n",[1050,2689,2690],{"class":1052,"line":1379},[1050,2691,1177],{"emptyLinePlaceholder":1176},[1050,2693,2694],{"class":1052,"line":1401},[1050,2695,2696],{"class":1056},"# Custom CSRF failure handling\n",[1050,2698,2699,2701,2704,2706,2708,2710,2713,2715,2718],{"class":1052,"line":1422},[1050,2700,1458],{"class":1457},[1050,2702,2703],{"class":1450}," csrf_failure_view",[1050,2705,1464],{"class":1067},[1050,2707,1468],{"class":1467},[1050,2709,1125],{"class":1067},[1050,2711,2712],{"class":1467}," reason",[1050,2714,1523],{"class":1503},[1050,2716,2717],{"class":1077},"\"\"",[1050,2719,1471],{"class":1067},[1050,2721,2722,2724,2727],{"class":1052,"line":1439},[1050,2723,1478],{"class":1477},[1050,2725,2726],{"class":1481},"Custom CSRF failure response",[1050,2728,1485],{"class":1477},[1050,2730,2731,2734,2736],{"class":1052,"line":1444},[1050,2732,2733],{"class":1348},"    context ",[1050,2735,1523],{"class":1067},[1050,2737,1653],{"class":1067},[1050,2739,2740,2742,2745,2747,2749,2751],{"class":1052,"line":1454},[1050,2741,1659],{"class":1077},[1050,2743,2744],{"class":1081},"reason",[1050,2746,1085],{"class":1077},[1050,2748,1666],{"class":1067},[1050,2750,2712],{"class":1348},[1050,2752,1088],{"class":1067},[1050,2754,2755,2757,2760,2762,2764,2766,2768,2771],{"class":1052,"line":1474},[1050,2756,1659],{"class":1077},[1050,2758,2759],{"class":1081},"request_path",[1050,2761,1085],{"class":1077},[1050,2763,1666],{"class":1067},[1050,2765,1494],{"class":1348},[1050,2767,1352],{"class":1067},[1050,2769,2770],{"class":1499},"path",[1050,2772,1088],{"class":1067},[1050,2774,2775,2777,2780,2782,2784,2786,2788,2791,2793,2795,2797,2799,2802,2804,2806,2809],{"class":1052,"line":1488},[1050,2776,1659],{"class":1077},[1050,2778,2779],{"class":1081},"referer",[1050,2781,1085],{"class":1077},[1050,2783,1666],{"class":1067},[1050,2785,1494],{"class":1348},[1050,2787,1352],{"class":1067},[1050,2789,2790],{"class":1536},"META",[1050,2792,1352],{"class":1067},[1050,2794,2596],{"class":1526},[1050,2796,1464],{"class":1067},[1050,2798,1085],{"class":1077},[1050,2800,2801],{"class":1081},"HTTP_REFERER",[1050,2803,1085],{"class":1077},[1050,2805,1125],{"class":1067},[1050,2807,2808],{"class":1077}," ''",[1050,2810,2811],{"class":1067},"),\n",[1050,2813,2814],{"class":1052,"line":1517},[1050,2815,2098],{"class":1067},[1050,2817,2818],{"class":1052,"line":1542},[1050,2819,1626],{"class":1348},[1050,2821,2822,2824,2826,2828,2831,2833,2835,2837,2839,2842,2844,2847,2849,2851,2854,2856],{"class":1052,"line":1559},[1050,2823,1491],{"class":1344},[1050,2825,1494],{"class":1348},[1050,2827,1352],{"class":1067},[1050,2829,2830],{"class":1499},"headers",[1050,2832,1352],{"class":1067},[1050,2834,2596],{"class":1526},[1050,2836,1464],{"class":1067},[1050,2838,1085],{"class":1077},[1050,2840,2841],{"class":1081},"X-Requested-With",[1050,2843,1085],{"class":1077},[1050,2845,2846],{"class":1067},")",[1050,2848,1504],{"class":1503},[1050,2850,1222],{"class":1077},[1050,2852,2853],{"class":1081},"XMLHttpRequest",[1050,2855,1085],{"class":1077},[1050,2857,1514],{"class":1067},[1050,2859,2860,2862,2864],{"class":1052,"line":1565},[1050,2861,1803],{"class":1344},[1050,2863,1915],{"class":1526},[1050,2865,2866],{"class":1067},"({\n",[1050,2868,2869,2872,2875,2877,2879,2881,2884,2886],{"class":1052,"line":1583},[1050,2870,2871],{"class":1077},"            '",[1050,2873,2874],{"class":1081},"error",[1050,2876,1085],{"class":1077},[1050,2878,1666],{"class":1067},[1050,2880,1222],{"class":1077},[1050,2882,2883],{"class":1081},"CSRF verification failed",[1050,2885,1085],{"class":1077},[1050,2887,1088],{"class":1067},[1050,2889,2890,2892,2894,2896,2898],{"class":1052,"line":1603},[1050,2891,2871],{"class":1077},[1050,2893,2744],{"class":1081},[1050,2895,1085],{"class":1077},[1050,2897,1666],{"class":1067},[1050,2899,2900],{"class":1526}," reason\n",[1050,2902,2903,2906,2908,2910,2913],{"class":1052,"line":1611},[1050,2904,2905],{"class":1067},"        },",[1050,2907,1960],{"class":1720},[1050,2909,1523],{"class":1067},[1050,2911,2912],{"class":1241},"403",[1050,2914,1539],{"class":1067},[1050,2916,2917],{"class":1052,"line":1623},[1050,2918,1626],{"class":1348},[1050,2920,2921,2923,2925,2927,2929,2931,2933,2936,2938,2940,2943,2945,2947,2949,2951],{"class":1052,"line":1629},[1050,2922,1632],{"class":1344},[1050,2924,1635],{"class":1526},[1050,2926,1464],{"class":1067},[1050,2928,1468],{"class":1526},[1050,2930,1125],{"class":1067},[1050,2932,1222],{"class":1077},[1050,2934,2935],{"class":1081},"csrf_failure.html",[1050,2937,1085],{"class":1077},[1050,2939,1125],{"class":1067},[1050,2941,2942],{"class":1526}," context",[1050,2944,1125],{"class":1067},[1050,2946,1960],{"class":1720},[1050,2948,1523],{"class":1067},[1050,2950,2912],{"class":1241},[1050,2952,1539],{"class":1067},[1050,2954,2955],{"class":1052,"line":1656},[1050,2956,1177],{"emptyLinePlaceholder":1176},[1050,2958,2959],{"class":1052,"line":1673},[1050,2960,2961],{"class":1056},"# settings.py\n",[1050,2963,2964,2967,2969,2971,2974],{"class":1052,"line":1694},[1050,2965,2966],{"class":1063},"CSRF_FAILURE_VIEW",[1050,2968,1068],{"class":1067},[1050,2970,1222],{"class":1077},[1050,2972,2973],{"class":1081},"myapp.views.csrf_failure_view",[1050,2975,2976],{"class":1077},"'\n",[1030,2978,2980],{"id":2979},"input-validation-and-sanitization","Input Validation and Sanitization",[1035,2982,2984],{"id":2983},"comprehensive-input-validation","Comprehensive Input Validation",[1040,2986,2988],{"className":1042,"code":2987,"language":1044,"meta":1045,"style":1045},"# validators.py - Custom security validators\nimport re\nimport bleach\nfrom django.core.exceptions import ValidationError\nfrom django.utils.html import strip_tags\n\ndef validate_no_script_tags(value):\n    \"\"\"Prevent script tag injection\"\"\"\n    if '\u003Cscript' in value.lower() or '\u003C/script>' in value.lower():\n        raise ValidationError('Script tags are not allowed.')\n\ndef validate_no_sql_injection(value):\n    \"\"\"Basic SQL injection prevention\"\"\"\n    sql_keywords = [\n        'select', 'insert', 'update', 'delete', 'drop', 'create',\n        'alter', 'exec', 'execute', 'union', 'script'\n    ]\n    \n    value_lower = value.lower()\n    for keyword in sql_keywords:\n        if keyword in value_lower:\n            raise ValidationError(f'Potentially dangerous content detected: {keyword}')\n\ndef validate_safe_filename(value):\n    \"\"\"Validate filename for security\"\"\"\n    # Check for directory traversal\n    if '..' in value or '/' in value or '\\\\' in value:\n        raise ValidationError('Invalid filename: directory traversal detected.')\n    \n    # Check for dangerous extensions\n    dangerous_extensions = ['.exe', '.bat', '.cmd', '.scr', '.pif', '.php', '.asp']\n    if any(value.lower().endswith(ext) for ext in dangerous_extensions):\n        raise ValidationError('File type not allowed.')\n    \n    # Check filename length\n    if len(value) > 255:\n        raise ValidationError('Filename too long.')\n\ndef validate_url_safety(value):\n    \"\"\"Validate URL for security\"\"\"\n    # Check for dangerous protocols\n    dangerous_protocols = ['javascript:', 'data:', 'vbscript:', 'file:']\n    value_lower = value.lower()\n    \n    for protocol in dangerous_protocols:\n        if value_lower.startswith(protocol):\n            raise ValidationError(f'Protocol {protocol} is not allowed.')\n\ndef validate_phone_number(value):\n    \"\"\"Validate phone number format\"\"\"\n    # Remove common formatting characters\n    cleaned = re.sub(r'[^\\d+]', '', value)\n    \n    # Check format\n    if not re.match(r'^\\+?[\\d\\s\\-\\(\\)]{10,15}$', value):\n        raise ValidationError('Invalid phone number format.')\n    \n    return cleaned\n\n# forms.py - Secure form with validation\nfrom django import forms\nfrom .validators import *\n\nclass SecureContactForm(forms.Form):\n    \"\"\"Contact form with comprehensive security validation\"\"\"\n    \n    name = forms.CharField(\n        max_length=100,\n        validators=[validate_no_script_tags],\n        widget=forms.TextInput(attrs={'class': 'form-control'})\n    )\n    \n    email = forms.EmailField(\n        widget=forms.EmailInput(attrs={'class': 'form-control'})\n    )\n    \n    phone = forms.CharField(\n        max_length=20,\n        validators=[validate_phone_number],\n        required=False,\n        widget=forms.TextInput(attrs={'class': 'form-control'})\n    )\n    \n    website = forms.URLField(\n        validators=[validate_url_safety],\n        required=False,\n        widget=forms.URLInput(attrs={'class': 'form-control'})\n    )\n    \n    message = forms.CharField(\n        validators=[validate_no_script_tags, validate_no_sql_injection],\n        widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 5})\n    )\n    \n    attachment = forms.FileField(\n        validators=[validate_safe_filename],\n        required=False,\n        widget=forms.FileInput(attrs={'class': 'form-control'})\n    )\n    \n    def clean_name(self):\n        \"\"\"Additional name validation and sanitization\"\"\"\n        name = self.cleaned_data['name']\n        \n        # Strip HTML tags\n        name = strip_tags(name)\n        \n        # Remove excessive whitespace\n        name = ' '.join(name.split())\n        \n        # Check for minimum length\n        if len(name) \u003C 2:\n            raise ValidationError('Name must be at least 2 characters long.')\n        \n        # Check for valid characters\n        if not re.match(r'^[a-zA-Z\\s\\-\\'\\.]+$', name):\n            raise ValidationError('Name contains invalid characters.')\n        \n        return name\n    \n    def clean_message(self):\n        \"\"\"Sanitize message content\"\"\"\n        message = self.cleaned_data['message']\n        \n        # Allow only safe HTML tags\n        allowed_tags = ['p', 'br', 'strong', 'em', 'u']\n        allowed_attributes = {}\n        \n        # Clean HTML\n        clean_message = bleach.clean(\n            message,\n            tags=allowed_tags,\n            attributes=allowed_attributes,\n            strip=True\n        )\n        \n        # Check minimum length\n        if len(strip_tags(clean_message)) \u003C 10:\n            raise ValidationError('Message must be at least 10 characters long.')\n        \n        return clean_message\n    \n    def clean_attachment(self):\n        \"\"\"Validate file upload security\"\"\"\n        attachment = self.cleaned_data.get('attachment')\n        \n        if attachment:\n            # Check file size (5MB limit)\n            if attachment.size > 5 * 1024 * 1024:\n                raise ValidationError('File size cannot exceed 5MB.')\n            \n            # Check MIME type\n            allowed_types = [\n                'text/plain',\n                'application/pdf',\n                'image/jpeg',\n                'image/png',\n                'image/gif'\n            ]\n            \n            if attachment.content_type not in allowed_types:\n                raise ValidationError('File type not allowed.')\n            \n            # Scan file content for malicious patterns\n            self.scan_file_content(attachment)\n        \n        return attachment\n    \n    def scan_file_content(self, file):\n        \"\"\"Basic file content scanning\"\"\"\n        # Read first 1KB for scanning\n        file.seek(0)\n        content = file.read(1024).decode('utf-8', errors='ignore')\n        file.seek(0)  # Reset file pointer\n        \n        # Check for suspicious patterns\n        suspicious_patterns = [\n            r'\u003Cscript[^>]*>',\n            r'javascript:',\n            r'eval\\s*\\(',\n            r'document\\.write',\n            r'\u003Ciframe[^>]*>',\n        ]\n        \n        for pattern in suspicious_patterns:\n            if re.search(pattern, content, re.IGNORECASE):\n                raise ValidationError('File contains potentially malicious content.')\n",[1047,2989,2990,2995,3002,3009,3027,3047,3051,3065,3074,3119,3137,3141,3154,3163,3172,3228,3273,3278,3282,3297,3313,3326,3355,3359,3372,3381,3386,3431,3448,3452,3457,3530,3570,3587,3591,3596,3617,3634,3638,3651,3660,3665,3710,3724,3728,3742,3760,3784,3788,3801,3810,3815,3866,3870,3875,3929,3946,3950,3957,3961,3966,3976,3991,3995,4012,4021,4025,4041,4053,4067,4106,4111,4115,4131,4166,4170,4174,4189,4200,4211,4222,4256,4260,4264,4280,4291,4301,4336,4340,4344,4359,4373,4422,4426,4430,4446,4457,4467,4502,4506,4510,4523,4532,4556,4560,4565,4580,4584,4589,4616,4620,4626,4647,4665,4670,4676,4722,4740,4745,4753,4758,4772,4782,4807,4812,4818,4872,4883,4888,4894,4912,4920,4933,4946,4957,4963,4968,4974,5001,5019,5024,5032,5037,5051,5061,5090,5095,5105,5111,5138,5156,5162,5168,5178,5191,5203,5215,5227,5237,5243,5248,5269,5286,5291,5297,5313,5318,5326,5331,5350,5360,5366,5385,5436,5454,5459,5465,5475,5503,5516,5537,5557,5583,5589,5594,5610,5643],{"__ignoreMap":1045},[1050,2991,2992],{"class":1052,"line":1053},[1050,2993,2994],{"class":1056},"# validators.py - Custom security validators\n",[1050,2996,2997,2999],{"class":1052,"line":1060},[1050,2998,1368],{"class":1344},[1050,3000,3001],{"class":1348}," re\n",[1050,3003,3004,3006],{"class":1052,"line":1074},[1050,3005,1368],{"class":1344},[1050,3007,3008],{"class":1348}," bleach\n",[1050,3010,3011,3013,3015,3017,3019,3021,3023,3025],{"class":1052,"line":1091},[1050,3012,1345],{"class":1344},[1050,3014,1349],{"class":1348},[1050,3016,1352],{"class":1067},[1050,3018,2331],{"class":1348},[1050,3020,1352],{"class":1067},[1050,3022,2336],{"class":1348},[1050,3024,1368],{"class":1344},[1050,3026,2341],{"class":1348},[1050,3028,3029,3031,3033,3035,3037,3039,3042,3044],{"class":1052,"line":1103},[1050,3030,1345],{"class":1344},[1050,3032,1349],{"class":1348},[1050,3034,1352],{"class":1067},[1050,3036,1388],{"class":1348},[1050,3038,1352],{"class":1067},[1050,3040,3041],{"class":1348},"html ",[1050,3043,1368],{"class":1344},[1050,3045,3046],{"class":1348}," strip_tags\n",[1050,3048,3049],{"class":1052,"line":1115},[1050,3050,1177],{"emptyLinePlaceholder":1176},[1050,3052,3053,3055,3058,3060,3063],{"class":1052,"line":1131},[1050,3054,1458],{"class":1457},[1050,3056,3057],{"class":1450}," validate_no_script_tags",[1050,3059,1464],{"class":1067},[1050,3061,3062],{"class":1467},"value",[1050,3064,1471],{"class":1067},[1050,3066,3067,3069,3072],{"class":1052,"line":1143},[1050,3068,1478],{"class":1477},[1050,3070,3071],{"class":1481},"Prevent script tag injection",[1050,3073,1485],{"class":1477},[1050,3075,3076,3078,3080,3083,3085,3088,3091,3093,3096,3099,3102,3104,3107,3109,3111,3113,3115,3117],{"class":1052,"line":1155},[1050,3077,1491],{"class":1344},[1050,3079,1222],{"class":1077},[1050,3081,3082],{"class":1081},"\u003Cscript",[1050,3084,1085],{"class":1077},[1050,3086,3087],{"class":1503}," in",[1050,3089,3090],{"class":1348}," value",[1050,3092,1352],{"class":1067},[1050,3094,3095],{"class":1526},"lower",[1050,3097,3098],{"class":1067},"()",[1050,3100,3101],{"class":1503}," or",[1050,3103,1222],{"class":1077},[1050,3105,3106],{"class":1081},"\u003C/script>",[1050,3108,1085],{"class":1077},[1050,3110,3087],{"class":1503},[1050,3112,3090],{"class":1348},[1050,3114,1352],{"class":1067},[1050,3116,3095],{"class":1526},[1050,3118,1556],{"class":1067},[1050,3120,3121,3124,3126,3128,3130,3133,3135],{"class":1052,"line":1167},[1050,3122,3123],{"class":1344},"        raise",[1050,3125,2665],{"class":1526},[1050,3127,1464],{"class":1067},[1050,3129,1085],{"class":1077},[1050,3131,3132],{"class":1081},"Script tags are not allowed.",[1050,3134,1085],{"class":1077},[1050,3136,1539],{"class":1067},[1050,3138,3139],{"class":1052,"line":1173},[1050,3140,1177],{"emptyLinePlaceholder":1176},[1050,3142,3143,3145,3148,3150,3152],{"class":1052,"line":1180},[1050,3144,1458],{"class":1457},[1050,3146,3147],{"class":1450}," validate_no_sql_injection",[1050,3149,1464],{"class":1067},[1050,3151,3062],{"class":1467},[1050,3153,1471],{"class":1067},[1050,3155,3156,3158,3161],{"class":1052,"line":1186},[1050,3157,1478],{"class":1477},[1050,3159,3160],{"class":1481},"Basic SQL injection prevention",[1050,3162,1485],{"class":1477},[1050,3164,3165,3168,3170],{"class":1052,"line":1201},[1050,3166,3167],{"class":1348},"    sql_keywords ",[1050,3169,1523],{"class":1067},[1050,3171,1071],{"class":1067},[1050,3173,3174,3176,3179,3181,3183,3185,3188,3190,3192,3194,3197,3199,3201,3203,3206,3208,3210,3212,3215,3217,3219,3221,3224,3226],{"class":1052,"line":1214},[1050,3175,1659],{"class":1077},[1050,3177,3178],{"class":1081},"select",[1050,3180,1085],{"class":1077},[1050,3182,1125],{"class":1067},[1050,3184,1222],{"class":1077},[1050,3186,3187],{"class":1081},"insert",[1050,3189,1085],{"class":1077},[1050,3191,1125],{"class":1067},[1050,3193,1222],{"class":1077},[1050,3195,3196],{"class":1081},"update",[1050,3198,1085],{"class":1077},[1050,3200,1125],{"class":1067},[1050,3202,1222],{"class":1077},[1050,3204,3205],{"class":1081},"delete",[1050,3207,1085],{"class":1077},[1050,3209,1125],{"class":1067},[1050,3211,1222],{"class":1077},[1050,3213,3214],{"class":1081},"drop",[1050,3216,1085],{"class":1077},[1050,3218,1125],{"class":1067},[1050,3220,1222],{"class":1077},[1050,3222,3223],{"class":1081},"create",[1050,3225,1085],{"class":1077},[1050,3227,1088],{"class":1067},[1050,3229,3230,3232,3235,3237,3239,3241,3244,3246,3248,3250,3253,3255,3257,3259,3262,3264,3266,3268,3271],{"class":1052,"line":1233},[1050,3231,1659],{"class":1077},[1050,3233,3234],{"class":1081},"alter",[1050,3236,1085],{"class":1077},[1050,3238,1125],{"class":1067},[1050,3240,1222],{"class":1077},[1050,3242,3243],{"class":1081},"exec",[1050,3245,1085],{"class":1077},[1050,3247,1125],{"class":1067},[1050,3249,1222],{"class":1077},[1050,3251,3252],{"class":1081},"execute",[1050,3254,1085],{"class":1077},[1050,3256,1125],{"class":1067},[1050,3258,1222],{"class":1077},[1050,3260,3261],{"class":1081},"union",[1050,3263,1085],{"class":1077},[1050,3265,1125],{"class":1067},[1050,3267,1222],{"class":1077},[1050,3269,3270],{"class":1081},"script",[1050,3272,2976],{"class":1077},[1050,3274,3275],{"class":1052,"line":1248},[1050,3276,3277],{"class":1067},"    ]\n",[1050,3279,3280],{"class":1052,"line":1262},[1050,3281,1626],{"class":1348},[1050,3283,3284,3287,3289,3291,3293,3295],{"class":1052,"line":1280},[1050,3285,3286],{"class":1348},"    value_lower ",[1050,3288,1523],{"class":1067},[1050,3290,3090],{"class":1348},[1050,3292,1352],{"class":1067},[1050,3294,3095],{"class":1526},[1050,3296,1620],{"class":1067},[1050,3298,3299,3302,3305,3308,3311],{"class":1052,"line":1285},[1050,3300,3301],{"class":1344},"    for",[1050,3303,3304],{"class":1348}," keyword ",[1050,3306,3307],{"class":1344},"in",[1050,3309,3310],{"class":1348}," sql_keywords",[1050,3312,1514],{"class":1067},[1050,3314,3315,3317,3319,3321,3324],{"class":1052,"line":1291},[1050,3316,1545],{"class":1344},[1050,3318,3304],{"class":1348},[1050,3320,3307],{"class":1503},[1050,3322,3323],{"class":1348}," value_lower",[1050,3325,1514],{"class":1067},[1050,3327,3328,3331,3333,3335,3338,3341,3345,3348,3351,3353],{"class":1052,"line":1301},[1050,3329,3330],{"class":1344},"            raise",[1050,3332,2665],{"class":1526},[1050,3334,1464],{"class":1067},[1050,3336,3337],{"class":1457},"f",[1050,3339,3340],{"class":1081},"'Potentially dangerous content detected: ",[1050,3342,3344],{"class":3343},"s3h35","{",[1050,3346,3347],{"class":1526},"keyword",[1050,3349,3350],{"class":3343},"}",[1050,3352,1085],{"class":1081},[1050,3354,1539],{"class":1067},[1050,3356,3357],{"class":1052,"line":1313},[1050,3358,1177],{"emptyLinePlaceholder":1176},[1050,3360,3361,3363,3366,3368,3370],{"class":1052,"line":1325},[1050,3362,1458],{"class":1457},[1050,3364,3365],{"class":1450}," validate_safe_filename",[1050,3367,1464],{"class":1067},[1050,3369,3062],{"class":1467},[1050,3371,1471],{"class":1067},[1050,3373,3374,3376,3379],{"class":1052,"line":1330},[1050,3375,1478],{"class":1477},[1050,3377,3378],{"class":1481},"Validate filename for security",[1050,3380,1485],{"class":1477},[1050,3382,3383],{"class":1052,"line":1335},[1050,3384,3385],{"class":1056},"    # Check for directory traversal\n",[1050,3387,3388,3390,3392,3395,3397,3399,3402,3405,3407,3410,3412,3414,3416,3418,3420,3423,3425,3427,3429],{"class":1052,"line":1341},[1050,3389,1491],{"class":1344},[1050,3391,1222],{"class":1077},[1050,3393,3394],{"class":1081},"..",[1050,3396,1085],{"class":1077},[1050,3398,3087],{"class":1503},[1050,3400,3401],{"class":1348}," value ",[1050,3403,3404],{"class":1503},"or",[1050,3406,1222],{"class":1077},[1050,3408,3409],{"class":1081},"/",[1050,3411,1085],{"class":1077},[1050,3413,3087],{"class":1503},[1050,3415,3401],{"class":1348},[1050,3417,3404],{"class":1503},[1050,3419,1222],{"class":1077},[1050,3421,3422],{"class":1063},"\\\\",[1050,3424,1085],{"class":1077},[1050,3426,3087],{"class":1503},[1050,3428,3090],{"class":1348},[1050,3430,1514],{"class":1067},[1050,3432,3433,3435,3437,3439,3441,3444,3446],{"class":1052,"line":1379},[1050,3434,3123],{"class":1344},[1050,3436,2665],{"class":1526},[1050,3438,1464],{"class":1067},[1050,3440,1085],{"class":1077},[1050,3442,3443],{"class":1081},"Invalid filename: directory traversal detected.",[1050,3445,1085],{"class":1077},[1050,3447,1539],{"class":1067},[1050,3449,3450],{"class":1052,"line":1401},[1050,3451,1626],{"class":1348},[1050,3453,3454],{"class":1052,"line":1422},[1050,3455,3456],{"class":1056},"    # Check for dangerous extensions\n",[1050,3458,3459,3462,3464,3467,3469,3472,3474,3476,3478,3481,3483,3485,3487,3490,3492,3494,3496,3499,3501,3503,3505,3508,3510,3512,3514,3517,3519,3521,3523,3526,3528],{"class":1052,"line":1439},[1050,3460,3461],{"class":1348},"    dangerous_extensions ",[1050,3463,1523],{"class":1067},[1050,3465,3466],{"class":1067}," [",[1050,3468,1085],{"class":1077},[1050,3470,3471],{"class":1081},".exe",[1050,3473,1085],{"class":1077},[1050,3475,1125],{"class":1067},[1050,3477,1222],{"class":1077},[1050,3479,3480],{"class":1081},".bat",[1050,3482,1085],{"class":1077},[1050,3484,1125],{"class":1067},[1050,3486,1222],{"class":1077},[1050,3488,3489],{"class":1081},".cmd",[1050,3491,1085],{"class":1077},[1050,3493,1125],{"class":1067},[1050,3495,1222],{"class":1077},[1050,3497,3498],{"class":1081},".scr",[1050,3500,1085],{"class":1077},[1050,3502,1125],{"class":1067},[1050,3504,1222],{"class":1077},[1050,3506,3507],{"class":1081},".pif",[1050,3509,1085],{"class":1077},[1050,3511,1125],{"class":1067},[1050,3513,1222],{"class":1077},[1050,3515,3516],{"class":1081},".php",[1050,3518,1085],{"class":1077},[1050,3520,1125],{"class":1067},[1050,3522,1222],{"class":1077},[1050,3524,3525],{"class":1081},".asp",[1050,3527,1085],{"class":1077},[1050,3529,1170],{"class":1067},[1050,3531,3532,3534,3537,3539,3541,3543,3545,3547,3550,3552,3555,3557,3560,3563,3565,3568],{"class":1052,"line":1444},[1050,3533,1491],{"class":1344},[1050,3535,3536],{"class":2430}," any",[1050,3538,1464],{"class":1067},[1050,3540,3062],{"class":1526},[1050,3542,1352],{"class":1067},[1050,3544,3095],{"class":1526},[1050,3546,2485],{"class":1067},[1050,3548,3549],{"class":1526},"endswith",[1050,3551,1464],{"class":1067},[1050,3553,3554],{"class":1526},"ext",[1050,3556,2846],{"class":1067},[1050,3558,3559],{"class":1344}," for",[1050,3561,3562],{"class":1526}," ext ",[1050,3564,3307],{"class":1344},[1050,3566,3567],{"class":1526}," dangerous_extensions",[1050,3569,1471],{"class":1067},[1050,3571,3572,3574,3576,3578,3580,3583,3585],{"class":1052,"line":1454},[1050,3573,3123],{"class":1344},[1050,3575,2665],{"class":1526},[1050,3577,1464],{"class":1067},[1050,3579,1085],{"class":1077},[1050,3581,3582],{"class":1081},"File type not allowed.",[1050,3584,1085],{"class":1077},[1050,3586,1539],{"class":1067},[1050,3588,3589],{"class":1052,"line":1474},[1050,3590,1626],{"class":1348},[1050,3592,3593],{"class":1052,"line":1488},[1050,3594,3595],{"class":1056},"    # Check filename length\n",[1050,3597,3598,3600,3603,3605,3607,3609,3612,3615],{"class":1052,"line":1517},[1050,3599,1491],{"class":1344},[1050,3601,3602],{"class":2430}," len",[1050,3604,1464],{"class":1067},[1050,3606,3062],{"class":1526},[1050,3608,2846],{"class":1067},[1050,3610,3611],{"class":1503}," >",[1050,3613,3614],{"class":1241}," 255",[1050,3616,1514],{"class":1067},[1050,3618,3619,3621,3623,3625,3627,3630,3632],{"class":1052,"line":1542},[1050,3620,3123],{"class":1344},[1050,3622,2665],{"class":1526},[1050,3624,1464],{"class":1067},[1050,3626,1085],{"class":1077},[1050,3628,3629],{"class":1081},"Filename too long.",[1050,3631,1085],{"class":1077},[1050,3633,1539],{"class":1067},[1050,3635,3636],{"class":1052,"line":1559},[1050,3637,1177],{"emptyLinePlaceholder":1176},[1050,3639,3640,3642,3645,3647,3649],{"class":1052,"line":1565},[1050,3641,1458],{"class":1457},[1050,3643,3644],{"class":1450}," validate_url_safety",[1050,3646,1464],{"class":1067},[1050,3648,3062],{"class":1467},[1050,3650,1471],{"class":1067},[1050,3652,3653,3655,3658],{"class":1052,"line":1583},[1050,3654,1478],{"class":1477},[1050,3656,3657],{"class":1481},"Validate URL for security",[1050,3659,1485],{"class":1477},[1050,3661,3662],{"class":1052,"line":1603},[1050,3663,3664],{"class":1056},"    # Check for dangerous protocols\n",[1050,3666,3667,3670,3672,3674,3676,3679,3681,3683,3685,3688,3690,3692,3694,3697,3699,3701,3703,3706,3708],{"class":1052,"line":1611},[1050,3668,3669],{"class":1348},"    dangerous_protocols ",[1050,3671,1523],{"class":1067},[1050,3673,3466],{"class":1067},[1050,3675,1085],{"class":1077},[1050,3677,3678],{"class":1081},"javascript:",[1050,3680,1085],{"class":1077},[1050,3682,1125],{"class":1067},[1050,3684,1222],{"class":1077},[1050,3686,3687],{"class":1081},"data:",[1050,3689,1085],{"class":1077},[1050,3691,1125],{"class":1067},[1050,3693,1222],{"class":1077},[1050,3695,3696],{"class":1081},"vbscript:",[1050,3698,1085],{"class":1077},[1050,3700,1125],{"class":1067},[1050,3702,1222],{"class":1077},[1050,3704,3705],{"class":1081},"file:",[1050,3707,1085],{"class":1077},[1050,3709,1170],{"class":1067},[1050,3711,3712,3714,3716,3718,3720,3722],{"class":1052,"line":1623},[1050,3713,3286],{"class":1348},[1050,3715,1523],{"class":1067},[1050,3717,3090],{"class":1348},[1050,3719,1352],{"class":1067},[1050,3721,3095],{"class":1526},[1050,3723,1620],{"class":1067},[1050,3725,3726],{"class":1052,"line":1629},[1050,3727,1626],{"class":1348},[1050,3729,3730,3732,3735,3737,3740],{"class":1052,"line":1656},[1050,3731,3301],{"class":1344},[1050,3733,3734],{"class":1348}," protocol ",[1050,3736,3307],{"class":1344},[1050,3738,3739],{"class":1348}," dangerous_protocols",[1050,3741,1514],{"class":1067},[1050,3743,3744,3746,3748,3750,3753,3755,3758],{"class":1052,"line":1673},[1050,3745,1545],{"class":1344},[1050,3747,3323],{"class":1348},[1050,3749,1352],{"class":1067},[1050,3751,3752],{"class":1526},"startswith",[1050,3754,1464],{"class":1067},[1050,3756,3757],{"class":1526},"protocol",[1050,3759,1471],{"class":1067},[1050,3761,3762,3764,3766,3768,3770,3773,3775,3777,3779,3782],{"class":1052,"line":1694},[1050,3763,3330],{"class":1344},[1050,3765,2665],{"class":1526},[1050,3767,1464],{"class":1067},[1050,3769,3337],{"class":1457},[1050,3771,3772],{"class":1081},"'Protocol ",[1050,3774,3344],{"class":3343},[1050,3776,3757],{"class":1526},[1050,3778,3350],{"class":3343},[1050,3780,3781],{"class":1081}," is not allowed.'",[1050,3783,1539],{"class":1067},[1050,3785,3786],{"class":1052,"line":1700},[1050,3787,1177],{"emptyLinePlaceholder":1176},[1050,3789,3790,3792,3795,3797,3799],{"class":1052,"line":1705},[1050,3791,1458],{"class":1457},[1050,3793,3794],{"class":1450}," validate_phone_number",[1050,3796,1464],{"class":1067},[1050,3798,3062],{"class":1467},[1050,3800,1471],{"class":1067},[1050,3802,3803,3805,3808],{"class":1052,"line":1735},[1050,3804,1478],{"class":1477},[1050,3806,3807],{"class":1481},"Validate phone number format",[1050,3809,1485],{"class":1477},[1050,3811,3812],{"class":1052,"line":1753},[1050,3813,3814],{"class":1056},"    # Remove common formatting characters\n",[1050,3816,3817,3820,3822,3825,3827,3830,3832,3835,3837,3840,3843,3847,3851,3854,3856,3858,3860,3862,3864],{"class":1052,"line":1763},[1050,3818,3819],{"class":1348},"    cleaned ",[1050,3821,1523],{"class":1067},[1050,3823,3824],{"class":1348}," re",[1050,3826,1352],{"class":1067},[1050,3828,3829],{"class":1526},"sub",[1050,3831,1464],{"class":1067},[1050,3833,3834],{"class":1457},"r",[1050,3836,1085],{"class":1077},[1050,3838,2528],{"class":3839},"sETVe",[1050,3841,3842],{"class":1503},"^",[1050,3844,3846],{"class":3845},"sRJPX","\\d",[1050,3848,3850],{"class":3849},"sz9Cv","+",[1050,3852,3853],{"class":3839},"]",[1050,3855,1085],{"class":1077},[1050,3857,1125],{"class":1067},[1050,3859,2808],{"class":1077},[1050,3861,1125],{"class":1067},[1050,3863,3090],{"class":1526},[1050,3865,1539],{"class":1067},[1050,3867,3868],{"class":1052,"line":1768},[1050,3869,1626],{"class":1348},[1050,3871,3872],{"class":1052,"line":1789},[1050,3873,3874],{"class":1056},"    # Check format\n",[1050,3876,3877,3879,3882,3884,3886,3889,3891,3893,3895,3897,3901,3905,3907,3910,3913,3915,3918,3921,3923,3925,3927],{"class":1052,"line":1800},[1050,3878,1491],{"class":1344},[1050,3880,3881],{"class":1503}," not",[1050,3883,3824],{"class":1348},[1050,3885,1352],{"class":1067},[1050,3887,3888],{"class":1526},"match",[1050,3890,1464],{"class":1067},[1050,3892,3834],{"class":1457},[1050,3894,1085],{"class":1077},[1050,3896,3842],{"class":3845},[1050,3898,3900],{"class":3899},"sk0MF","\\+",[1050,3902,3904],{"class":3903},"sGuSu","?",[1050,3906,2528],{"class":3839},[1050,3908,3909],{"class":3845},"\\d\\s",[1050,3911,3912],{"class":3899},"\\-\\(\\)",[1050,3914,3853],{"class":3839},[1050,3916,3917],{"class":3903},"{10,15}",[1050,3919,3920],{"class":3845},"$",[1050,3922,1085],{"class":1077},[1050,3924,1125],{"class":1067},[1050,3926,3090],{"class":1526},[1050,3928,1471],{"class":1067},[1050,3930,3931,3933,3935,3937,3939,3942,3944],{"class":1052,"line":1838},[1050,3932,3123],{"class":1344},[1050,3934,2665],{"class":1526},[1050,3936,1464],{"class":1067},[1050,3938,1085],{"class":1077},[1050,3940,3941],{"class":1081},"Invalid phone number format.",[1050,3943,1085],{"class":1077},[1050,3945,1539],{"class":1067},[1050,3947,3948],{"class":1052,"line":1843},[1050,3949,1626],{"class":1348},[1050,3951,3952,3954],{"class":1052,"line":1861},[1050,3953,1632],{"class":1344},[1050,3955,3956],{"class":1348}," cleaned\n",[1050,3958,3959],{"class":1052,"line":1880},[1050,3960,1177],{"emptyLinePlaceholder":1176},[1050,3962,3963],{"class":1052,"line":1893},[1050,3964,3965],{"class":1056},"# forms.py - Secure form with validation\n",[1050,3967,3968,3970,3972,3974],{"class":1052,"line":1910},[1050,3969,1345],{"class":1344},[1050,3971,2297],{"class":1348},[1050,3973,1368],{"class":1344},[1050,3975,2302],{"class":1348},[1050,3977,3978,3980,3983,3986,3988],{"class":1052,"line":1933},[1050,3979,1345],{"class":1344},[1050,3981,3982],{"class":1067}," .",[1050,3984,3985],{"class":1348},"validators ",[1050,3987,1368],{"class":1344},[1050,3989,3990],{"class":1503}," *\n",[1050,3992,3993],{"class":1052,"line":1970},[1050,3994,1177],{"emptyLinePlaceholder":1176},[1050,3996,3997,3999,4002,4004,4006,4008,4010],{"class":1052,"line":1975},[1050,3998,1738],{"class":1457},[1050,4000,4001],{"class":1741}," SecureContactForm",[1050,4003,1464],{"class":1067},[1050,4005,2357],{"class":1747},[1050,4007,1352],{"class":1067},[1050,4009,2362],{"class":1747},[1050,4011,1471],{"class":1067},[1050,4013,4014,4016,4019],{"class":1052,"line":1981},[1050,4015,1478],{"class":1477},[1050,4017,4018],{"class":1481},"Contact form with comprehensive security validation",[1050,4020,1485],{"class":1477},[1050,4022,4023],{"class":1052,"line":1995},[1050,4024,1626],{"class":1348},[1050,4026,4027,4030,4032,4034,4036,4038],{"class":1052,"line":2005},[1050,4028,4029],{"class":1348},"    name ",[1050,4031,1523],{"class":1067},[1050,4033,2387],{"class":1348},[1050,4035,1352],{"class":1067},[1050,4037,2392],{"class":1526},[1050,4039,4040],{"class":1067},"(\n",[1050,4042,4043,4046,4048,4051],{"class":1052,"line":2031},[1050,4044,4045],{"class":1720},"        max_length",[1050,4047,1523],{"class":1067},[1050,4049,4050],{"class":1241},"100",[1050,4052,1088],{"class":1067},[1050,4054,4055,4058,4061,4064],{"class":1052,"line":2036},[1050,4056,4057],{"class":1720},"        validators",[1050,4059,4060],{"class":1067},"=[",[1050,4062,4063],{"class":1526},"validate_no_script_tags",[1050,4065,4066],{"class":1067},"],\n",[1050,4068,4069,4072,4074,4076,4078,4081,4083,4086,4089,4091,4093,4095,4097,4099,4102,4104],{"class":1052,"line":2042},[1050,4070,4071],{"class":1720},"        widget",[1050,4073,1523],{"class":1067},[1050,4075,2357],{"class":1526},[1050,4077,1352],{"class":1067},[1050,4079,4080],{"class":1526},"TextInput",[1050,4082,1464],{"class":1067},[1050,4084,4085],{"class":1720},"attrs",[1050,4087,4088],{"class":1067},"={",[1050,4090,1085],{"class":1077},[1050,4092,1738],{"class":1081},[1050,4094,1085],{"class":1077},[1050,4096,1666],{"class":1067},[1050,4098,1222],{"class":1077},[1050,4100,4101],{"class":1081},"form-control",[1050,4103,1085],{"class":1077},[1050,4105,1835],{"class":1067},[1050,4107,4108],{"class":1052,"line":2047},[1050,4109,4110],{"class":1067},"    )\n",[1050,4112,4113],{"class":1052,"line":2053},[1050,4114,1626],{"class":1348},[1050,4116,4117,4120,4122,4124,4126,4129],{"class":1052,"line":2059},[1050,4118,4119],{"class":1348},"    email ",[1050,4121,1523],{"class":1067},[1050,4123,2387],{"class":1348},[1050,4125,1352],{"class":1067},[1050,4127,4128],{"class":1526},"EmailField",[1050,4130,4040],{"class":1067},[1050,4132,4133,4135,4137,4139,4141,4144,4146,4148,4150,4152,4154,4156,4158,4160,4162,4164],{"class":1052,"line":2065},[1050,4134,4071],{"class":1720},[1050,4136,1523],{"class":1067},[1050,4138,2357],{"class":1526},[1050,4140,1352],{"class":1067},[1050,4142,4143],{"class":1526},"EmailInput",[1050,4145,1464],{"class":1067},[1050,4147,4085],{"class":1720},[1050,4149,4088],{"class":1067},[1050,4151,1085],{"class":1077},[1050,4153,1738],{"class":1081},[1050,4155,1085],{"class":1077},[1050,4157,1666],{"class":1067},[1050,4159,1222],{"class":1077},[1050,4161,4101],{"class":1081},[1050,4163,1085],{"class":1077},[1050,4165,1835],{"class":1067},[1050,4167,4168],{"class":1052,"line":2071},[1050,4169,4110],{"class":1067},[1050,4171,4172],{"class":1052,"line":2077},[1050,4173,1626],{"class":1348},[1050,4175,4176,4179,4181,4183,4185,4187],{"class":1052,"line":2083},[1050,4177,4178],{"class":1348},"    phone ",[1050,4180,1523],{"class":1067},[1050,4182,2387],{"class":1348},[1050,4184,1352],{"class":1067},[1050,4186,2392],{"class":1526},[1050,4188,4040],{"class":1067},[1050,4190,4191,4193,4195,4198],{"class":1052,"line":2089},[1050,4192,4045],{"class":1720},[1050,4194,1523],{"class":1067},[1050,4196,4197],{"class":1241},"20",[1050,4199,1088],{"class":1067},[1050,4201,4202,4204,4206,4209],{"class":1052,"line":2095},[1050,4203,4057],{"class":1720},[1050,4205,4060],{"class":1067},[1050,4207,4208],{"class":1526},"validate_phone_number",[1050,4210,4066],{"class":1067},[1050,4212,4213,4216,4218,4220],{"class":1052,"line":2101},[1050,4214,4215],{"class":1720},"        required",[1050,4217,1523],{"class":1067},[1050,4219,2417],{"class":1194},[1050,4221,1088],{"class":1067},[1050,4223,4224,4226,4228,4230,4232,4234,4236,4238,4240,4242,4244,4246,4248,4250,4252,4254],{"class":1052,"line":2107},[1050,4225,4071],{"class":1720},[1050,4227,1523],{"class":1067},[1050,4229,2357],{"class":1526},[1050,4231,1352],{"class":1067},[1050,4233,4080],{"class":1526},[1050,4235,1464],{"class":1067},[1050,4237,4085],{"class":1720},[1050,4239,4088],{"class":1067},[1050,4241,1085],{"class":1077},[1050,4243,1738],{"class":1081},[1050,4245,1085],{"class":1077},[1050,4247,1666],{"class":1067},[1050,4249,1222],{"class":1077},[1050,4251,4101],{"class":1081},[1050,4253,1085],{"class":1077},[1050,4255,1835],{"class":1067},[1050,4257,4258],{"class":1052,"line":2113},[1050,4259,4110],{"class":1067},[1050,4261,4262],{"class":1052,"line":2118},[1050,4263,1626],{"class":1348},[1050,4265,4266,4269,4271,4273,4275,4278],{"class":1052,"line":2124},[1050,4267,4268],{"class":1348},"    website ",[1050,4270,1523],{"class":1067},[1050,4272,2387],{"class":1348},[1050,4274,1352],{"class":1067},[1050,4276,4277],{"class":1526},"URLField",[1050,4279,4040],{"class":1067},[1050,4281,4282,4284,4286,4289],{"class":1052,"line":2130},[1050,4283,4057],{"class":1720},[1050,4285,4060],{"class":1067},[1050,4287,4288],{"class":1526},"validate_url_safety",[1050,4290,4066],{"class":1067},[1050,4292,4293,4295,4297,4299],{"class":1052,"line":2136},[1050,4294,4215],{"class":1720},[1050,4296,1523],{"class":1067},[1050,4298,2417],{"class":1194},[1050,4300,1088],{"class":1067},[1050,4302,4303,4305,4307,4309,4311,4314,4316,4318,4320,4322,4324,4326,4328,4330,4332,4334],{"class":1052,"line":2141},[1050,4304,4071],{"class":1720},[1050,4306,1523],{"class":1067},[1050,4308,2357],{"class":1526},[1050,4310,1352],{"class":1067},[1050,4312,4313],{"class":1526},"URLInput",[1050,4315,1464],{"class":1067},[1050,4317,4085],{"class":1720},[1050,4319,4088],{"class":1067},[1050,4321,1085],{"class":1077},[1050,4323,1738],{"class":1081},[1050,4325,1085],{"class":1077},[1050,4327,1666],{"class":1067},[1050,4329,1222],{"class":1077},[1050,4331,4101],{"class":1081},[1050,4333,1085],{"class":1077},[1050,4335,1835],{"class":1067},[1050,4337,4338],{"class":1052,"line":2147},[1050,4339,4110],{"class":1067},[1050,4341,4342],{"class":1052,"line":2153},[1050,4343,1626],{"class":1348},[1050,4345,4346,4349,4351,4353,4355,4357],{"class":1052,"line":2159},[1050,4347,4348],{"class":1348},"    message ",[1050,4350,1523],{"class":1067},[1050,4352,2387],{"class":1348},[1050,4354,1352],{"class":1067},[1050,4356,2392],{"class":1526},[1050,4358,4040],{"class":1067},[1050,4360,4361,4363,4365,4367,4369,4371],{"class":1052,"line":2165},[1050,4362,4057],{"class":1720},[1050,4364,4060],{"class":1067},[1050,4366,4063],{"class":1526},[1050,4368,1125],{"class":1067},[1050,4370,3147],{"class":1526},[1050,4372,4066],{"class":1067},[1050,4374,4375,4377,4379,4381,4383,4386,4388,4390,4392,4394,4396,4398,4400,4402,4404,4406,4408,4410,4413,4415,4417,4420],{"class":1052,"line":2171},[1050,4376,4071],{"class":1720},[1050,4378,1523],{"class":1067},[1050,4380,2357],{"class":1526},[1050,4382,1352],{"class":1067},[1050,4384,4385],{"class":1526},"Textarea",[1050,4387,1464],{"class":1067},[1050,4389,4085],{"class":1720},[1050,4391,4088],{"class":1067},[1050,4393,1085],{"class":1077},[1050,4395,1738],{"class":1081},[1050,4397,1085],{"class":1077},[1050,4399,1666],{"class":1067},[1050,4401,1222],{"class":1077},[1050,4403,4101],{"class":1081},[1050,4405,1085],{"class":1077},[1050,4407,1125],{"class":1067},[1050,4409,1222],{"class":1077},[1050,4411,4412],{"class":1081},"rows",[1050,4414,1085],{"class":1077},[1050,4416,1666],{"class":1067},[1050,4418,4419],{"class":1241}," 5",[1050,4421,1835],{"class":1067},[1050,4423,4424],{"class":1052,"line":2177},[1050,4425,4110],{"class":1067},[1050,4427,4428],{"class":1052,"line":2183},[1050,4429,1626],{"class":1348},[1050,4431,4432,4435,4437,4439,4441,4444],{"class":1052,"line":2189},[1050,4433,4434],{"class":1348},"    attachment ",[1050,4436,1523],{"class":1067},[1050,4438,2387],{"class":1348},[1050,4440,1352],{"class":1067},[1050,4442,4443],{"class":1526},"FileField",[1050,4445,4040],{"class":1067},[1050,4447,4448,4450,4452,4455],{"class":1052,"line":2195},[1050,4449,4057],{"class":1720},[1050,4451,4060],{"class":1067},[1050,4453,4454],{"class":1526},"validate_safe_filename",[1050,4456,4066],{"class":1067},[1050,4458,4459,4461,4463,4465],{"class":1052,"line":2200},[1050,4460,4215],{"class":1720},[1050,4462,1523],{"class":1067},[1050,4464,2417],{"class":1194},[1050,4466,1088],{"class":1067},[1050,4468,4469,4471,4473,4475,4477,4480,4482,4484,4486,4488,4490,4492,4494,4496,4498,4500],{"class":1052,"line":2205},[1050,4470,4071],{"class":1720},[1050,4472,1523],{"class":1067},[1050,4474,2357],{"class":1526},[1050,4476,1352],{"class":1067},[1050,4478,4479],{"class":1526},"FileInput",[1050,4481,1464],{"class":1067},[1050,4483,4085],{"class":1720},[1050,4485,4088],{"class":1067},[1050,4487,1085],{"class":1077},[1050,4489,1738],{"class":1081},[1050,4491,1085],{"class":1077},[1050,4493,1666],{"class":1067},[1050,4495,1222],{"class":1077},[1050,4497,4101],{"class":1081},[1050,4499,1085],{"class":1077},[1050,4501,1835],{"class":1067},[1050,4503,4504],{"class":1052,"line":2211},[1050,4505,4110],{"class":1067},[1050,4507,4508],{"class":1052,"line":2217},[1050,4509,1626],{"class":1348},[1050,4511,4512,4514,4517,4519,4521],{"class":1052,"line":2223},[1050,4513,1771],{"class":1457},[1050,4515,4516],{"class":1450}," clean_name",[1050,4518,1464],{"class":1067},[1050,4520,1780],{"class":1779},[1050,4522,1471],{"class":1067},[1050,4524,4525,4527,4530],{"class":1052,"line":2229},[1050,4526,2572],{"class":1477},[1050,4528,4529],{"class":1481},"Additional name validation and sanitization",[1050,4531,1485],{"class":1477},[1050,4533,4534,4537,4539,4541,4543,4545,4547,4549,4552,4554],{"class":1052,"line":2235},[1050,4535,4536],{"class":1348},"        name ",[1050,4538,1523],{"class":1067},[1050,4540,2587],{"class":1063},[1050,4542,1352],{"class":1067},[1050,4544,1578],{"class":1499},[1050,4546,2528],{"class":1067},[1050,4548,1085],{"class":1077},[1050,4550,4551],{"class":1081},"name",[1050,4553,1085],{"class":1077},[1050,4555,1170],{"class":1067},[1050,4557,4558],{"class":1052,"line":2241},[1050,4559,2508],{"class":1348},[1050,4561,4562],{"class":1052,"line":2246},[1050,4563,4564],{"class":1056},"        # Strip HTML tags\n",[1050,4566,4567,4569,4571,4574,4576,4578],{"class":1052,"line":2252},[1050,4568,4536],{"class":1348},[1050,4570,1523],{"class":1067},[1050,4572,4573],{"class":1526}," strip_tags",[1050,4575,1464],{"class":1067},[1050,4577,4551],{"class":1526},[1050,4579,1539],{"class":1067},[1050,4581,4582],{"class":1052,"line":2258},[1050,4583,2508],{"class":1348},[1050,4585,4586],{"class":1052,"line":2263},[1050,4587,4588],{"class":1056},"        # Remove excessive whitespace\n",[1050,4590,4591,4593,4595,4597,4599,4601,4604,4606,4608,4610,4613],{"class":1052,"line":2268},[1050,4592,4536],{"class":1348},[1050,4594,1523],{"class":1067},[1050,4596,1222],{"class":1077},[1050,4598,1222],{"class":1077},[1050,4600,1352],{"class":1067},[1050,4602,4603],{"class":1526},"join",[1050,4605,1464],{"class":1067},[1050,4607,4551],{"class":1526},[1050,4609,1352],{"class":1067},[1050,4611,4612],{"class":1526},"split",[1050,4614,4615],{"class":1067},"())\n",[1050,4617,4618],{"class":1052,"line":2274},[1050,4619,2508],{"class":1348},[1050,4621,4623],{"class":1052,"line":4622},111,[1050,4624,4625],{"class":1056},"        # Check for minimum length\n",[1050,4627,4629,4631,4633,4635,4637,4639,4642,4645],{"class":1052,"line":4628},112,[1050,4630,1545],{"class":1344},[1050,4632,3602],{"class":2430},[1050,4634,1464],{"class":1067},[1050,4636,4551],{"class":1526},[1050,4638,2846],{"class":1067},[1050,4640,4641],{"class":1503}," \u003C",[1050,4643,4644],{"class":1241}," 2",[1050,4646,1514],{"class":1067},[1050,4648,4650,4652,4654,4656,4658,4661,4663],{"class":1052,"line":4649},113,[1050,4651,3330],{"class":1344},[1050,4653,2665],{"class":1526},[1050,4655,1464],{"class":1067},[1050,4657,1085],{"class":1077},[1050,4659,4660],{"class":1081},"Name must be at least 2 characters long.",[1050,4662,1085],{"class":1077},[1050,4664,1539],{"class":1067},[1050,4666,4668],{"class":1052,"line":4667},114,[1050,4669,2508],{"class":1348},[1050,4671,4673],{"class":1052,"line":4672},115,[1050,4674,4675],{"class":1056},"        # Check for valid characters\n",[1050,4677,4679,4681,4683,4685,4687,4689,4691,4693,4695,4697,4699,4702,4705,4708,4710,4712,4714,4716,4718,4720],{"class":1052,"line":4678},116,[1050,4680,1545],{"class":1344},[1050,4682,3881],{"class":1503},[1050,4684,3824],{"class":1348},[1050,4686,1352],{"class":1067},[1050,4688,3888],{"class":1526},[1050,4690,1464],{"class":1067},[1050,4692,3834],{"class":1457},[1050,4694,1085],{"class":1077},[1050,4696,3842],{"class":3845},[1050,4698,2528],{"class":3839},[1050,4700,4701],{"class":3849},"a-zA-Z",[1050,4703,4704],{"class":3845},"\\s",[1050,4706,4707],{"class":3899},"\\-\\'\\.",[1050,4709,3853],{"class":3839},[1050,4711,3850],{"class":3903},[1050,4713,3920],{"class":3845},[1050,4715,1085],{"class":1077},[1050,4717,1125],{"class":1067},[1050,4719,1721],{"class":1526},[1050,4721,1471],{"class":1067},[1050,4723,4725,4727,4729,4731,4733,4736,4738],{"class":1052,"line":4724},117,[1050,4726,3330],{"class":1344},[1050,4728,2665],{"class":1526},[1050,4730,1464],{"class":1067},[1050,4732,1085],{"class":1077},[1050,4734,4735],{"class":1081},"Name contains invalid characters.",[1050,4737,1085],{"class":1077},[1050,4739,1539],{"class":1067},[1050,4741,4743],{"class":1052,"line":4742},118,[1050,4744,2508],{"class":1348},[1050,4746,4748,4750],{"class":1052,"line":4747},119,[1050,4749,1803],{"class":1344},[1050,4751,4752],{"class":1348}," name\n",[1050,4754,4756],{"class":1052,"line":4755},120,[1050,4757,1626],{"class":1348},[1050,4759,4761,4763,4766,4768,4770],{"class":1052,"line":4760},121,[1050,4762,1771],{"class":1457},[1050,4764,4765],{"class":1450}," clean_message",[1050,4767,1464],{"class":1067},[1050,4769,1780],{"class":1779},[1050,4771,1471],{"class":1067},[1050,4773,4775,4777,4780],{"class":1052,"line":4774},122,[1050,4776,2572],{"class":1477},[1050,4778,4779],{"class":1481},"Sanitize message content",[1050,4781,1485],{"class":1477},[1050,4783,4785,4788,4790,4792,4794,4796,4798,4800,4803,4805],{"class":1052,"line":4784},123,[1050,4786,4787],{"class":1348},"        message ",[1050,4789,1523],{"class":1067},[1050,4791,2587],{"class":1063},[1050,4793,1352],{"class":1067},[1050,4795,1578],{"class":1499},[1050,4797,2528],{"class":1067},[1050,4799,1085],{"class":1077},[1050,4801,4802],{"class":1081},"message",[1050,4804,1085],{"class":1077},[1050,4806,1170],{"class":1067},[1050,4808,4810],{"class":1052,"line":4809},124,[1050,4811,2508],{"class":1348},[1050,4813,4815],{"class":1052,"line":4814},125,[1050,4816,4817],{"class":1056},"        # Allow only safe HTML tags\n",[1050,4819,4821,4824,4826,4828,4830,4832,4834,4836,4838,4841,4843,4845,4847,4850,4852,4854,4856,4859,4861,4863,4865,4868,4870],{"class":1052,"line":4820},126,[1050,4822,4823],{"class":1348},"        allowed_tags ",[1050,4825,1523],{"class":1067},[1050,4827,3466],{"class":1067},[1050,4829,1085],{"class":1077},[1050,4831,1026],{"class":1081},[1050,4833,1085],{"class":1077},[1050,4835,1125],{"class":1067},[1050,4837,1222],{"class":1077},[1050,4839,4840],{"class":1081},"br",[1050,4842,1085],{"class":1077},[1050,4844,1125],{"class":1067},[1050,4846,1222],{"class":1077},[1050,4848,4849],{"class":1081},"strong",[1050,4851,1085],{"class":1077},[1050,4853,1125],{"class":1067},[1050,4855,1222],{"class":1077},[1050,4857,4858],{"class":1081},"em",[1050,4860,1085],{"class":1077},[1050,4862,1125],{"class":1067},[1050,4864,1222],{"class":1077},[1050,4866,4867],{"class":1081},"u",[1050,4869,1085],{"class":1077},[1050,4871,1170],{"class":1067},[1050,4873,4875,4878,4880],{"class":1052,"line":4874},127,[1050,4876,4877],{"class":1348},"        allowed_attributes ",[1050,4879,1523],{"class":1067},[1050,4881,4882],{"class":1067}," {}\n",[1050,4884,4886],{"class":1052,"line":4885},128,[1050,4887,2508],{"class":1348},[1050,4889,4891],{"class":1052,"line":4890},129,[1050,4892,4893],{"class":1056},"        # Clean HTML\n",[1050,4895,4897,4900,4902,4905,4907,4910],{"class":1052,"line":4896},130,[1050,4898,4899],{"class":1348},"        clean_message ",[1050,4901,1523],{"class":1067},[1050,4903,4904],{"class":1348}," bleach",[1050,4906,1352],{"class":1067},[1050,4908,4909],{"class":1526},"clean",[1050,4911,4040],{"class":1067},[1050,4913,4915,4918],{"class":1052,"line":4914},131,[1050,4916,4917],{"class":1526},"            message",[1050,4919,1088],{"class":1067},[1050,4921,4923,4926,4928,4931],{"class":1052,"line":4922},132,[1050,4924,4925],{"class":1720},"            tags",[1050,4927,1523],{"class":1067},[1050,4929,4930],{"class":1526},"allowed_tags",[1050,4932,1088],{"class":1067},[1050,4934,4936,4939,4941,4944],{"class":1052,"line":4935},133,[1050,4937,4938],{"class":1720},"            attributes",[1050,4940,1523],{"class":1067},[1050,4942,4943],{"class":1526},"allowed_attributes",[1050,4945,1088],{"class":1067},[1050,4947,4949,4952,4954],{"class":1052,"line":4948},134,[1050,4950,4951],{"class":1720},"            strip",[1050,4953,1523],{"class":1067},[1050,4955,4956],{"class":1194},"True\n",[1050,4958,4960],{"class":1052,"line":4959},135,[1050,4961,4962],{"class":1067},"        )\n",[1050,4964,4966],{"class":1052,"line":4965},136,[1050,4967,2508],{"class":1348},[1050,4969,4971],{"class":1052,"line":4970},137,[1050,4972,4973],{"class":1056},"        # Check minimum length\n",[1050,4975,4977,4979,4981,4983,4986,4988,4991,4994,4996,4999],{"class":1052,"line":4976},138,[1050,4978,1545],{"class":1344},[1050,4980,3602],{"class":2430},[1050,4982,1464],{"class":1067},[1050,4984,4985],{"class":1526},"strip_tags",[1050,4987,1464],{"class":1067},[1050,4989,4990],{"class":1526},"clean_message",[1050,4992,4993],{"class":1067},"))",[1050,4995,4641],{"class":1503},[1050,4997,4998],{"class":1241}," 10",[1050,5000,1514],{"class":1067},[1050,5002,5004,5006,5008,5010,5012,5015,5017],{"class":1052,"line":5003},139,[1050,5005,3330],{"class":1344},[1050,5007,2665],{"class":1526},[1050,5009,1464],{"class":1067},[1050,5011,1085],{"class":1077},[1050,5013,5014],{"class":1081},"Message must be at least 10 characters long.",[1050,5016,1085],{"class":1077},[1050,5018,1539],{"class":1067},[1050,5020,5022],{"class":1052,"line":5021},140,[1050,5023,2508],{"class":1348},[1050,5025,5027,5029],{"class":1052,"line":5026},141,[1050,5028,1803],{"class":1344},[1050,5030,5031],{"class":1348}," clean_message\n",[1050,5033,5035],{"class":1052,"line":5034},142,[1050,5036,1626],{"class":1348},[1050,5038,5040,5042,5045,5047,5049],{"class":1052,"line":5039},143,[1050,5041,1771],{"class":1457},[1050,5043,5044],{"class":1450}," clean_attachment",[1050,5046,1464],{"class":1067},[1050,5048,1780],{"class":1779},[1050,5050,1471],{"class":1067},[1050,5052,5054,5056,5059],{"class":1052,"line":5053},144,[1050,5055,2572],{"class":1477},[1050,5057,5058],{"class":1481},"Validate file upload security",[1050,5060,1485],{"class":1477},[1050,5062,5064,5067,5069,5071,5073,5075,5077,5079,5081,5083,5086,5088],{"class":1052,"line":5063},145,[1050,5065,5066],{"class":1348},"        attachment ",[1050,5068,1523],{"class":1067},[1050,5070,2587],{"class":1063},[1050,5072,1352],{"class":1067},[1050,5074,1578],{"class":1499},[1050,5076,1352],{"class":1067},[1050,5078,2596],{"class":1526},[1050,5080,1464],{"class":1067},[1050,5082,1085],{"class":1077},[1050,5084,5085],{"class":1081},"attachment",[1050,5087,1085],{"class":1077},[1050,5089,1539],{"class":1067},[1050,5091,5093],{"class":1052,"line":5092},146,[1050,5094,2508],{"class":1348},[1050,5096,5098,5100,5103],{"class":1052,"line":5097},147,[1050,5099,1545],{"class":1344},[1050,5101,5102],{"class":1348}," attachment",[1050,5104,1514],{"class":1067},[1050,5106,5108],{"class":1052,"line":5107},148,[1050,5109,5110],{"class":1056},"            # Check file size (5MB limit)\n",[1050,5112,5114,5116,5118,5120,5123,5125,5127,5129,5132,5134,5136],{"class":1052,"line":5113},149,[1050,5115,2646],{"class":1344},[1050,5117,5102],{"class":1348},[1050,5119,1352],{"class":1067},[1050,5121,5122],{"class":1499},"size",[1050,5124,3611],{"class":1503},[1050,5126,4419],{"class":1241},[1050,5128,2449],{"class":1503},[1050,5130,5131],{"class":1241}," 1024",[1050,5133,2449],{"class":1503},[1050,5135,5131],{"class":1241},[1050,5137,1514],{"class":1067},[1050,5139,5141,5143,5145,5147,5149,5152,5154],{"class":1052,"line":5140},150,[1050,5142,2662],{"class":1344},[1050,5144,2665],{"class":1526},[1050,5146,1464],{"class":1067},[1050,5148,1085],{"class":1077},[1050,5150,5151],{"class":1081},"File size cannot exceed 5MB.",[1050,5153,1085],{"class":1077},[1050,5155,1539],{"class":1067},[1050,5157,5159],{"class":1052,"line":5158},151,[1050,5160,5161],{"class":1348},"            \n",[1050,5163,5165],{"class":1052,"line":5164},152,[1050,5166,5167],{"class":1056},"            # Check MIME type\n",[1050,5169,5171,5174,5176],{"class":1052,"line":5170},153,[1050,5172,5173],{"class":1348},"            allowed_types ",[1050,5175,1523],{"class":1067},[1050,5177,1071],{"class":1067},[1050,5179,5181,5184,5187,5189],{"class":1052,"line":5180},154,[1050,5182,5183],{"class":1077},"                '",[1050,5185,5186],{"class":1081},"text/plain",[1050,5188,1085],{"class":1077},[1050,5190,1088],{"class":1067},[1050,5192,5194,5196,5199,5201],{"class":1052,"line":5193},155,[1050,5195,5183],{"class":1077},[1050,5197,5198],{"class":1081},"application/pdf",[1050,5200,1085],{"class":1077},[1050,5202,1088],{"class":1067},[1050,5204,5206,5208,5211,5213],{"class":1052,"line":5205},156,[1050,5207,5183],{"class":1077},[1050,5209,5210],{"class":1081},"image/jpeg",[1050,5212,1085],{"class":1077},[1050,5214,1088],{"class":1067},[1050,5216,5218,5220,5223,5225],{"class":1052,"line":5217},157,[1050,5219,5183],{"class":1077},[1050,5221,5222],{"class":1081},"image/png",[1050,5224,1085],{"class":1077},[1050,5226,1088],{"class":1067},[1050,5228,5230,5232,5235],{"class":1052,"line":5229},158,[1050,5231,5183],{"class":1077},[1050,5233,5234],{"class":1081},"image/gif",[1050,5236,2976],{"class":1077},[1050,5238,5240],{"class":1052,"line":5239},159,[1050,5241,5242],{"class":1067},"            ]\n",[1050,5244,5246],{"class":1052,"line":5245},160,[1050,5247,5161],{"class":1348},[1050,5249,5251,5253,5255,5257,5260,5262,5264,5267],{"class":1052,"line":5250},161,[1050,5252,2646],{"class":1344},[1050,5254,5102],{"class":1348},[1050,5256,1352],{"class":1067},[1050,5258,5259],{"class":1499},"content_type",[1050,5261,3881],{"class":1503},[1050,5263,3087],{"class":1503},[1050,5265,5266],{"class":1348}," allowed_types",[1050,5268,1514],{"class":1067},[1050,5270,5272,5274,5276,5278,5280,5282,5284],{"class":1052,"line":5271},162,[1050,5273,2662],{"class":1344},[1050,5275,2665],{"class":1526},[1050,5277,1464],{"class":1067},[1050,5279,1085],{"class":1077},[1050,5281,3582],{"class":1081},[1050,5283,1085],{"class":1077},[1050,5285,1539],{"class":1067},[1050,5287,5289],{"class":1052,"line":5288},163,[1050,5290,5161],{"class":1348},[1050,5292,5294],{"class":1052,"line":5293},164,[1050,5295,5296],{"class":1056},"            # Scan file content for malicious patterns\n",[1050,5298,5300,5302,5304,5307,5309,5311],{"class":1052,"line":5299},165,[1050,5301,1896],{"class":1063},[1050,5303,1352],{"class":1067},[1050,5305,5306],{"class":1526},"scan_file_content",[1050,5308,1464],{"class":1067},[1050,5310,5085],{"class":1526},[1050,5312,1539],{"class":1067},[1050,5314,5316],{"class":1052,"line":5315},166,[1050,5317,2508],{"class":1348},[1050,5319,5321,5323],{"class":1052,"line":5320},167,[1050,5322,1803],{"class":1344},[1050,5324,5325],{"class":1348}," attachment\n",[1050,5327,5329],{"class":1052,"line":5328},168,[1050,5330,1626],{"class":1348},[1050,5332,5334,5336,5339,5341,5343,5345,5348],{"class":1052,"line":5333},169,[1050,5335,1771],{"class":1457},[1050,5337,5338],{"class":1450}," scan_file_content",[1050,5340,1464],{"class":1067},[1050,5342,1780],{"class":1779},[1050,5344,1125],{"class":1067},[1050,5346,5347],{"class":1467}," file",[1050,5349,1471],{"class":1067},[1050,5351,5353,5355,5358],{"class":1052,"line":5352},170,[1050,5354,2572],{"class":1477},[1050,5356,5357],{"class":1481},"Basic file content scanning",[1050,5359,1485],{"class":1477},[1050,5361,5363],{"class":1052,"line":5362},171,[1050,5364,5365],{"class":1056},"        # Read first 1KB for scanning\n",[1050,5367,5369,5373,5375,5378,5380,5383],{"class":1052,"line":5368},172,[1050,5370,5372],{"class":5371},"sSC40","        file",[1050,5374,1352],{"class":1067},[1050,5376,5377],{"class":1526},"seek",[1050,5379,1464],{"class":1067},[1050,5381,5382],{"class":1241},"0",[1050,5384,1539],{"class":1067},[1050,5386,5388,5391,5393,5395,5397,5400,5402,5405,5408,5411,5413,5415,5418,5420,5422,5425,5427,5429,5432,5434],{"class":1052,"line":5387},173,[1050,5389,5390],{"class":1348},"        content ",[1050,5392,1523],{"class":1067},[1050,5394,5347],{"class":5371},[1050,5396,1352],{"class":1067},[1050,5398,5399],{"class":1526},"read",[1050,5401,1464],{"class":1067},[1050,5403,5404],{"class":1241},"1024",[1050,5406,5407],{"class":1067},").",[1050,5409,5410],{"class":1526},"decode",[1050,5412,1464],{"class":1067},[1050,5414,1085],{"class":1077},[1050,5416,5417],{"class":1081},"utf-8",[1050,5419,1085],{"class":1077},[1050,5421,1125],{"class":1067},[1050,5423,5424],{"class":1720}," errors",[1050,5426,1523],{"class":1067},[1050,5428,1085],{"class":1077},[1050,5430,5431],{"class":1081},"ignore",[1050,5433,1085],{"class":1077},[1050,5435,1539],{"class":1067},[1050,5437,5439,5441,5443,5445,5447,5449,5451],{"class":1052,"line":5438},174,[1050,5440,5372],{"class":5371},[1050,5442,1352],{"class":1067},[1050,5444,5377],{"class":1526},[1050,5446,1464],{"class":1067},[1050,5448,5382],{"class":1241},[1050,5450,2846],{"class":1067},[1050,5452,5453],{"class":1056},"  # Reset file pointer\n",[1050,5455,5457],{"class":1052,"line":5456},175,[1050,5458,2508],{"class":1348},[1050,5460,5462],{"class":1052,"line":5461},176,[1050,5463,5464],{"class":1056},"        # Check for suspicious patterns\n",[1050,5466,5468,5471,5473],{"class":1052,"line":5467},177,[1050,5469,5470],{"class":1348},"        suspicious_patterns ",[1050,5472,1523],{"class":1067},[1050,5474,1071],{"class":1067},[1050,5476,5478,5481,5483,5486,5488,5490,5493,5495,5497,5499,5501],{"class":1052,"line":5477},178,[1050,5479,5480],{"class":1457},"            r",[1050,5482,1085],{"class":1077},[1050,5484,3082],{"class":5485},"s27EL",[1050,5487,2528],{"class":3839},[1050,5489,3842],{"class":1503},[1050,5491,5492],{"class":3849},">",[1050,5494,3853],{"class":3839},[1050,5496,2493],{"class":3903},[1050,5498,5492],{"class":5485},[1050,5500,1085],{"class":1077},[1050,5502,1088],{"class":1067},[1050,5504,5506,5508,5510,5512,5514],{"class":1052,"line":5505},179,[1050,5507,5480],{"class":1457},[1050,5509,1085],{"class":1077},[1050,5511,3678],{"class":5485},[1050,5513,1085],{"class":1077},[1050,5515,1088],{"class":1067},[1050,5517,5519,5521,5523,5526,5528,5530,5533,5535],{"class":1052,"line":5518},180,[1050,5520,5480],{"class":1457},[1050,5522,1085],{"class":1077},[1050,5524,5525],{"class":5485},"eval",[1050,5527,4704],{"class":3845},[1050,5529,2493],{"class":3903},[1050,5531,5532],{"class":3899},"\\(",[1050,5534,1085],{"class":1077},[1050,5536,1088],{"class":1067},[1050,5538,5540,5542,5544,5547,5550,5553,5555],{"class":1052,"line":5539},181,[1050,5541,5480],{"class":1457},[1050,5543,1085],{"class":1077},[1050,5545,5546],{"class":5485},"document",[1050,5548,5549],{"class":3899},"\\.",[1050,5551,5552],{"class":5485},"write",[1050,5554,1085],{"class":1077},[1050,5556,1088],{"class":1067},[1050,5558,5560,5562,5564,5567,5569,5571,5573,5575,5577,5579,5581],{"class":1052,"line":5559},182,[1050,5561,5480],{"class":1457},[1050,5563,1085],{"class":1077},[1050,5565,5566],{"class":5485},"\u003Ciframe",[1050,5568,2528],{"class":3839},[1050,5570,3842],{"class":1503},[1050,5572,5492],{"class":3849},[1050,5574,3853],{"class":3839},[1050,5576,2493],{"class":3903},[1050,5578,5492],{"class":5485},[1050,5580,1085],{"class":1077},[1050,5582,1088],{"class":1067},[1050,5584,5586],{"class":1052,"line":5585},183,[1050,5587,5588],{"class":1067},"        ]\n",[1050,5590,5592],{"class":1052,"line":5591},184,[1050,5593,2508],{"class":1348},[1050,5595,5597,5600,5603,5605,5608],{"class":1052,"line":5596},185,[1050,5598,5599],{"class":1344},"        for",[1050,5601,5602],{"class":1348}," pattern ",[1050,5604,3307],{"class":1344},[1050,5606,5607],{"class":1348}," suspicious_patterns",[1050,5609,1514],{"class":1067},[1050,5611,5613,5615,5617,5619,5622,5624,5627,5629,5632,5634,5636,5638,5641],{"class":1052,"line":5612},186,[1050,5614,2646],{"class":1344},[1050,5616,3824],{"class":1348},[1050,5618,1352],{"class":1067},[1050,5620,5621],{"class":1526},"search",[1050,5623,1464],{"class":1067},[1050,5625,5626],{"class":1526},"pattern",[1050,5628,1125],{"class":1067},[1050,5630,5631],{"class":1526}," content",[1050,5633,1125],{"class":1067},[1050,5635,3824],{"class":1526},[1050,5637,1352],{"class":1067},[1050,5639,5640],{"class":1536},"IGNORECASE",[1050,5642,1471],{"class":1067},[1050,5644,5646,5648,5650,5652,5654,5657,5659],{"class":1052,"line":5645},187,[1050,5647,2662],{"class":1344},[1050,5649,2665],{"class":1526},[1050,5651,1464],{"class":1067},[1050,5653,1085],{"class":1077},[1050,5655,5656],{"class":1081},"File contains potentially malicious content.",[1050,5658,1085],{"class":1077},[1050,5660,1539],{"class":1067},[1030,5662,5664],{"id":5663},"rate-limiting-and-abuse-prevention","Rate Limiting and Abuse Prevention",[1035,5666,5668],{"id":5667},"form-submission-rate-limiting","Form Submission Rate Limiting",[1040,5670,5672],{"className":1042,"code":5671,"language":1044,"meta":1045,"style":1045},"# utils.py - Rate limiting utilities\nimport time\nfrom django.core.cache import cache\nfrom django.http import HttpResponseTooManyRequests\nfrom django.utils.decorators import method_decorator\nfrom functools import wraps\n\nclass RateLimiter:\n    \"\"\"Rate limiting utility\"\"\"\n    \n    def __init__(self, key_prefix='rate_limit', window=3600, max_requests=10):\n        self.key_prefix = key_prefix\n        self.window = window  # Time window in seconds\n        self.max_requests = max_requests\n    \n    def get_cache_key(self, identifier):\n        \"\"\"Generate cache key for rate limiting\"\"\"\n        return f'{self.key_prefix}:{identifier}'\n    \n    def is_rate_limited(self, identifier):\n        \"\"\"Check if identifier is rate limited\"\"\"\n        cache_key = self.get_cache_key(identifier)\n        \n        # Get current request count and timestamps\n        requests = cache.get(cache_key, [])\n        now = time.time()\n        \n        # Remove old requests outside the window\n        requests = [req_time for req_time in requests if now - req_time \u003C self.window]\n        \n        # Check if limit exceeded\n        if len(requests) >= self.max_requests:\n            return True, self.window - (now - requests[0])  # Time until reset\n        \n        # Add current request\n        requests.append(now)\n        cache.set(cache_key, requests, self.window)\n        \n        return False, 0\n    \n    def get_remaining_requests(self, identifier):\n        \"\"\"Get remaining requests for identifier\"\"\"\n        cache_key = self.get_cache_key(identifier)\n        requests = cache.get(cache_key, [])\n        now = time.time()\n        \n        # Count recent requests\n        recent_requests = [req for req in requests if now - req \u003C self.window]\n        return max(0, self.max_requests - len(recent_requests))\n\ndef rate_limit(key_func=None, window=3600, max_requests=10):\n    \"\"\"Rate limiting decorator\"\"\"\n    \n    def decorator(view_func):\n        @wraps(view_func)\n        def wrapper(request, *args, **kwargs):\n            # Generate rate limit key\n            if key_func:\n                identifier = key_func(request)\n            else:\n                identifier = get_client_ip(request)\n            \n            limiter = RateLimiter(\n                key_prefix=f'rate_limit_{view_func.__name__}',\n                window=window,\n                max_requests=max_requests\n            )\n            \n            is_limited, reset_time = limiter.is_rate_limited(identifier)\n            \n            if is_limited:\n                response = HttpResponseTooManyRequests(\n                    'Rate limit exceeded. Try again later.'\n                )\n                response['Retry-After'] = str(int(reset_time))\n                return response\n            \n            return view_func(request, *args, **kwargs)\n        \n        return wrapper\n    return decorator\n\ndef get_client_ip(request):\n    \"\"\"Get client IP address\"\"\"\n    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')\n    if x_forwarded_for:\n        return x_forwarded_for.split(',')[0].strip()\n    return request.META.get('REMOTE_ADDR')\n\ndef user_rate_limit_key(request):\n    \"\"\"Generate rate limit key based on user\"\"\"\n    if request.user.is_authenticated:\n        return f'user_{request.user.id}'\n    return get_client_ip(request)\n\n# views.py - Rate limited views\nfrom django.shortcuts import render, redirect\nfrom django.contrib import messages\nfrom .utils import rate_limit, user_rate_limit_key\n\n@rate_limit(key_func=user_rate_limit_key, window=3600, max_requests=5)\ndef contact_form_view(request):\n    \"\"\"Contact form with rate limiting\"\"\"\n    if request.method == 'POST':\n        form = SecureContactForm(request.POST, request.FILES)\n        if form.is_valid():\n            # Process form\n            process_contact_form(form.cleaned_data)\n            messages.success(request, 'Message sent successfully!')\n            return redirect('contact_success')\n    else:\n        form = SecureContactForm()\n    \n    return render(request, 'contact.html', {'form': form})\n\nclass RateLimitedFormView(View):\n    \"\"\"Base view with rate limiting\"\"\"\n    \n    rate_limit_window = 3600  # 1 hour\n    rate_limit_max_requests = 10\n    \n    def dispatch(self, request, *args, **kwargs):\n        # Check rate limit\n        identifier = self.get_rate_limit_identifier(request)\n        limiter = RateLimiter(\n            key_prefix=f'rate_limit_{self.__class__.__name__}',\n            window=self.rate_limit_window,\n            max_requests=self.rate_limit_max_requests\n        )\n        \n        is_limited, reset_time = limiter.is_rate_limited(identifier)\n        \n        if is_limited:\n            return self.handle_rate_limit_exceeded(reset_time)\n        \n        return super().dispatch(request, *args, **kwargs)\n    \n    def get_rate_limit_identifier(self, request):\n        \"\"\"Get identifier for rate limiting\"\"\"\n        return user_rate_limit_key(request)\n    \n    def handle_rate_limit_exceeded(self, reset_time):\n        \"\"\"Handle rate limit exceeded\"\"\"\n        if self.request.headers.get('X-Requested-With') == 'XMLHttpRequest':\n            return JsonResponse({\n                'error': 'Rate limit exceeded',\n                'retry_after': int(reset_time)\n            }, status=429)\n        \n        return render(self.request, 'rate_limit_exceeded.html', {\n            'retry_after': int(reset_time)\n        }, status=429)\n",[1047,5673,5674,5679,5686,5706,5721,5739,5751,5755,5764,5773,5777,5823,5837,5854,5868,5872,5890,5899,5929,5933,5950,5959,5979,5983,5988,6012,6029,6033,6038,6082,6086,6091,6115,6153,6157,6162,6179,6207,6211,6222,6226,6243,6252,6270,6290,6304,6308,6313,6352,6383,6387,6421,6430,6434,6448,6462,6488,6493,6502,6517,6524,6539,6543,6554,6582,6593,6603,6608,6612,6638,6642,6651,6663,6673,6678,6711,6719,6723,6748,6752,6759,6766,6770,6782,6791,6819,6828,6858,6883,6887,6900,6909,6927,6953,6965,6969,6974,6994,7010,7028,7032,7066,7079,7088,7108,7135,7147,7152,7167,7191,7208,7214,7224,7228,7263,7267,7280,7289,7293,7305,7315,7319,7348,7353,7373,7384,7414,7430,7444,7448,7452,7475,7479,7487,7504,7508,7537,7541,7558,7567,7579,7583,7601,7610,7648,7656,7675,7695,7709,7713,7740,7758],{"__ignoreMap":1045},[1050,5675,5676],{"class":1052,"line":1053},[1050,5677,5678],{"class":1056},"# utils.py - Rate limiting utilities\n",[1050,5680,5681,5683],{"class":1052,"line":1060},[1050,5682,1368],{"class":1344},[1050,5684,5685],{"class":1348}," time\n",[1050,5687,5688,5690,5692,5694,5696,5698,5701,5703],{"class":1052,"line":1074},[1050,5689,1345],{"class":1344},[1050,5691,1349],{"class":1348},[1050,5693,1352],{"class":1067},[1050,5695,2331],{"class":1348},[1050,5697,1352],{"class":1067},[1050,5699,5700],{"class":1348},"cache ",[1050,5702,1368],{"class":1344},[1050,5704,5705],{"class":1348}," cache\n",[1050,5707,5708,5710,5712,5714,5716,5718],{"class":1052,"line":1091},[1050,5709,1345],{"class":1344},[1050,5711,1349],{"class":1348},[1050,5713,1352],{"class":1067},[1050,5715,1431],{"class":1348},[1050,5717,1368],{"class":1344},[1050,5719,5720],{"class":1348}," HttpResponseTooManyRequests\n",[1050,5722,5723,5725,5727,5729,5731,5733,5735,5737],{"class":1052,"line":1103},[1050,5724,1345],{"class":1344},[1050,5726,1349],{"class":1348},[1050,5728,1352],{"class":1067},[1050,5730,1388],{"class":1348},[1050,5732,1352],{"class":1067},[1050,5734,1393],{"class":1348},[1050,5736,1368],{"class":1344},[1050,5738,1398],{"class":1348},[1050,5740,5741,5743,5746,5748],{"class":1052,"line":1115},[1050,5742,1345],{"class":1344},[1050,5744,5745],{"class":1348}," functools ",[1050,5747,1368],{"class":1344},[1050,5749,5750],{"class":1348}," wraps\n",[1050,5752,5753],{"class":1052,"line":1131},[1050,5754,1177],{"emptyLinePlaceholder":1176},[1050,5756,5757,5759,5762],{"class":1052,"line":1143},[1050,5758,1738],{"class":1457},[1050,5760,5761],{"class":1741}," RateLimiter",[1050,5763,1514],{"class":1067},[1050,5765,5766,5768,5771],{"class":1052,"line":1155},[1050,5767,1478],{"class":1477},[1050,5769,5770],{"class":1481},"Rate limiting utility",[1050,5772,1485],{"class":1477},[1050,5774,5775],{"class":1052,"line":1167},[1050,5776,1626],{"class":1348},[1050,5778,5779,5781,5783,5785,5787,5789,5792,5794,5796,5799,5801,5803,5806,5808,5811,5813,5816,5818,5821],{"class":1052,"line":1173},[1050,5780,1771],{"class":1457},[1050,5782,2431],{"class":2430},[1050,5784,1464],{"class":1067},[1050,5786,1780],{"class":1779},[1050,5788,1125],{"class":1067},[1050,5790,5791],{"class":1467}," key_prefix",[1050,5793,1523],{"class":1503},[1050,5795,1085],{"class":1077},[1050,5797,5798],{"class":1081},"rate_limit",[1050,5800,1085],{"class":1077},[1050,5802,1125],{"class":1067},[1050,5804,5805],{"class":1467}," window",[1050,5807,1523],{"class":1503},[1050,5809,5810],{"class":1241},"3600",[1050,5812,1125],{"class":1067},[1050,5814,5815],{"class":1467}," max_requests",[1050,5817,1523],{"class":1503},[1050,5819,5820],{"class":1241},"10",[1050,5822,1471],{"class":1067},[1050,5824,5825,5827,5829,5832,5834],{"class":1052,"line":1180},[1050,5826,2467],{"class":1063},[1050,5828,1352],{"class":1067},[1050,5830,5831],{"class":1499},"key_prefix",[1050,5833,1068],{"class":1067},[1050,5835,5836],{"class":1348}," key_prefix\n",[1050,5838,5839,5841,5843,5846,5848,5851],{"class":1052,"line":1186},[1050,5840,2467],{"class":1063},[1050,5842,1352],{"class":1067},[1050,5844,5845],{"class":1499},"window",[1050,5847,1068],{"class":1067},[1050,5849,5850],{"class":1348}," window  ",[1050,5852,5853],{"class":1056},"# Time window in seconds\n",[1050,5855,5856,5858,5860,5863,5865],{"class":1052,"line":1201},[1050,5857,2467],{"class":1063},[1050,5859,1352],{"class":1067},[1050,5861,5862],{"class":1499},"max_requests",[1050,5864,1068],{"class":1067},[1050,5866,5867],{"class":1348}," max_requests\n",[1050,5869,5870],{"class":1052,"line":1214},[1050,5871,1626],{"class":1348},[1050,5873,5874,5876,5879,5881,5883,5885,5888],{"class":1052,"line":1233},[1050,5875,1771],{"class":1457},[1050,5877,5878],{"class":1450}," get_cache_key",[1050,5880,1464],{"class":1067},[1050,5882,1780],{"class":1779},[1050,5884,1125],{"class":1067},[1050,5886,5887],{"class":1467}," identifier",[1050,5889,1471],{"class":1067},[1050,5891,5892,5894,5897],{"class":1052,"line":1248},[1050,5893,2572],{"class":1477},[1050,5895,5896],{"class":1481},"Generate cache key for rate limiting",[1050,5898,1485],{"class":1477},[1050,5900,5901,5903,5906,5908,5910,5912,5914,5916,5918,5920,5922,5925,5927],{"class":1052,"line":1262},[1050,5902,1803],{"class":1344},[1050,5904,5905],{"class":1457}," f",[1050,5907,1085],{"class":1081},[1050,5909,3344],{"class":3343},[1050,5911,1780],{"class":1063},[1050,5913,1352],{"class":1067},[1050,5915,5831],{"class":1499},[1050,5917,3350],{"class":3343},[1050,5919,1666],{"class":1081},[1050,5921,3344],{"class":3343},[1050,5923,5924],{"class":1348},"identifier",[1050,5926,3350],{"class":3343},[1050,5928,2976],{"class":1081},[1050,5930,5931],{"class":1052,"line":1280},[1050,5932,1626],{"class":1348},[1050,5934,5935,5937,5940,5942,5944,5946,5948],{"class":1052,"line":1285},[1050,5936,1771],{"class":1457},[1050,5938,5939],{"class":1450}," is_rate_limited",[1050,5941,1464],{"class":1067},[1050,5943,1780],{"class":1779},[1050,5945,1125],{"class":1067},[1050,5947,5887],{"class":1467},[1050,5949,1471],{"class":1067},[1050,5951,5952,5954,5957],{"class":1052,"line":1291},[1050,5953,2572],{"class":1477},[1050,5955,5956],{"class":1481},"Check if identifier is rate limited",[1050,5958,1485],{"class":1477},[1050,5960,5961,5964,5966,5968,5970,5973,5975,5977],{"class":1052,"line":1301},[1050,5962,5963],{"class":1348},"        cache_key ",[1050,5965,1523],{"class":1067},[1050,5967,2587],{"class":1063},[1050,5969,1352],{"class":1067},[1050,5971,5972],{"class":1526},"get_cache_key",[1050,5974,1464],{"class":1067},[1050,5976,5924],{"class":1526},[1050,5978,1539],{"class":1067},[1050,5980,5981],{"class":1052,"line":1313},[1050,5982,2508],{"class":1348},[1050,5984,5985],{"class":1052,"line":1325},[1050,5986,5987],{"class":1056},"        # Get current request count and timestamps\n",[1050,5989,5990,5993,5995,5998,6000,6002,6004,6007,6009],{"class":1052,"line":1330},[1050,5991,5992],{"class":1348},"        requests ",[1050,5994,1523],{"class":1067},[1050,5996,5997],{"class":1348}," cache",[1050,5999,1352],{"class":1067},[1050,6001,2596],{"class":1526},[1050,6003,1464],{"class":1067},[1050,6005,6006],{"class":1526},"cache_key",[1050,6008,1125],{"class":1067},[1050,6010,6011],{"class":1067}," [])\n",[1050,6013,6014,6017,6019,6022,6024,6027],{"class":1052,"line":1335},[1050,6015,6016],{"class":1348},"        now ",[1050,6018,1523],{"class":1067},[1050,6020,6021],{"class":1348}," time",[1050,6023,1352],{"class":1067},[1050,6025,6026],{"class":1526},"time",[1050,6028,1620],{"class":1067},[1050,6030,6031],{"class":1052,"line":1341},[1050,6032,2508],{"class":1348},[1050,6034,6035],{"class":1052,"line":1379},[1050,6036,6037],{"class":1056},"        # Remove old requests outside the window\n",[1050,6039,6040,6042,6044,6046,6049,6052,6055,6057,6060,6063,6066,6069,6071,6074,6076,6078,6080],{"class":1052,"line":1401},[1050,6041,5992],{"class":1348},[1050,6043,1523],{"class":1067},[1050,6045,3466],{"class":1067},[1050,6047,6048],{"class":1348},"req_time ",[1050,6050,6051],{"class":1344},"for",[1050,6053,6054],{"class":1348}," req_time ",[1050,6056,3307],{"class":1344},[1050,6058,6059],{"class":1348}," requests ",[1050,6061,6062],{"class":1344},"if",[1050,6064,6065],{"class":1348}," now ",[1050,6067,6068],{"class":1503},"-",[1050,6070,6054],{"class":1348},[1050,6072,6073],{"class":1503},"\u003C",[1050,6075,2587],{"class":1063},[1050,6077,1352],{"class":1067},[1050,6079,5845],{"class":1499},[1050,6081,1170],{"class":1067},[1050,6083,6084],{"class":1052,"line":1422},[1050,6085,2508],{"class":1348},[1050,6087,6088],{"class":1052,"line":1439},[1050,6089,6090],{"class":1056},"        # Check if limit exceeded\n",[1050,6092,6093,6095,6097,6099,6102,6104,6107,6109,6111,6113],{"class":1052,"line":1444},[1050,6094,1545],{"class":1344},[1050,6096,3602],{"class":2430},[1050,6098,1464],{"class":1067},[1050,6100,6101],{"class":1526},"requests",[1050,6103,2846],{"class":1067},[1050,6105,6106],{"class":1503}," >=",[1050,6108,2587],{"class":1063},[1050,6110,1352],{"class":1067},[1050,6112,5862],{"class":1499},[1050,6114,1514],{"class":1067},[1050,6116,6117,6119,6121,6123,6125,6127,6129,6132,6135,6138,6140,6143,6145,6147,6150],{"class":1052,"line":1454},[1050,6118,1586],{"class":1344},[1050,6120,1195],{"class":1194},[1050,6122,1125],{"class":1067},[1050,6124,2587],{"class":1063},[1050,6126,1352],{"class":1067},[1050,6128,5845],{"class":1499},[1050,6130,6131],{"class":1503}," -",[1050,6133,6134],{"class":1067}," (",[1050,6136,6137],{"class":1348},"now ",[1050,6139,6068],{"class":1503},[1050,6141,6142],{"class":1348}," requests",[1050,6144,2528],{"class":1067},[1050,6146,5382],{"class":1241},[1050,6148,6149],{"class":1067},"])",[1050,6151,6152],{"class":1056},"  # Time until reset\n",[1050,6154,6155],{"class":1052,"line":1474},[1050,6156,2508],{"class":1348},[1050,6158,6159],{"class":1052,"line":1488},[1050,6160,6161],{"class":1056},"        # Add current request\n",[1050,6163,6164,6167,6169,6172,6174,6177],{"class":1052,"line":1517},[1050,6165,6166],{"class":1348},"        requests",[1050,6168,1352],{"class":1067},[1050,6170,6171],{"class":1526},"append",[1050,6173,1464],{"class":1067},[1050,6175,6176],{"class":1526},"now",[1050,6178,1539],{"class":1067},[1050,6180,6181,6184,6186,6189,6191,6193,6195,6197,6199,6201,6203,6205],{"class":1052,"line":1542},[1050,6182,6183],{"class":1348},"        cache",[1050,6185,1352],{"class":1067},[1050,6187,6188],{"class":1526},"set",[1050,6190,1464],{"class":1067},[1050,6192,6006],{"class":1526},[1050,6194,1125],{"class":1067},[1050,6196,6142],{"class":1526},[1050,6198,1125],{"class":1067},[1050,6200,2587],{"class":1063},[1050,6202,1352],{"class":1067},[1050,6204,5845],{"class":1499},[1050,6206,1539],{"class":1067},[1050,6208,6209],{"class":1052,"line":1559},[1050,6210,2508],{"class":1348},[1050,6212,6213,6215,6217,6219],{"class":1052,"line":1565},[1050,6214,1803],{"class":1344},[1050,6216,1256],{"class":1194},[1050,6218,1125],{"class":1067},[1050,6220,6221],{"class":1241}," 0\n",[1050,6223,6224],{"class":1052,"line":1583},[1050,6225,1626],{"class":1348},[1050,6227,6228,6230,6233,6235,6237,6239,6241],{"class":1052,"line":1603},[1050,6229,1771],{"class":1457},[1050,6231,6232],{"class":1450}," get_remaining_requests",[1050,6234,1464],{"class":1067},[1050,6236,1780],{"class":1779},[1050,6238,1125],{"class":1067},[1050,6240,5887],{"class":1467},[1050,6242,1471],{"class":1067},[1050,6244,6245,6247,6250],{"class":1052,"line":1611},[1050,6246,2572],{"class":1477},[1050,6248,6249],{"class":1481},"Get remaining requests for identifier",[1050,6251,1485],{"class":1477},[1050,6253,6254,6256,6258,6260,6262,6264,6266,6268],{"class":1052,"line":1623},[1050,6255,5963],{"class":1348},[1050,6257,1523],{"class":1067},[1050,6259,2587],{"class":1063},[1050,6261,1352],{"class":1067},[1050,6263,5972],{"class":1526},[1050,6265,1464],{"class":1067},[1050,6267,5924],{"class":1526},[1050,6269,1539],{"class":1067},[1050,6271,6272,6274,6276,6278,6280,6282,6284,6286,6288],{"class":1052,"line":1629},[1050,6273,5992],{"class":1348},[1050,6275,1523],{"class":1067},[1050,6277,5997],{"class":1348},[1050,6279,1352],{"class":1067},[1050,6281,2596],{"class":1526},[1050,6283,1464],{"class":1067},[1050,6285,6006],{"class":1526},[1050,6287,1125],{"class":1067},[1050,6289,6011],{"class":1067},[1050,6291,6292,6294,6296,6298,6300,6302],{"class":1052,"line":1656},[1050,6293,6016],{"class":1348},[1050,6295,1523],{"class":1067},[1050,6297,6021],{"class":1348},[1050,6299,1352],{"class":1067},[1050,6301,6026],{"class":1526},[1050,6303,1620],{"class":1067},[1050,6305,6306],{"class":1052,"line":1673},[1050,6307,2508],{"class":1348},[1050,6309,6310],{"class":1052,"line":1694},[1050,6311,6312],{"class":1056},"        # Count recent requests\n",[1050,6314,6315,6318,6320,6322,6325,6327,6330,6332,6334,6336,6338,6340,6342,6344,6346,6348,6350],{"class":1052,"line":1700},[1050,6316,6317],{"class":1348},"        recent_requests ",[1050,6319,1523],{"class":1067},[1050,6321,3466],{"class":1067},[1050,6323,6324],{"class":1348},"req ",[1050,6326,6051],{"class":1344},[1050,6328,6329],{"class":1348}," req ",[1050,6331,3307],{"class":1344},[1050,6333,6059],{"class":1348},[1050,6335,6062],{"class":1344},[1050,6337,6065],{"class":1348},[1050,6339,6068],{"class":1503},[1050,6341,6329],{"class":1348},[1050,6343,6073],{"class":1503},[1050,6345,2587],{"class":1063},[1050,6347,1352],{"class":1067},[1050,6349,5845],{"class":1499},[1050,6351,1170],{"class":1067},[1050,6353,6354,6356,6359,6361,6363,6365,6367,6369,6371,6373,6375,6377,6380],{"class":1052,"line":1705},[1050,6355,1803],{"class":1344},[1050,6357,6358],{"class":2430}," max",[1050,6360,1464],{"class":1067},[1050,6362,5382],{"class":1241},[1050,6364,1125],{"class":1067},[1050,6366,2587],{"class":1063},[1050,6368,1352],{"class":1067},[1050,6370,5862],{"class":1499},[1050,6372,6131],{"class":1503},[1050,6374,3602],{"class":2430},[1050,6376,1464],{"class":1067},[1050,6378,6379],{"class":1526},"recent_requests",[1050,6381,6382],{"class":1067},"))\n",[1050,6384,6385],{"class":1052,"line":1735},[1050,6386,1177],{"emptyLinePlaceholder":1176},[1050,6388,6389,6391,6394,6396,6399,6401,6403,6405,6407,6409,6411,6413,6415,6417,6419],{"class":1052,"line":1753},[1050,6390,1458],{"class":1457},[1050,6392,6393],{"class":1450}," rate_limit",[1050,6395,1464],{"class":1067},[1050,6397,6398],{"class":1467},"key_func",[1050,6400,1523],{"class":1503},[1050,6402,2444],{"class":1194},[1050,6404,1125],{"class":1067},[1050,6406,5805],{"class":1467},[1050,6408,1523],{"class":1503},[1050,6410,5810],{"class":1241},[1050,6412,1125],{"class":1067},[1050,6414,5815],{"class":1467},[1050,6416,1523],{"class":1503},[1050,6418,5820],{"class":1241},[1050,6420,1471],{"class":1067},[1050,6422,6423,6425,6428],{"class":1052,"line":1763},[1050,6424,1478],{"class":1477},[1050,6426,6427],{"class":1481},"Rate limiting decorator",[1050,6429,1485],{"class":1477},[1050,6431,6432],{"class":1052,"line":1768},[1050,6433,1626],{"class":1348},[1050,6435,6436,6438,6441,6443,6446],{"class":1052,"line":1789},[1050,6437,1771],{"class":1457},[1050,6439,6440],{"class":1450}," decorator",[1050,6442,1464],{"class":1067},[1050,6444,6445],{"class":1467},"view_func",[1050,6447,1471],{"class":1067},[1050,6449,6450,6453,6456,6458,6460],{"class":1052,"line":1800},[1050,6451,6452],{"class":1067},"        @",[1050,6454,6455],{"class":1450},"wraps",[1050,6457,1464],{"class":1067},[1050,6459,6445],{"class":1526},[1050,6461,1539],{"class":1067},[1050,6463,6464,6467,6470,6472,6474,6476,6478,6480,6482,6484,6486],{"class":1052,"line":1838},[1050,6465,6466],{"class":1457},"        def",[1050,6468,6469],{"class":1450}," wrapper",[1050,6471,1464],{"class":1067},[1050,6473,1468],{"class":1467},[1050,6475,1125],{"class":1067},[1050,6477,2449],{"class":1503},[1050,6479,2452],{"class":1467},[1050,6481,1125],{"class":1067},[1050,6483,2457],{"class":1503},[1050,6485,2460],{"class":1467},[1050,6487,1471],{"class":1067},[1050,6489,6490],{"class":1052,"line":1843},[1050,6491,6492],{"class":1056},"            # Generate rate limit key\n",[1050,6494,6495,6497,6500],{"class":1052,"line":1861},[1050,6496,2646],{"class":1344},[1050,6498,6499],{"class":1348}," key_func",[1050,6501,1514],{"class":1067},[1050,6503,6504,6507,6509,6511,6513,6515],{"class":1052,"line":1880},[1050,6505,6506],{"class":1348},"                identifier ",[1050,6508,1523],{"class":1067},[1050,6510,6499],{"class":1526},[1050,6512,1464],{"class":1067},[1050,6514,1468],{"class":1526},[1050,6516,1539],{"class":1067},[1050,6518,6519,6522],{"class":1052,"line":1893},[1050,6520,6521],{"class":1344},"            else",[1050,6523,1514],{"class":1067},[1050,6525,6526,6528,6530,6533,6535,6537],{"class":1052,"line":1910},[1050,6527,6506],{"class":1348},[1050,6529,1523],{"class":1067},[1050,6531,6532],{"class":1526}," get_client_ip",[1050,6534,1464],{"class":1067},[1050,6536,1468],{"class":1526},[1050,6538,1539],{"class":1067},[1050,6540,6541],{"class":1052,"line":1933},[1050,6542,5161],{"class":1348},[1050,6544,6545,6548,6550,6552],{"class":1052,"line":1970},[1050,6546,6547],{"class":1348},"            limiter ",[1050,6549,1523],{"class":1067},[1050,6551,5761],{"class":1526},[1050,6553,4040],{"class":1067},[1050,6555,6556,6559,6561,6563,6566,6568,6570,6572,6576,6578,6580],{"class":1052,"line":1975},[1050,6557,6558],{"class":1720},"                key_prefix",[1050,6560,1523],{"class":1067},[1050,6562,3337],{"class":1457},[1050,6564,6565],{"class":1081},"'rate_limit_",[1050,6567,3344],{"class":3343},[1050,6569,6445],{"class":1526},[1050,6571,1352],{"class":1067},[1050,6573,6575],{"class":6574},"s131V","__name__",[1050,6577,3350],{"class":3343},[1050,6579,1085],{"class":1081},[1050,6581,1088],{"class":1067},[1050,6583,6584,6587,6589,6591],{"class":1052,"line":1981},[1050,6585,6586],{"class":1720},"                window",[1050,6588,1523],{"class":1067},[1050,6590,5845],{"class":1526},[1050,6592,1088],{"class":1067},[1050,6594,6595,6598,6600],{"class":1052,"line":1995},[1050,6596,6597],{"class":1720},"                max_requests",[1050,6599,1523],{"class":1067},[1050,6601,6602],{"class":1526},"max_requests\n",[1050,6604,6605],{"class":1052,"line":2005},[1050,6606,6607],{"class":1067},"            )\n",[1050,6609,6610],{"class":1052,"line":2031},[1050,6611,5161],{"class":1348},[1050,6613,6614,6617,6619,6622,6624,6627,6629,6632,6634,6636],{"class":1052,"line":2036},[1050,6615,6616],{"class":1348},"            is_limited",[1050,6618,1125],{"class":1067},[1050,6620,6621],{"class":1348}," reset_time ",[1050,6623,1523],{"class":1067},[1050,6625,6626],{"class":1348}," limiter",[1050,6628,1352],{"class":1067},[1050,6630,6631],{"class":1526},"is_rate_limited",[1050,6633,1464],{"class":1067},[1050,6635,5924],{"class":1526},[1050,6637,1539],{"class":1067},[1050,6639,6640],{"class":1052,"line":2042},[1050,6641,5161],{"class":1348},[1050,6643,6644,6646,6649],{"class":1052,"line":2047},[1050,6645,2646],{"class":1344},[1050,6647,6648],{"class":1348}," is_limited",[1050,6650,1514],{"class":1067},[1050,6652,6653,6656,6658,6661],{"class":1052,"line":2053},[1050,6654,6655],{"class":1348},"                response ",[1050,6657,1523],{"class":1067},[1050,6659,6660],{"class":1526}," HttpResponseTooManyRequests",[1050,6662,4040],{"class":1067},[1050,6664,6665,6668,6671],{"class":1052,"line":2059},[1050,6666,6667],{"class":1077},"                    '",[1050,6669,6670],{"class":1081},"Rate limit exceeded. Try again later.",[1050,6672,2976],{"class":1077},[1050,6674,6675],{"class":1052,"line":2065},[1050,6676,6677],{"class":1067},"                )\n",[1050,6679,6680,6683,6685,6687,6690,6692,6694,6696,6699,6701,6704,6706,6709],{"class":1052,"line":2071},[1050,6681,6682],{"class":1348},"                response",[1050,6684,2528],{"class":1067},[1050,6686,1085],{"class":1077},[1050,6688,6689],{"class":1081},"Retry-After",[1050,6691,1085],{"class":1077},[1050,6693,3853],{"class":1067},[1050,6695,1068],{"class":1067},[1050,6697,6698],{"class":2481}," str",[1050,6700,1464],{"class":1067},[1050,6702,6703],{"class":2481},"int",[1050,6705,1464],{"class":1067},[1050,6707,6708],{"class":1526},"reset_time",[1050,6710,6382],{"class":1067},[1050,6712,6713,6716],{"class":1052,"line":2077},[1050,6714,6715],{"class":1344},"                return",[1050,6717,6718],{"class":1348}," response\n",[1050,6720,6721],{"class":1052,"line":2083},[1050,6722,5161],{"class":1348},[1050,6724,6725,6727,6730,6732,6734,6736,6738,6740,6742,6744,6746],{"class":1052,"line":2089},[1050,6726,1586],{"class":1344},[1050,6728,6729],{"class":1526}," view_func",[1050,6731,1464],{"class":1067},[1050,6733,1468],{"class":1526},[1050,6735,1125],{"class":1067},[1050,6737,2449],{"class":1503},[1050,6739,2452],{"class":1526},[1050,6741,1125],{"class":1067},[1050,6743,2457],{"class":1503},[1050,6745,2460],{"class":1526},[1050,6747,1539],{"class":1067},[1050,6749,6750],{"class":1052,"line":2095},[1050,6751,2508],{"class":1348},[1050,6753,6754,6756],{"class":1052,"line":2101},[1050,6755,1803],{"class":1344},[1050,6757,6758],{"class":1348}," wrapper\n",[1050,6760,6761,6763],{"class":1052,"line":2107},[1050,6762,1632],{"class":1344},[1050,6764,6765],{"class":1348}," decorator\n",[1050,6767,6768],{"class":1052,"line":2113},[1050,6769,1177],{"emptyLinePlaceholder":1176},[1050,6771,6772,6774,6776,6778,6780],{"class":1052,"line":2118},[1050,6773,1458],{"class":1457},[1050,6775,6532],{"class":1450},[1050,6777,1464],{"class":1067},[1050,6779,1468],{"class":1467},[1050,6781,1471],{"class":1067},[1050,6783,6784,6786,6789],{"class":1052,"line":2124},[1050,6785,1478],{"class":1477},[1050,6787,6788],{"class":1481},"Get client IP address",[1050,6790,1485],{"class":1477},[1050,6792,6793,6796,6798,6800,6802,6804,6806,6808,6810,6812,6815,6817],{"class":1052,"line":2130},[1050,6794,6795],{"class":1348},"    x_forwarded_for ",[1050,6797,1523],{"class":1067},[1050,6799,1494],{"class":1348},[1050,6801,1352],{"class":1067},[1050,6803,2790],{"class":1536},[1050,6805,1352],{"class":1067},[1050,6807,2596],{"class":1526},[1050,6809,1464],{"class":1067},[1050,6811,1085],{"class":1077},[1050,6813,6814],{"class":1081},"HTTP_X_FORWARDED_FOR",[1050,6816,1085],{"class":1077},[1050,6818,1539],{"class":1067},[1050,6820,6821,6823,6826],{"class":1052,"line":2136},[1050,6822,1491],{"class":1344},[1050,6824,6825],{"class":1348}," x_forwarded_for",[1050,6827,1514],{"class":1067},[1050,6829,6830,6832,6834,6836,6838,6840,6842,6844,6846,6849,6851,6853,6856],{"class":1052,"line":2141},[1050,6831,1803],{"class":1344},[1050,6833,6825],{"class":1348},[1050,6835,1352],{"class":1067},[1050,6837,4612],{"class":1526},[1050,6839,1464],{"class":1067},[1050,6841,1085],{"class":1077},[1050,6843,1125],{"class":1081},[1050,6845,1085],{"class":1077},[1050,6847,6848],{"class":1067},")[",[1050,6850,5382],{"class":1241},[1050,6852,2537],{"class":1067},[1050,6854,6855],{"class":1526},"strip",[1050,6857,1620],{"class":1067},[1050,6859,6860,6862,6864,6866,6868,6870,6872,6874,6876,6879,6881],{"class":1052,"line":2147},[1050,6861,1632],{"class":1344},[1050,6863,1494],{"class":1348},[1050,6865,1352],{"class":1067},[1050,6867,2790],{"class":1536},[1050,6869,1352],{"class":1067},[1050,6871,2596],{"class":1526},[1050,6873,1464],{"class":1067},[1050,6875,1085],{"class":1077},[1050,6877,6878],{"class":1081},"REMOTE_ADDR",[1050,6880,1085],{"class":1077},[1050,6882,1539],{"class":1067},[1050,6884,6885],{"class":1052,"line":2153},[1050,6886,1177],{"emptyLinePlaceholder":1176},[1050,6888,6889,6891,6894,6896,6898],{"class":1052,"line":2159},[1050,6890,1458],{"class":1457},[1050,6892,6893],{"class":1450}," user_rate_limit_key",[1050,6895,1464],{"class":1067},[1050,6897,1468],{"class":1467},[1050,6899,1471],{"class":1067},[1050,6901,6902,6904,6907],{"class":1052,"line":2165},[1050,6903,1478],{"class":1477},[1050,6905,6906],{"class":1481},"Generate rate limit key based on user",[1050,6908,1485],{"class":1477},[1050,6910,6911,6913,6915,6917,6920,6922,6925],{"class":1052,"line":2171},[1050,6912,1491],{"class":1344},[1050,6914,1494],{"class":1348},[1050,6916,1352],{"class":1067},[1050,6918,6919],{"class":1499},"user",[1050,6921,1352],{"class":1067},[1050,6923,6924],{"class":1499},"is_authenticated",[1050,6926,1514],{"class":1067},[1050,6928,6929,6931,6933,6936,6938,6940,6942,6944,6946,6949,6951],{"class":1052,"line":2177},[1050,6930,1803],{"class":1344},[1050,6932,5905],{"class":1457},[1050,6934,6935],{"class":1081},"'user_",[1050,6937,3344],{"class":3343},[1050,6939,1468],{"class":1348},[1050,6941,1352],{"class":1067},[1050,6943,6919],{"class":1499},[1050,6945,1352],{"class":1067},[1050,6947,6948],{"class":1499},"id",[1050,6950,3350],{"class":3343},[1050,6952,2976],{"class":1081},[1050,6954,6955,6957,6959,6961,6963],{"class":1052,"line":2183},[1050,6956,1632],{"class":1344},[1050,6958,6532],{"class":1526},[1050,6960,1464],{"class":1067},[1050,6962,1468],{"class":1526},[1050,6964,1539],{"class":1067},[1050,6966,6967],{"class":1052,"line":2189},[1050,6968,1177],{"emptyLinePlaceholder":1176},[1050,6970,6971],{"class":1052,"line":2195},[1050,6972,6973],{"class":1056},"# views.py - Rate limited views\n",[1050,6975,6976,6978,6980,6982,6985,6987,6989,6991],{"class":1052,"line":2200},[1050,6977,1345],{"class":1344},[1050,6979,1349],{"class":1348},[1050,6981,1352],{"class":1067},[1050,6983,6984],{"class":1348},"shortcuts ",[1050,6986,1368],{"class":1344},[1050,6988,1635],{"class":1348},[1050,6990,1125],{"class":1067},[1050,6992,6993],{"class":1348}," redirect\n",[1050,6995,6996,6998,7000,7002,7005,7007],{"class":1052,"line":2205},[1050,6997,1345],{"class":1344},[1050,6999,1349],{"class":1348},[1050,7001,1352],{"class":1067},[1050,7003,7004],{"class":1348},"contrib ",[1050,7006,1368],{"class":1344},[1050,7008,7009],{"class":1348}," messages\n",[1050,7011,7012,7014,7016,7019,7021,7023,7025],{"class":1052,"line":2211},[1050,7013,1345],{"class":1344},[1050,7015,3982],{"class":1067},[1050,7017,7018],{"class":1348},"utils ",[1050,7020,1368],{"class":1344},[1050,7022,6393],{"class":1348},[1050,7024,1125],{"class":1067},[1050,7026,7027],{"class":1348}," user_rate_limit_key\n",[1050,7029,7030],{"class":1052,"line":2217},[1050,7031,1177],{"emptyLinePlaceholder":1176},[1050,7033,7034,7036,7038,7040,7042,7044,7047,7049,7051,7053,7055,7057,7059,7061,7064],{"class":1052,"line":2223},[1050,7035,1447],{"class":1067},[1050,7037,5798],{"class":1450},[1050,7039,1464],{"class":1067},[1050,7041,6398],{"class":1720},[1050,7043,1523],{"class":1067},[1050,7045,7046],{"class":1526},"user_rate_limit_key",[1050,7048,1125],{"class":1067},[1050,7050,5805],{"class":1720},[1050,7052,1523],{"class":1067},[1050,7054,5810],{"class":1241},[1050,7056,1125],{"class":1067},[1050,7058,5815],{"class":1720},[1050,7060,1523],{"class":1067},[1050,7062,7063],{"class":1241},"5",[1050,7065,1539],{"class":1067},[1050,7067,7068,7070,7073,7075,7077],{"class":1052,"line":2229},[1050,7069,1458],{"class":1457},[1050,7071,7072],{"class":1450}," contact_form_view",[1050,7074,1464],{"class":1067},[1050,7076,1468],{"class":1467},[1050,7078,1471],{"class":1067},[1050,7080,7081,7083,7086],{"class":1052,"line":2235},[1050,7082,1478],{"class":1477},[1050,7084,7085],{"class":1481},"Contact form with rate limiting",[1050,7087,1485],{"class":1477},[1050,7089,7090,7092,7094,7096,7098,7100,7102,7104,7106],{"class":1052,"line":2241},[1050,7091,1491],{"class":1344},[1050,7093,1494],{"class":1348},[1050,7095,1352],{"class":1067},[1050,7097,1500],{"class":1499},[1050,7099,1504],{"class":1503},[1050,7101,1222],{"class":1077},[1050,7103,1509],{"class":1081},[1050,7105,1085],{"class":1077},[1050,7107,1514],{"class":1067},[1050,7109,7110,7112,7114,7116,7118,7120,7122,7124,7126,7128,7130,7133],{"class":1052,"line":2246},[1050,7111,1520],{"class":1348},[1050,7113,1523],{"class":1067},[1050,7115,4001],{"class":1526},[1050,7117,1464],{"class":1067},[1050,7119,1468],{"class":1526},[1050,7121,1352],{"class":1067},[1050,7123,1509],{"class":1536},[1050,7125,1125],{"class":1067},[1050,7127,1494],{"class":1526},[1050,7129,1352],{"class":1067},[1050,7131,7132],{"class":1536},"FILES",[1050,7134,1539],{"class":1067},[1050,7136,7137,7139,7141,7143,7145],{"class":1052,"line":2252},[1050,7138,1545],{"class":1344},[1050,7140,1548],{"class":1348},[1050,7142,1352],{"class":1067},[1050,7144,1553],{"class":1526},[1050,7146,1556],{"class":1067},[1050,7148,7149],{"class":1052,"line":2258},[1050,7150,7151],{"class":1056},"            # Process form\n",[1050,7153,7154,7157,7159,7161,7163,7165],{"class":1052,"line":2263},[1050,7155,7156],{"class":1526},"            process_contact_form",[1050,7158,1464],{"class":1067},[1050,7160,1573],{"class":1526},[1050,7162,1352],{"class":1067},[1050,7164,1578],{"class":1499},[1050,7166,1539],{"class":1067},[1050,7168,7169,7172,7174,7176,7178,7180,7182,7184,7187,7189],{"class":1052,"line":2268},[1050,7170,7171],{"class":1348},"            messages",[1050,7173,1352],{"class":1067},[1050,7175,1596],{"class":1526},[1050,7177,1464],{"class":1067},[1050,7179,1468],{"class":1526},[1050,7181,1125],{"class":1067},[1050,7183,1222],{"class":1077},[1050,7185,7186],{"class":1081},"Message sent successfully!",[1050,7188,1085],{"class":1077},[1050,7190,1539],{"class":1067},[1050,7192,7193,7195,7197,7199,7201,7204,7206],{"class":1052,"line":2274},[1050,7194,1586],{"class":1344},[1050,7196,1589],{"class":1526},[1050,7198,1464],{"class":1067},[1050,7200,1085],{"class":1077},[1050,7202,7203],{"class":1081},"contact_success",[1050,7205,1085],{"class":1077},[1050,7207,1539],{"class":1067},[1050,7209,7210,7212],{"class":1052,"line":4622},[1050,7211,1606],{"class":1344},[1050,7213,1514],{"class":1067},[1050,7215,7216,7218,7220,7222],{"class":1052,"line":4628},[1050,7217,1520],{"class":1348},[1050,7219,1523],{"class":1067},[1050,7221,4001],{"class":1526},[1050,7223,1620],{"class":1067},[1050,7225,7226],{"class":1052,"line":4649},[1050,7227,1626],{"class":1348},[1050,7229,7230,7232,7234,7236,7238,7240,7242,7245,7247,7249,7251,7253,7255,7257,7259,7261],{"class":1052,"line":4667},[1050,7231,1632],{"class":1344},[1050,7233,1635],{"class":1526},[1050,7235,1464],{"class":1067},[1050,7237,1468],{"class":1526},[1050,7239,1125],{"class":1067},[1050,7241,1222],{"class":1077},[1050,7243,7244],{"class":1081},"contact.html",[1050,7246,1085],{"class":1077},[1050,7248,1125],{"class":1067},[1050,7250,1822],{"class":1067},[1050,7252,1085],{"class":1077},[1050,7254,1573],{"class":1081},[1050,7256,1085],{"class":1077},[1050,7258,1666],{"class":1067},[1050,7260,1548],{"class":1526},[1050,7262,1835],{"class":1067},[1050,7264,7265],{"class":1052,"line":4672},[1050,7266,1177],{"emptyLinePlaceholder":1176},[1050,7268,7269,7271,7274,7276,7278],{"class":1052,"line":4678},[1050,7270,1738],{"class":1457},[1050,7272,7273],{"class":1741}," RateLimitedFormView",[1050,7275,1464],{"class":1067},[1050,7277,1748],{"class":1747},[1050,7279,1471],{"class":1067},[1050,7281,7282,7284,7287],{"class":1052,"line":4724},[1050,7283,1478],{"class":1477},[1050,7285,7286],{"class":1481},"Base view with rate limiting",[1050,7288,1485],{"class":1477},[1050,7290,7291],{"class":1052,"line":4742},[1050,7292,1626],{"class":1348},[1050,7294,7295,7298,7300,7302],{"class":1052,"line":4747},[1050,7296,7297],{"class":1348},"    rate_limit_window ",[1050,7299,1523],{"class":1067},[1050,7301,1242],{"class":1241},[1050,7303,7304],{"class":1056},"  # 1 hour\n",[1050,7306,7307,7310,7312],{"class":1052,"line":4755},[1050,7308,7309],{"class":1348},"    rate_limit_max_requests ",[1050,7311,1523],{"class":1067},[1050,7313,7314],{"class":1241}," 10\n",[1050,7316,7317],{"class":1052,"line":4760},[1050,7318,1626],{"class":1348},[1050,7320,7321,7323,7326,7328,7330,7332,7334,7336,7338,7340,7342,7344,7346],{"class":1052,"line":4774},[1050,7322,1771],{"class":1457},[1050,7324,7325],{"class":1450}," dispatch",[1050,7327,1464],{"class":1067},[1050,7329,1780],{"class":1779},[1050,7331,1125],{"class":1067},[1050,7333,1494],{"class":1467},[1050,7335,1125],{"class":1067},[1050,7337,2449],{"class":1503},[1050,7339,2452],{"class":1467},[1050,7341,1125],{"class":1067},[1050,7343,2457],{"class":1503},[1050,7345,2460],{"class":1467},[1050,7347,1471],{"class":1067},[1050,7349,7350],{"class":1052,"line":4784},[1050,7351,7352],{"class":1056},"        # Check rate limit\n",[1050,7354,7355,7358,7360,7362,7364,7367,7369,7371],{"class":1052,"line":4809},[1050,7356,7357],{"class":1348},"        identifier ",[1050,7359,1523],{"class":1067},[1050,7361,2587],{"class":1063},[1050,7363,1352],{"class":1067},[1050,7365,7366],{"class":1526},"get_rate_limit_identifier",[1050,7368,1464],{"class":1067},[1050,7370,1468],{"class":1526},[1050,7372,1539],{"class":1067},[1050,7374,7375,7378,7380,7382],{"class":1052,"line":4814},[1050,7376,7377],{"class":1348},"        limiter ",[1050,7379,1523],{"class":1067},[1050,7381,5761],{"class":1526},[1050,7383,4040],{"class":1067},[1050,7385,7386,7389,7391,7393,7395,7397,7399,7401,7404,7406,7408,7410,7412],{"class":1052,"line":4820},[1050,7387,7388],{"class":1720},"            key_prefix",[1050,7390,1523],{"class":1067},[1050,7392,3337],{"class":1457},[1050,7394,6565],{"class":1081},[1050,7396,3344],{"class":3343},[1050,7398,1780],{"class":1063},[1050,7400,1352],{"class":1067},[1050,7402,7403],{"class":6574},"__class__",[1050,7405,1352],{"class":1067},[1050,7407,6575],{"class":6574},[1050,7409,3350],{"class":3343},[1050,7411,1085],{"class":1081},[1050,7413,1088],{"class":1067},[1050,7415,7416,7419,7421,7423,7425,7428],{"class":1052,"line":4874},[1050,7417,7418],{"class":1720},"            window",[1050,7420,1523],{"class":1067},[1050,7422,1780],{"class":1063},[1050,7424,1352],{"class":1067},[1050,7426,7427],{"class":1499},"rate_limit_window",[1050,7429,1088],{"class":1067},[1050,7431,7432,7435,7437,7439,7441],{"class":1052,"line":4885},[1050,7433,7434],{"class":1720},"            max_requests",[1050,7436,1523],{"class":1067},[1050,7438,1780],{"class":1063},[1050,7440,1352],{"class":1067},[1050,7442,7443],{"class":1499},"rate_limit_max_requests\n",[1050,7445,7446],{"class":1052,"line":4890},[1050,7447,4962],{"class":1067},[1050,7449,7450],{"class":1052,"line":4896},[1050,7451,2508],{"class":1348},[1050,7453,7454,7457,7459,7461,7463,7465,7467,7469,7471,7473],{"class":1052,"line":4914},[1050,7455,7456],{"class":1348},"        is_limited",[1050,7458,1125],{"class":1067},[1050,7460,6621],{"class":1348},[1050,7462,1523],{"class":1067},[1050,7464,6626],{"class":1348},[1050,7466,1352],{"class":1067},[1050,7468,6631],{"class":1526},[1050,7470,1464],{"class":1067},[1050,7472,5924],{"class":1526},[1050,7474,1539],{"class":1067},[1050,7476,7477],{"class":1052,"line":4922},[1050,7478,2508],{"class":1348},[1050,7480,7481,7483,7485],{"class":1052,"line":4935},[1050,7482,1545],{"class":1344},[1050,7484,6648],{"class":1348},[1050,7486,1514],{"class":1067},[1050,7488,7489,7491,7493,7495,7498,7500,7502],{"class":1052,"line":4948},[1050,7490,1586],{"class":1344},[1050,7492,2587],{"class":1063},[1050,7494,1352],{"class":1067},[1050,7496,7497],{"class":1526},"handle_rate_limit_exceeded",[1050,7499,1464],{"class":1067},[1050,7501,6708],{"class":1526},[1050,7503,1539],{"class":1067},[1050,7505,7506],{"class":1052,"line":4959},[1050,7507,2508],{"class":1348},[1050,7509,7510,7512,7515,7517,7519,7521,7523,7525,7527,7529,7531,7533,7535],{"class":1052,"line":4965},[1050,7511,1803],{"class":1344},[1050,7513,7514],{"class":2481}," super",[1050,7516,2485],{"class":1067},[1050,7518,1728],{"class":1526},[1050,7520,1464],{"class":1067},[1050,7522,1468],{"class":1526},[1050,7524,1125],{"class":1067},[1050,7526,2449],{"class":1503},[1050,7528,2452],{"class":1526},[1050,7530,1125],{"class":1067},[1050,7532,2457],{"class":1503},[1050,7534,2460],{"class":1526},[1050,7536,1539],{"class":1067},[1050,7538,7539],{"class":1052,"line":4970},[1050,7540,1626],{"class":1348},[1050,7542,7543,7545,7548,7550,7552,7554,7556],{"class":1052,"line":4976},[1050,7544,1771],{"class":1457},[1050,7546,7547],{"class":1450}," get_rate_limit_identifier",[1050,7549,1464],{"class":1067},[1050,7551,1780],{"class":1779},[1050,7553,1125],{"class":1067},[1050,7555,1494],{"class":1467},[1050,7557,1471],{"class":1067},[1050,7559,7560,7562,7565],{"class":1052,"line":5003},[1050,7561,2572],{"class":1477},[1050,7563,7564],{"class":1481},"Get identifier for rate limiting",[1050,7566,1485],{"class":1477},[1050,7568,7569,7571,7573,7575,7577],{"class":1052,"line":5021},[1050,7570,1803],{"class":1344},[1050,7572,6893],{"class":1526},[1050,7574,1464],{"class":1067},[1050,7576,1468],{"class":1526},[1050,7578,1539],{"class":1067},[1050,7580,7581],{"class":1052,"line":5026},[1050,7582,1626],{"class":1348},[1050,7584,7585,7587,7590,7592,7594,7596,7599],{"class":1052,"line":5034},[1050,7586,1771],{"class":1457},[1050,7588,7589],{"class":1450}," handle_rate_limit_exceeded",[1050,7591,1464],{"class":1067},[1050,7593,1780],{"class":1779},[1050,7595,1125],{"class":1067},[1050,7597,7598],{"class":1467}," reset_time",[1050,7600,1471],{"class":1067},[1050,7602,7603,7605,7608],{"class":1052,"line":5039},[1050,7604,2572],{"class":1477},[1050,7606,7607],{"class":1481},"Handle rate limit exceeded",[1050,7609,1485],{"class":1477},[1050,7611,7612,7614,7616,7618,7620,7622,7624,7626,7628,7630,7632,7634,7636,7638,7640,7642,7644,7646],{"class":1052,"line":5053},[1050,7613,1545],{"class":1344},[1050,7615,2587],{"class":1063},[1050,7617,1352],{"class":1067},[1050,7619,1468],{"class":1499},[1050,7621,1352],{"class":1067},[1050,7623,2830],{"class":1499},[1050,7625,1352],{"class":1067},[1050,7627,2596],{"class":1526},[1050,7629,1464],{"class":1067},[1050,7631,1085],{"class":1077},[1050,7633,2841],{"class":1081},[1050,7635,1085],{"class":1077},[1050,7637,2846],{"class":1067},[1050,7639,1504],{"class":1503},[1050,7641,1222],{"class":1077},[1050,7643,2853],{"class":1081},[1050,7645,1085],{"class":1077},[1050,7647,1514],{"class":1067},[1050,7649,7650,7652,7654],{"class":1052,"line":5063},[1050,7651,1586],{"class":1344},[1050,7653,1915],{"class":1526},[1050,7655,2866],{"class":1067},[1050,7657,7658,7660,7662,7664,7666,7668,7671,7673],{"class":1052,"line":5092},[1050,7659,5183],{"class":1077},[1050,7661,2874],{"class":1081},[1050,7663,1085],{"class":1077},[1050,7665,1666],{"class":1067},[1050,7667,1222],{"class":1077},[1050,7669,7670],{"class":1081},"Rate limit exceeded",[1050,7672,1085],{"class":1077},[1050,7674,1088],{"class":1067},[1050,7676,7677,7679,7682,7684,7686,7689,7691,7693],{"class":1052,"line":5097},[1050,7678,5183],{"class":1077},[1050,7680,7681],{"class":1081},"retry_after",[1050,7683,1085],{"class":1077},[1050,7685,1666],{"class":1067},[1050,7687,7688],{"class":2481}," int",[1050,7690,1464],{"class":1067},[1050,7692,6708],{"class":1526},[1050,7694,1539],{"class":1067},[1050,7696,7697,7700,7702,7704,7707],{"class":1052,"line":5107},[1050,7698,7699],{"class":1067},"            },",[1050,7701,1960],{"class":1720},[1050,7703,1523],{"class":1067},[1050,7705,7706],{"class":1241},"429",[1050,7708,1539],{"class":1067},[1050,7710,7711],{"class":1052,"line":5113},[1050,7712,2508],{"class":1348},[1050,7714,7715,7717,7719,7721,7723,7725,7727,7729,7731,7734,7736,7738],{"class":1052,"line":5140},[1050,7716,1803],{"class":1344},[1050,7718,1635],{"class":1526},[1050,7720,1464],{"class":1067},[1050,7722,1780],{"class":1063},[1050,7724,1352],{"class":1067},[1050,7726,1468],{"class":1499},[1050,7728,1125],{"class":1067},[1050,7730,1222],{"class":1077},[1050,7732,7733],{"class":1081},"rate_limit_exceeded.html",[1050,7735,1085],{"class":1077},[1050,7737,1125],{"class":1067},[1050,7739,1653],{"class":1067},[1050,7741,7742,7744,7746,7748,7750,7752,7754,7756],{"class":1052,"line":5158},[1050,7743,2871],{"class":1077},[1050,7745,7681],{"class":1081},[1050,7747,1085],{"class":1077},[1050,7749,1666],{"class":1067},[1050,7751,7688],{"class":2481},[1050,7753,1464],{"class":1067},[1050,7755,6708],{"class":1526},[1050,7757,1539],{"class":1067},[1050,7759,7760,7762,7764,7766,7768],{"class":1052,"line":5164},[1050,7761,2905],{"class":1067},[1050,7763,1960],{"class":1720},[1050,7765,1523],{"class":1067},[1050,7767,7706],{"class":1241},[1050,7769,1539],{"class":1067},[1035,7771,7773],{"id":7772},"honeypot-and-bot-detection","Honeypot and Bot Detection",[1040,7775,7777],{"className":1042,"code":7776,"language":1044,"meta":1045,"style":1045},"# forms.py - Honeypot and bot detection\nfrom django import forms\nfrom django.core.exceptions import ValidationError\nimport time\n\nclass HoneypotMixin:\n    \"\"\"Mixin to add honeypot fields for bot detection\"\"\"\n    \n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        \n        # Add honeypot field (hidden from users)\n        self.fields['website_url'] = forms.CharField(\n            required=False,\n            widget=forms.TextInput(attrs={\n                'style': 'display: none !important;',\n                'tabindex': '-1',\n                'autocomplete': 'off'\n            })\n        )\n        \n        # Add timestamp field for timing analysis\n        self.fields['form_timestamp'] = forms.CharField(\n            widget=forms.HiddenInput(),\n            initial=str(int(time.time()))\n        )\n    \n    def clean_website_url(self):\n        \"\"\"Honeypot validation\"\"\"\n        website_url = self.cleaned_data.get('website_url')\n        \n        # If honeypot field is filled, it's likely a bot\n        if website_url:\n            raise ValidationError('Bot detected.')\n        \n        return website_url\n    \n    def clean_form_timestamp(self):\n        \"\"\"Timing-based bot detection\"\"\"\n        timestamp = self.cleaned_data.get('form_timestamp')\n        \n        try:\n            form_time = int(timestamp)\n            current_time = int(time.time())\n            time_diff = current_time - form_time\n            \n            # Form filled too quickly (likely bot)\n            if time_diff \u003C 3:  # Less than 3 seconds\n                raise ValidationError('Form submitted too quickly.')\n            \n            # Form took too long (possible session hijacking)\n            if time_diff > 3600:  # More than 1 hour\n                raise ValidationError('Form session expired.')\n            \n        except (ValueError, TypeError):\n            raise ValidationError('Invalid form timestamp.')\n        \n        return timestamp\n\nclass BotDetectionForm(HoneypotMixin, forms.Form):\n    \"\"\"Form with bot detection capabilities\"\"\"\n    \n    name = forms.CharField(max_length=100)\n    email = forms.EmailField()\n    message = forms.CharField(widget=forms.Textarea)\n    \n    def clean(self):\n        \"\"\"Additional bot detection\"\"\"\n        cleaned_data = super().clean()\n        \n        # Check for suspicious patterns\n        self.check_duplicate_content(cleaned_data)\n        self.check_spam_patterns(cleaned_data)\n        \n        return cleaned_data\n    \n    def check_duplicate_content(self, data):\n        \"\"\"Check for duplicate or repetitive content\"\"\"\n        name = data.get('name', '')\n        email = data.get('email', '')\n        message = data.get('message', '')\n        \n        # Check if name and message are identical (suspicious)\n        if name.lower() == message.lower():\n            raise ValidationError('Suspicious content detected.')\n        \n        # Check for excessive repetition\n        if len(set(message.split())) \u003C len(message.split()) * 0.3:\n            raise ValidationError('Message contains excessive repetition.')\n    \n    def check_spam_patterns(self, data):\n        \"\"\"Check for common spam patterns\"\"\"\n        message = data.get('message', '').lower()\n        \n        spam_indicators = [\n            'click here',\n            'free money',\n            'guaranteed',\n            'no risk',\n            'act now',\n            'limited time',\n            'viagra',\n            'casino',\n            'lottery',\n            'winner'\n        ]\n        \n        spam_count = sum(1 for indicator in spam_indicators if indicator in message)\n        \n        if spam_count >= 3:\n            raise ValidationError('Message appears to be spam.')\n\n# Advanced bot detection with behavioral analysis\nclass BehavioralBotDetection:\n    \"\"\"Behavioral analysis for bot detection\"\"\"\n    \n    def __init__(self, request):\n        self.request = request\n    \n    def analyze_request(self):\n        \"\"\"Analyze request for bot-like behavior\"\"\"\n        score = 0\n        \n        # Check User-Agent\n        user_agent = self.request.META.get('HTTP_USER_AGENT', '').lower()\n        if not user_agent or 'bot' in user_agent or 'crawler' in user_agent:\n            score += 30\n        \n        # Check for missing common headers\n        common_headers = ['HTTP_ACCEPT', 'HTTP_ACCEPT_LANGUAGE', 'HTTP_ACCEPT_ENCODING']\n        missing_headers = sum(1 for header in common_headers if not self.request.META.get(header))\n        score += missing_headers * 10\n        \n        # Check referer\n        referer = self.request.META.get('HTTP_REFERER', '')\n        if not referer:\n            score += 15\n        \n        # Check for suspicious IP patterns\n        ip = get_client_ip(self.request)\n        if self.is_suspicious_ip(ip):\n            score += 25\n        \n        return score >= 50  # Threshold for bot detection\n    \n    def is_suspicious_ip(self, ip):\n        \"\"\"Check if IP is from known bot networks\"\"\"\n        # This would typically check against known bot IP ranges\n        # For demo purposes, we'll check for localhost\n        return ip in ['127.0.0.1', '::1']\n\n# Middleware for bot detection\nclass BotDetectionMiddleware:\n    \"\"\"Middleware to detect and block bots\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # Skip bot detection for certain paths\n        skip_paths = ['/admin/', '/api/', '/static/', '/media/']\n        if any(request.path.startswith(path) for path in skip_paths):\n            return self.get_response(request)\n        \n        # Perform bot detection\n        detector = BehavioralBotDetection(request)\n        if detector.analyze_request():\n            # Log bot attempt\n            import logging\n            logger = logging.getLogger('security')\n            logger.warning(f'Bot detected from IP {get_client_ip(request)}')\n            \n            # Return 403 Forbidden\n            return HttpResponse('Access Denied', status=403)\n        \n        return self.get_response(request)\n",[1047,7778,7779,7784,7794,7812,7818,7822,7831,7840,7844,7868,7890,7894,7899,7928,7939,7959,7979,7999,8017,8022,8026,8030,8035,8064,8079,8104,8108,8112,8125,8134,8161,8165,8170,8179,8196,8200,8207,8211,8224,8233,8260,8264,8271,8287,8306,8321,8325,8330,8347,8364,8368,8373,8388,8405,8409,8426,8443,8447,8454,8458,8480,8489,8493,8516,8530,8556,8560,8573,8582,8597,8601,8605,8620,8635,8639,8646,8650,8668,8677,8703,8731,8757,8761,8766,8789,8806,8810,8815,8858,8875,8879,8896,8905,8935,8939,8948,8959,8970,8981,8992,9003,9014,9025,9036,9047,9056,9060,9064,9099,9103,9117,9134,9138,9143,9152,9161,9165,9181,9193,9197,9210,9219,9228,9232,9237,9277,9315,9326,9330,9335,9371,9419,9432,9436,9441,9476,9487,9496,9500,9505,9524,9542,9551,9555,9570,9574,9592,9601,9606,9611,9640,9644,9649,9658,9667,9671,9688,9702,9706,9723,9728,9773,9809,9825,9829,9834,9849,9863,9868,9876,9902,9936,9940,9945,9971,9975],{"__ignoreMap":1045},[1050,7780,7781],{"class":1052,"line":1053},[1050,7782,7783],{"class":1056},"# forms.py - Honeypot and bot detection\n",[1050,7785,7786,7788,7790,7792],{"class":1052,"line":1060},[1050,7787,1345],{"class":1344},[1050,7789,2297],{"class":1348},[1050,7791,1368],{"class":1344},[1050,7793,2302],{"class":1348},[1050,7795,7796,7798,7800,7802,7804,7806,7808,7810],{"class":1052,"line":1074},[1050,7797,1345],{"class":1344},[1050,7799,1349],{"class":1348},[1050,7801,1352],{"class":1067},[1050,7803,2331],{"class":1348},[1050,7805,1352],{"class":1067},[1050,7807,2336],{"class":1348},[1050,7809,1368],{"class":1344},[1050,7811,2341],{"class":1348},[1050,7813,7814,7816],{"class":1052,"line":1091},[1050,7815,1368],{"class":1344},[1050,7817,5685],{"class":1348},[1050,7819,7820],{"class":1052,"line":1103},[1050,7821,1177],{"emptyLinePlaceholder":1176},[1050,7823,7824,7826,7829],{"class":1052,"line":1115},[1050,7825,1738],{"class":1457},[1050,7827,7828],{"class":1741}," HoneypotMixin",[1050,7830,1514],{"class":1067},[1050,7832,7833,7835,7838],{"class":1052,"line":1131},[1050,7834,1478],{"class":1477},[1050,7836,7837],{"class":1481},"Mixin to add honeypot fields for bot detection",[1050,7839,1485],{"class":1477},[1050,7841,7842],{"class":1052,"line":1143},[1050,7843,1626],{"class":1348},[1050,7845,7846,7848,7850,7852,7854,7856,7858,7860,7862,7864,7866],{"class":1052,"line":1155},[1050,7847,1771],{"class":1457},[1050,7849,2431],{"class":2430},[1050,7851,1464],{"class":1067},[1050,7853,1780],{"class":1779},[1050,7855,1125],{"class":1067},[1050,7857,2449],{"class":1503},[1050,7859,2452],{"class":1467},[1050,7861,1125],{"class":1067},[1050,7863,2457],{"class":1503},[1050,7865,2460],{"class":1467},[1050,7867,1471],{"class":1067},[1050,7869,7870,7872,7874,7876,7878,7880,7882,7884,7886,7888],{"class":1052,"line":1167},[1050,7871,2482],{"class":2481},[1050,7873,2485],{"class":1067},[1050,7875,2488],{"class":2430},[1050,7877,1464],{"class":1067},[1050,7879,2493],{"class":1503},[1050,7881,2452],{"class":1526},[1050,7883,1125],{"class":1067},[1050,7885,2457],{"class":1503},[1050,7887,2460],{"class":1526},[1050,7889,1539],{"class":1067},[1050,7891,7892],{"class":1052,"line":1173},[1050,7893,2508],{"class":1348},[1050,7895,7896],{"class":1052,"line":1180},[1050,7897,7898],{"class":1056},"        # Add honeypot field (hidden from users)\n",[1050,7900,7901,7903,7905,7907,7909,7911,7914,7916,7918,7920,7922,7924,7926],{"class":1052,"line":1186},[1050,7902,2467],{"class":1063},[1050,7904,1352],{"class":1067},[1050,7906,2525],{"class":1499},[1050,7908,2528],{"class":1067},[1050,7910,1085],{"class":1077},[1050,7912,7913],{"class":1081},"website_url",[1050,7915,1085],{"class":1077},[1050,7917,3853],{"class":1067},[1050,7919,1068],{"class":1067},[1050,7921,2387],{"class":1348},[1050,7923,1352],{"class":1067},[1050,7925,2392],{"class":1526},[1050,7927,4040],{"class":1067},[1050,7929,7930,7933,7935,7937],{"class":1052,"line":1201},[1050,7931,7932],{"class":1720},"            required",[1050,7934,1523],{"class":1067},[1050,7936,2417],{"class":1194},[1050,7938,1088],{"class":1067},[1050,7940,7941,7944,7946,7948,7950,7952,7954,7956],{"class":1052,"line":1214},[1050,7942,7943],{"class":1720},"            widget",[1050,7945,1523],{"class":1067},[1050,7947,2357],{"class":1526},[1050,7949,1352],{"class":1067},[1050,7951,4080],{"class":1526},[1050,7953,1464],{"class":1067},[1050,7955,4085],{"class":1720},[1050,7957,7958],{"class":1067},"={\n",[1050,7960,7961,7963,7966,7968,7970,7972,7975,7977],{"class":1052,"line":1233},[1050,7962,5183],{"class":1077},[1050,7964,7965],{"class":1081},"style",[1050,7967,1085],{"class":1077},[1050,7969,1666],{"class":1067},[1050,7971,1222],{"class":1077},[1050,7973,7974],{"class":1081},"display: none !important;",[1050,7976,1085],{"class":1077},[1050,7978,1088],{"class":1067},[1050,7980,7981,7983,7986,7988,7990,7992,7995,7997],{"class":1052,"line":1248},[1050,7982,5183],{"class":1077},[1050,7984,7985],{"class":1081},"tabindex",[1050,7987,1085],{"class":1077},[1050,7989,1666],{"class":1067},[1050,7991,1222],{"class":1077},[1050,7993,7994],{"class":1081},"-1",[1050,7996,1085],{"class":1077},[1050,7998,1088],{"class":1067},[1050,8000,8001,8003,8006,8008,8010,8012,8015],{"class":1052,"line":1262},[1050,8002,5183],{"class":1077},[1050,8004,8005],{"class":1081},"autocomplete",[1050,8007,1085],{"class":1077},[1050,8009,1666],{"class":1067},[1050,8011,1222],{"class":1077},[1050,8013,8014],{"class":1081},"off",[1050,8016,2976],{"class":1077},[1050,8018,8019],{"class":1052,"line":1280},[1050,8020,8021],{"class":1067},"            })\n",[1050,8023,8024],{"class":1052,"line":1285},[1050,8025,4962],{"class":1067},[1050,8027,8028],{"class":1052,"line":1291},[1050,8029,2508],{"class":1348},[1050,8031,8032],{"class":1052,"line":1301},[1050,8033,8034],{"class":1056},"        # Add timestamp field for timing analysis\n",[1050,8036,8037,8039,8041,8043,8045,8047,8050,8052,8054,8056,8058,8060,8062],{"class":1052,"line":1313},[1050,8038,2467],{"class":1063},[1050,8040,1352],{"class":1067},[1050,8042,2525],{"class":1499},[1050,8044,2528],{"class":1067},[1050,8046,1085],{"class":1077},[1050,8048,8049],{"class":1081},"form_timestamp",[1050,8051,1085],{"class":1077},[1050,8053,3853],{"class":1067},[1050,8055,1068],{"class":1067},[1050,8057,2387],{"class":1348},[1050,8059,1352],{"class":1067},[1050,8061,2392],{"class":1526},[1050,8063,4040],{"class":1067},[1050,8065,8066,8068,8070,8072,8074,8076],{"class":1052,"line":1325},[1050,8067,7943],{"class":1720},[1050,8069,1523],{"class":1067},[1050,8071,2357],{"class":1526},[1050,8073,1352],{"class":1067},[1050,8075,2406],{"class":1526},[1050,8077,8078],{"class":1067},"(),\n",[1050,8080,8081,8084,8086,8089,8091,8093,8095,8097,8099,8101],{"class":1052,"line":1330},[1050,8082,8083],{"class":1720},"            initial",[1050,8085,1523],{"class":1067},[1050,8087,8088],{"class":2481},"str",[1050,8090,1464],{"class":1067},[1050,8092,6703],{"class":2481},[1050,8094,1464],{"class":1067},[1050,8096,6026],{"class":1526},[1050,8098,1352],{"class":1067},[1050,8100,6026],{"class":1526},[1050,8102,8103],{"class":1067},"()))\n",[1050,8105,8106],{"class":1052,"line":1335},[1050,8107,4962],{"class":1067},[1050,8109,8110],{"class":1052,"line":1341},[1050,8111,1626],{"class":1348},[1050,8113,8114,8116,8119,8121,8123],{"class":1052,"line":1379},[1050,8115,1771],{"class":1457},[1050,8117,8118],{"class":1450}," clean_website_url",[1050,8120,1464],{"class":1067},[1050,8122,1780],{"class":1779},[1050,8124,1471],{"class":1067},[1050,8126,8127,8129,8132],{"class":1052,"line":1401},[1050,8128,2572],{"class":1477},[1050,8130,8131],{"class":1481},"Honeypot validation",[1050,8133,1485],{"class":1477},[1050,8135,8136,8139,8141,8143,8145,8147,8149,8151,8153,8155,8157,8159],{"class":1052,"line":1422},[1050,8137,8138],{"class":1348},"        website_url ",[1050,8140,1523],{"class":1067},[1050,8142,2587],{"class":1063},[1050,8144,1352],{"class":1067},[1050,8146,1578],{"class":1499},[1050,8148,1352],{"class":1067},[1050,8150,2596],{"class":1526},[1050,8152,1464],{"class":1067},[1050,8154,1085],{"class":1077},[1050,8156,7913],{"class":1081},[1050,8158,1085],{"class":1077},[1050,8160,1539],{"class":1067},[1050,8162,8163],{"class":1052,"line":1439},[1050,8164,2508],{"class":1348},[1050,8166,8167],{"class":1052,"line":1444},[1050,8168,8169],{"class":1056},"        # If honeypot field is filled, it's likely a bot\n",[1050,8171,8172,8174,8177],{"class":1052,"line":1454},[1050,8173,1545],{"class":1344},[1050,8175,8176],{"class":1348}," website_url",[1050,8178,1514],{"class":1067},[1050,8180,8181,8183,8185,8187,8189,8192,8194],{"class":1052,"line":1474},[1050,8182,3330],{"class":1344},[1050,8184,2665],{"class":1526},[1050,8186,1464],{"class":1067},[1050,8188,1085],{"class":1077},[1050,8190,8191],{"class":1081},"Bot detected.",[1050,8193,1085],{"class":1077},[1050,8195,1539],{"class":1067},[1050,8197,8198],{"class":1052,"line":1488},[1050,8199,2508],{"class":1348},[1050,8201,8202,8204],{"class":1052,"line":1517},[1050,8203,1803],{"class":1344},[1050,8205,8206],{"class":1348}," website_url\n",[1050,8208,8209],{"class":1052,"line":1542},[1050,8210,1626],{"class":1348},[1050,8212,8213,8215,8218,8220,8222],{"class":1052,"line":1559},[1050,8214,1771],{"class":1457},[1050,8216,8217],{"class":1450}," clean_form_timestamp",[1050,8219,1464],{"class":1067},[1050,8221,1780],{"class":1779},[1050,8223,1471],{"class":1067},[1050,8225,8226,8228,8231],{"class":1052,"line":1565},[1050,8227,2572],{"class":1477},[1050,8229,8230],{"class":1481},"Timing-based bot detection",[1050,8232,1485],{"class":1477},[1050,8234,8235,8238,8240,8242,8244,8246,8248,8250,8252,8254,8256,8258],{"class":1052,"line":1583},[1050,8236,8237],{"class":1348},"        timestamp ",[1050,8239,1523],{"class":1067},[1050,8241,2587],{"class":1063},[1050,8243,1352],{"class":1067},[1050,8245,1578],{"class":1499},[1050,8247,1352],{"class":1067},[1050,8249,2596],{"class":1526},[1050,8251,1464],{"class":1067},[1050,8253,1085],{"class":1077},[1050,8255,8049],{"class":1081},[1050,8257,1085],{"class":1077},[1050,8259,1539],{"class":1067},[1050,8261,8262],{"class":1052,"line":1603},[1050,8263,2508],{"class":1348},[1050,8265,8266,8269],{"class":1052,"line":1611},[1050,8267,8268],{"class":1344},"        try",[1050,8270,1514],{"class":1067},[1050,8272,8273,8276,8278,8280,8282,8285],{"class":1052,"line":1623},[1050,8274,8275],{"class":1348},"            form_time ",[1050,8277,1523],{"class":1067},[1050,8279,7688],{"class":2481},[1050,8281,1464],{"class":1067},[1050,8283,8284],{"class":1526},"timestamp",[1050,8286,1539],{"class":1067},[1050,8288,8289,8292,8294,8296,8298,8300,8302,8304],{"class":1052,"line":1629},[1050,8290,8291],{"class":1348},"            current_time ",[1050,8293,1523],{"class":1067},[1050,8295,7688],{"class":2481},[1050,8297,1464],{"class":1067},[1050,8299,6026],{"class":1526},[1050,8301,1352],{"class":1067},[1050,8303,6026],{"class":1526},[1050,8305,4615],{"class":1067},[1050,8307,8308,8311,8313,8316,8318],{"class":1052,"line":1656},[1050,8309,8310],{"class":1348},"            time_diff ",[1050,8312,1523],{"class":1067},[1050,8314,8315],{"class":1348}," current_time ",[1050,8317,6068],{"class":1503},[1050,8319,8320],{"class":1348}," form_time\n",[1050,8322,8323],{"class":1052,"line":1673},[1050,8324,5161],{"class":1348},[1050,8326,8327],{"class":1052,"line":1694},[1050,8328,8329],{"class":1056},"            # Form filled too quickly (likely bot)\n",[1050,8331,8332,8334,8337,8339,8342,8344],{"class":1052,"line":1700},[1050,8333,2646],{"class":1344},[1050,8335,8336],{"class":1348}," time_diff ",[1050,8338,6073],{"class":1503},[1050,8340,8341],{"class":1241}," 3",[1050,8343,1666],{"class":1067},[1050,8345,8346],{"class":1056},"  # Less than 3 seconds\n",[1050,8348,8349,8351,8353,8355,8357,8360,8362],{"class":1052,"line":1705},[1050,8350,2662],{"class":1344},[1050,8352,2665],{"class":1526},[1050,8354,1464],{"class":1067},[1050,8356,1085],{"class":1077},[1050,8358,8359],{"class":1081},"Form submitted too quickly.",[1050,8361,1085],{"class":1077},[1050,8363,1539],{"class":1067},[1050,8365,8366],{"class":1052,"line":1735},[1050,8367,5161],{"class":1348},[1050,8369,8370],{"class":1052,"line":1753},[1050,8371,8372],{"class":1056},"            # Form took too long (possible session hijacking)\n",[1050,8374,8375,8377,8379,8381,8383,8385],{"class":1052,"line":1763},[1050,8376,2646],{"class":1344},[1050,8378,8336],{"class":1348},[1050,8380,5492],{"class":1503},[1050,8382,1242],{"class":1241},[1050,8384,1666],{"class":1067},[1050,8386,8387],{"class":1056},"  # More than 1 hour\n",[1050,8389,8390,8392,8394,8396,8398,8401,8403],{"class":1052,"line":1768},[1050,8391,2662],{"class":1344},[1050,8393,2665],{"class":1526},[1050,8395,1464],{"class":1067},[1050,8397,1085],{"class":1077},[1050,8399,8400],{"class":1081},"Form session expired.",[1050,8402,1085],{"class":1077},[1050,8404,1539],{"class":1067},[1050,8406,8407],{"class":1052,"line":1789},[1050,8408,5161],{"class":1348},[1050,8410,8411,8414,8416,8419,8421,8424],{"class":1052,"line":1800},[1050,8412,8413],{"class":1344},"        except",[1050,8415,6134],{"class":1067},[1050,8417,8418],{"class":2481},"ValueError",[1050,8420,1125],{"class":1067},[1050,8422,8423],{"class":2481}," TypeError",[1050,8425,1471],{"class":1067},[1050,8427,8428,8430,8432,8434,8436,8439,8441],{"class":1052,"line":1838},[1050,8429,3330],{"class":1344},[1050,8431,2665],{"class":1526},[1050,8433,1464],{"class":1067},[1050,8435,1085],{"class":1077},[1050,8437,8438],{"class":1081},"Invalid form timestamp.",[1050,8440,1085],{"class":1077},[1050,8442,1539],{"class":1067},[1050,8444,8445],{"class":1052,"line":1843},[1050,8446,2508],{"class":1348},[1050,8448,8449,8451],{"class":1052,"line":1861},[1050,8450,1803],{"class":1344},[1050,8452,8453],{"class":1348}," timestamp\n",[1050,8455,8456],{"class":1052,"line":1880},[1050,8457,1177],{"emptyLinePlaceholder":1176},[1050,8459,8460,8462,8465,8467,8470,8472,8474,8476,8478],{"class":1052,"line":1893},[1050,8461,1738],{"class":1457},[1050,8463,8464],{"class":1741}," BotDetectionForm",[1050,8466,1464],{"class":1067},[1050,8468,8469],{"class":1747},"HoneypotMixin",[1050,8471,1125],{"class":1067},[1050,8473,2387],{"class":1747},[1050,8475,1352],{"class":1067},[1050,8477,2362],{"class":1747},[1050,8479,1471],{"class":1067},[1050,8481,8482,8484,8487],{"class":1052,"line":1910},[1050,8483,1478],{"class":1477},[1050,8485,8486],{"class":1481},"Form with bot detection capabilities",[1050,8488,1485],{"class":1477},[1050,8490,8491],{"class":1052,"line":1933},[1050,8492,1626],{"class":1348},[1050,8494,8495,8497,8499,8501,8503,8505,8507,8510,8512,8514],{"class":1052,"line":1970},[1050,8496,4029],{"class":1348},[1050,8498,1523],{"class":1067},[1050,8500,2387],{"class":1348},[1050,8502,1352],{"class":1067},[1050,8504,2392],{"class":1526},[1050,8506,1464],{"class":1067},[1050,8508,8509],{"class":1720},"max_length",[1050,8511,1523],{"class":1067},[1050,8513,4050],{"class":1241},[1050,8515,1539],{"class":1067},[1050,8517,8518,8520,8522,8524,8526,8528],{"class":1052,"line":1975},[1050,8519,4119],{"class":1348},[1050,8521,1523],{"class":1067},[1050,8523,2387],{"class":1348},[1050,8525,1352],{"class":1067},[1050,8527,4128],{"class":1526},[1050,8529,1620],{"class":1067},[1050,8531,8532,8534,8536,8538,8540,8542,8544,8546,8548,8550,8552,8554],{"class":1052,"line":1981},[1050,8533,4348],{"class":1348},[1050,8535,1523],{"class":1067},[1050,8537,2387],{"class":1348},[1050,8539,1352],{"class":1067},[1050,8541,2392],{"class":1526},[1050,8543,1464],{"class":1067},[1050,8545,2397],{"class":1720},[1050,8547,1523],{"class":1067},[1050,8549,2357],{"class":1526},[1050,8551,1352],{"class":1067},[1050,8553,4385],{"class":1499},[1050,8555,1539],{"class":1067},[1050,8557,8558],{"class":1052,"line":1995},[1050,8559,1626],{"class":1348},[1050,8561,8562,8564,8567,8569,8571],{"class":1052,"line":2005},[1050,8563,1771],{"class":1457},[1050,8565,8566],{"class":1450}," clean",[1050,8568,1464],{"class":1067},[1050,8570,1780],{"class":1779},[1050,8572,1471],{"class":1067},[1050,8574,8575,8577,8580],{"class":1052,"line":2031},[1050,8576,2572],{"class":1477},[1050,8578,8579],{"class":1481},"Additional bot detection",[1050,8581,1485],{"class":1477},[1050,8583,8584,8587,8589,8591,8593,8595],{"class":1052,"line":2036},[1050,8585,8586],{"class":1348},"        cleaned_data ",[1050,8588,1523],{"class":1067},[1050,8590,7514],{"class":2481},[1050,8592,2485],{"class":1067},[1050,8594,4909],{"class":1526},[1050,8596,1620],{"class":1067},[1050,8598,8599],{"class":1052,"line":2042},[1050,8600,2508],{"class":1348},[1050,8602,8603],{"class":1052,"line":2047},[1050,8604,5464],{"class":1056},[1050,8606,8607,8609,8611,8614,8616,8618],{"class":1052,"line":2053},[1050,8608,2467],{"class":1063},[1050,8610,1352],{"class":1067},[1050,8612,8613],{"class":1526},"check_duplicate_content",[1050,8615,1464],{"class":1067},[1050,8617,1578],{"class":1526},[1050,8619,1539],{"class":1067},[1050,8621,8622,8624,8626,8629,8631,8633],{"class":1052,"line":2059},[1050,8623,2467],{"class":1063},[1050,8625,1352],{"class":1067},[1050,8627,8628],{"class":1526},"check_spam_patterns",[1050,8630,1464],{"class":1067},[1050,8632,1578],{"class":1526},[1050,8634,1539],{"class":1067},[1050,8636,8637],{"class":1052,"line":2065},[1050,8638,2508],{"class":1348},[1050,8640,8641,8643],{"class":1052,"line":2071},[1050,8642,1803],{"class":1344},[1050,8644,8645],{"class":1348}," cleaned_data\n",[1050,8647,8648],{"class":1052,"line":2077},[1050,8649,1626],{"class":1348},[1050,8651,8652,8654,8657,8659,8661,8663,8666],{"class":1052,"line":2083},[1050,8653,1771],{"class":1457},[1050,8655,8656],{"class":1450}," check_duplicate_content",[1050,8658,1464],{"class":1067},[1050,8660,1780],{"class":1779},[1050,8662,1125],{"class":1067},[1050,8664,8665],{"class":1467}," data",[1050,8667,1471],{"class":1067},[1050,8669,8670,8672,8675],{"class":1052,"line":2089},[1050,8671,2572],{"class":1477},[1050,8673,8674],{"class":1481},"Check for duplicate or repetitive content",[1050,8676,1485],{"class":1477},[1050,8678,8679,8681,8683,8685,8687,8689,8691,8693,8695,8697,8699,8701],{"class":1052,"line":2095},[1050,8680,4536],{"class":1348},[1050,8682,1523],{"class":1067},[1050,8684,8665],{"class":1348},[1050,8686,1352],{"class":1067},[1050,8688,2596],{"class":1526},[1050,8690,1464],{"class":1067},[1050,8692,1085],{"class":1077},[1050,8694,4551],{"class":1081},[1050,8696,1085],{"class":1077},[1050,8698,1125],{"class":1067},[1050,8700,2808],{"class":1077},[1050,8702,1539],{"class":1067},[1050,8704,8705,8708,8710,8712,8714,8716,8718,8720,8723,8725,8727,8729],{"class":1052,"line":2101},[1050,8706,8707],{"class":1348},"        email ",[1050,8709,1523],{"class":1067},[1050,8711,8665],{"class":1348},[1050,8713,1352],{"class":1067},[1050,8715,2596],{"class":1526},[1050,8717,1464],{"class":1067},[1050,8719,1085],{"class":1077},[1050,8721,8722],{"class":1081},"email",[1050,8724,1085],{"class":1077},[1050,8726,1125],{"class":1067},[1050,8728,2808],{"class":1077},[1050,8730,1539],{"class":1067},[1050,8732,8733,8735,8737,8739,8741,8743,8745,8747,8749,8751,8753,8755],{"class":1052,"line":2107},[1050,8734,4787],{"class":1348},[1050,8736,1523],{"class":1067},[1050,8738,8665],{"class":1348},[1050,8740,1352],{"class":1067},[1050,8742,2596],{"class":1526},[1050,8744,1464],{"class":1067},[1050,8746,1085],{"class":1077},[1050,8748,4802],{"class":1081},[1050,8750,1085],{"class":1077},[1050,8752,1125],{"class":1067},[1050,8754,2808],{"class":1077},[1050,8756,1539],{"class":1067},[1050,8758,8759],{"class":1052,"line":2113},[1050,8760,2508],{"class":1348},[1050,8762,8763],{"class":1052,"line":2118},[1050,8764,8765],{"class":1056},"        # Check if name and message are identical (suspicious)\n",[1050,8767,8768,8770,8772,8774,8776,8778,8780,8783,8785,8787],{"class":1052,"line":2124},[1050,8769,1545],{"class":1344},[1050,8771,1721],{"class":1348},[1050,8773,1352],{"class":1067},[1050,8775,3095],{"class":1526},[1050,8777,3098],{"class":1067},[1050,8779,1504],{"class":1503},[1050,8781,8782],{"class":1348}," message",[1050,8784,1352],{"class":1067},[1050,8786,3095],{"class":1526},[1050,8788,1556],{"class":1067},[1050,8790,8791,8793,8795,8797,8799,8802,8804],{"class":1052,"line":2130},[1050,8792,3330],{"class":1344},[1050,8794,2665],{"class":1526},[1050,8796,1464],{"class":1067},[1050,8798,1085],{"class":1077},[1050,8800,8801],{"class":1081},"Suspicious content detected.",[1050,8803,1085],{"class":1077},[1050,8805,1539],{"class":1067},[1050,8807,8808],{"class":1052,"line":2136},[1050,8809,2508],{"class":1348},[1050,8811,8812],{"class":1052,"line":2141},[1050,8813,8814],{"class":1056},"        # Check for excessive repetition\n",[1050,8816,8817,8819,8821,8823,8825,8827,8829,8831,8833,8836,8838,8840,8842,8844,8846,8848,8851,8853,8856],{"class":1052,"line":2147},[1050,8818,1545],{"class":1344},[1050,8820,3602],{"class":2430},[1050,8822,1464],{"class":1067},[1050,8824,6188],{"class":2481},[1050,8826,1464],{"class":1067},[1050,8828,4802],{"class":1526},[1050,8830,1352],{"class":1067},[1050,8832,4612],{"class":1526},[1050,8834,8835],{"class":1067},"()))",[1050,8837,4641],{"class":1503},[1050,8839,3602],{"class":2430},[1050,8841,1464],{"class":1067},[1050,8843,4802],{"class":1526},[1050,8845,1352],{"class":1067},[1050,8847,4612],{"class":1526},[1050,8849,8850],{"class":1067},"())",[1050,8852,2449],{"class":1503},[1050,8854,8855],{"class":1241}," 0.3",[1050,8857,1514],{"class":1067},[1050,8859,8860,8862,8864,8866,8868,8871,8873],{"class":1052,"line":2153},[1050,8861,3330],{"class":1344},[1050,8863,2665],{"class":1526},[1050,8865,1464],{"class":1067},[1050,8867,1085],{"class":1077},[1050,8869,8870],{"class":1081},"Message contains excessive repetition.",[1050,8872,1085],{"class":1077},[1050,8874,1539],{"class":1067},[1050,8876,8877],{"class":1052,"line":2159},[1050,8878,1626],{"class":1348},[1050,8880,8881,8883,8886,8888,8890,8892,8894],{"class":1052,"line":2165},[1050,8882,1771],{"class":1457},[1050,8884,8885],{"class":1450}," check_spam_patterns",[1050,8887,1464],{"class":1067},[1050,8889,1780],{"class":1779},[1050,8891,1125],{"class":1067},[1050,8893,8665],{"class":1467},[1050,8895,1471],{"class":1067},[1050,8897,8898,8900,8903],{"class":1052,"line":2171},[1050,8899,2572],{"class":1477},[1050,8901,8902],{"class":1481},"Check for common spam patterns",[1050,8904,1485],{"class":1477},[1050,8906,8907,8909,8911,8913,8915,8917,8919,8921,8923,8925,8927,8929,8931,8933],{"class":1052,"line":2177},[1050,8908,4787],{"class":1348},[1050,8910,1523],{"class":1067},[1050,8912,8665],{"class":1348},[1050,8914,1352],{"class":1067},[1050,8916,2596],{"class":1526},[1050,8918,1464],{"class":1067},[1050,8920,1085],{"class":1077},[1050,8922,4802],{"class":1081},[1050,8924,1085],{"class":1077},[1050,8926,1125],{"class":1067},[1050,8928,2808],{"class":1077},[1050,8930,5407],{"class":1067},[1050,8932,3095],{"class":1526},[1050,8934,1620],{"class":1067},[1050,8936,8937],{"class":1052,"line":2183},[1050,8938,2508],{"class":1348},[1050,8940,8941,8944,8946],{"class":1052,"line":2189},[1050,8942,8943],{"class":1348},"        spam_indicators ",[1050,8945,1523],{"class":1067},[1050,8947,1071],{"class":1067},[1050,8949,8950,8952,8955,8957],{"class":1052,"line":2195},[1050,8951,2871],{"class":1077},[1050,8953,8954],{"class":1081},"click here",[1050,8956,1085],{"class":1077},[1050,8958,1088],{"class":1067},[1050,8960,8961,8963,8966,8968],{"class":1052,"line":2200},[1050,8962,2871],{"class":1077},[1050,8964,8965],{"class":1081},"free money",[1050,8967,1085],{"class":1077},[1050,8969,1088],{"class":1067},[1050,8971,8972,8974,8977,8979],{"class":1052,"line":2205},[1050,8973,2871],{"class":1077},[1050,8975,8976],{"class":1081},"guaranteed",[1050,8978,1085],{"class":1077},[1050,8980,1088],{"class":1067},[1050,8982,8983,8985,8988,8990],{"class":1052,"line":2211},[1050,8984,2871],{"class":1077},[1050,8986,8987],{"class":1081},"no risk",[1050,8989,1085],{"class":1077},[1050,8991,1088],{"class":1067},[1050,8993,8994,8996,8999,9001],{"class":1052,"line":2217},[1050,8995,2871],{"class":1077},[1050,8997,8998],{"class":1081},"act now",[1050,9000,1085],{"class":1077},[1050,9002,1088],{"class":1067},[1050,9004,9005,9007,9010,9012],{"class":1052,"line":2223},[1050,9006,2871],{"class":1077},[1050,9008,9009],{"class":1081},"limited time",[1050,9011,1085],{"class":1077},[1050,9013,1088],{"class":1067},[1050,9015,9016,9018,9021,9023],{"class":1052,"line":2229},[1050,9017,2871],{"class":1077},[1050,9019,9020],{"class":1081},"viagra",[1050,9022,1085],{"class":1077},[1050,9024,1088],{"class":1067},[1050,9026,9027,9029,9032,9034],{"class":1052,"line":2235},[1050,9028,2871],{"class":1077},[1050,9030,9031],{"class":1081},"casino",[1050,9033,1085],{"class":1077},[1050,9035,1088],{"class":1067},[1050,9037,9038,9040,9043,9045],{"class":1052,"line":2241},[1050,9039,2871],{"class":1077},[1050,9041,9042],{"class":1081},"lottery",[1050,9044,1085],{"class":1077},[1050,9046,1088],{"class":1067},[1050,9048,9049,9051,9054],{"class":1052,"line":2246},[1050,9050,2871],{"class":1077},[1050,9052,9053],{"class":1081},"winner",[1050,9055,2976],{"class":1077},[1050,9057,9058],{"class":1052,"line":2252},[1050,9059,5588],{"class":1067},[1050,9061,9062],{"class":1052,"line":2258},[1050,9063,2508],{"class":1348},[1050,9065,9066,9069,9071,9074,9076,9079,9081,9084,9086,9089,9091,9093,9095,9097],{"class":1052,"line":2263},[1050,9067,9068],{"class":1348},"        spam_count ",[1050,9070,1523],{"class":1067},[1050,9072,9073],{"class":2430}," sum",[1050,9075,1464],{"class":1067},[1050,9077,9078],{"class":1241},"1",[1050,9080,3559],{"class":1344},[1050,9082,9083],{"class":1526}," indicator ",[1050,9085,3307],{"class":1344},[1050,9087,9088],{"class":1526}," spam_indicators ",[1050,9090,6062],{"class":1344},[1050,9092,9083],{"class":1526},[1050,9094,3307],{"class":1344},[1050,9096,8782],{"class":1526},[1050,9098,1539],{"class":1067},[1050,9100,9101],{"class":1052,"line":2268},[1050,9102,2508],{"class":1348},[1050,9104,9105,9107,9110,9113,9115],{"class":1052,"line":2274},[1050,9106,1545],{"class":1344},[1050,9108,9109],{"class":1348}," spam_count ",[1050,9111,9112],{"class":1503},">=",[1050,9114,8341],{"class":1241},[1050,9116,1514],{"class":1067},[1050,9118,9119,9121,9123,9125,9127,9130,9132],{"class":1052,"line":4622},[1050,9120,3330],{"class":1344},[1050,9122,2665],{"class":1526},[1050,9124,1464],{"class":1067},[1050,9126,1085],{"class":1077},[1050,9128,9129],{"class":1081},"Message appears to be spam.",[1050,9131,1085],{"class":1077},[1050,9133,1539],{"class":1067},[1050,9135,9136],{"class":1052,"line":4628},[1050,9137,1177],{"emptyLinePlaceholder":1176},[1050,9139,9140],{"class":1052,"line":4649},[1050,9141,9142],{"class":1056},"# Advanced bot detection with behavioral analysis\n",[1050,9144,9145,9147,9150],{"class":1052,"line":4667},[1050,9146,1738],{"class":1457},[1050,9148,9149],{"class":1741}," BehavioralBotDetection",[1050,9151,1514],{"class":1067},[1050,9153,9154,9156,9159],{"class":1052,"line":4672},[1050,9155,1478],{"class":1477},[1050,9157,9158],{"class":1481},"Behavioral analysis for bot detection",[1050,9160,1485],{"class":1477},[1050,9162,9163],{"class":1052,"line":4678},[1050,9164,1626],{"class":1348},[1050,9166,9167,9169,9171,9173,9175,9177,9179],{"class":1052,"line":4724},[1050,9168,1771],{"class":1457},[1050,9170,2431],{"class":2430},[1050,9172,1464],{"class":1067},[1050,9174,1780],{"class":1779},[1050,9176,1125],{"class":1067},[1050,9178,1494],{"class":1467},[1050,9180,1471],{"class":1067},[1050,9182,9183,9185,9187,9189,9191],{"class":1052,"line":4742},[1050,9184,2467],{"class":1063},[1050,9186,1352],{"class":1067},[1050,9188,1468],{"class":1499},[1050,9190,1068],{"class":1067},[1050,9192,2476],{"class":1348},[1050,9194,9195],{"class":1052,"line":4747},[1050,9196,1626],{"class":1348},[1050,9198,9199,9201,9204,9206,9208],{"class":1052,"line":4755},[1050,9200,1771],{"class":1457},[1050,9202,9203],{"class":1450}," analyze_request",[1050,9205,1464],{"class":1067},[1050,9207,1780],{"class":1779},[1050,9209,1471],{"class":1067},[1050,9211,9212,9214,9217],{"class":1052,"line":4760},[1050,9213,2572],{"class":1477},[1050,9215,9216],{"class":1481},"Analyze request for bot-like behavior",[1050,9218,1485],{"class":1477},[1050,9220,9221,9224,9226],{"class":1052,"line":4774},[1050,9222,9223],{"class":1348},"        score ",[1050,9225,1523],{"class":1067},[1050,9227,6221],{"class":1241},[1050,9229,9230],{"class":1052,"line":4784},[1050,9231,2508],{"class":1348},[1050,9233,9234],{"class":1052,"line":4809},[1050,9235,9236],{"class":1056},"        # Check User-Agent\n",[1050,9238,9239,9242,9244,9246,9248,9250,9252,9254,9256,9258,9260,9262,9265,9267,9269,9271,9273,9275],{"class":1052,"line":4814},[1050,9240,9241],{"class":1348},"        user_agent ",[1050,9243,1523],{"class":1067},[1050,9245,2587],{"class":1063},[1050,9247,1352],{"class":1067},[1050,9249,1468],{"class":1499},[1050,9251,1352],{"class":1067},[1050,9253,2790],{"class":1536},[1050,9255,1352],{"class":1067},[1050,9257,2596],{"class":1526},[1050,9259,1464],{"class":1067},[1050,9261,1085],{"class":1077},[1050,9263,9264],{"class":1081},"HTTP_USER_AGENT",[1050,9266,1085],{"class":1077},[1050,9268,1125],{"class":1067},[1050,9270,2808],{"class":1077},[1050,9272,5407],{"class":1067},[1050,9274,3095],{"class":1526},[1050,9276,1620],{"class":1067},[1050,9278,9279,9281,9283,9286,9288,9290,9293,9295,9297,9299,9301,9303,9306,9308,9310,9313],{"class":1052,"line":4820},[1050,9280,1545],{"class":1344},[1050,9282,3881],{"class":1503},[1050,9284,9285],{"class":1348}," user_agent ",[1050,9287,3404],{"class":1503},[1050,9289,1222],{"class":1077},[1050,9291,9292],{"class":1081},"bot",[1050,9294,1085],{"class":1077},[1050,9296,3087],{"class":1503},[1050,9298,9285],{"class":1348},[1050,9300,3404],{"class":1503},[1050,9302,1222],{"class":1077},[1050,9304,9305],{"class":1081},"crawler",[1050,9307,1085],{"class":1077},[1050,9309,3087],{"class":1503},[1050,9311,9312],{"class":1348}," user_agent",[1050,9314,1514],{"class":1067},[1050,9316,9317,9320,9323],{"class":1052,"line":4874},[1050,9318,9319],{"class":1348},"            score ",[1050,9321,9322],{"class":1067},"+=",[1050,9324,9325],{"class":1241}," 30\n",[1050,9327,9328],{"class":1052,"line":4885},[1050,9329,2508],{"class":1348},[1050,9331,9332],{"class":1052,"line":4890},[1050,9333,9334],{"class":1056},"        # Check for missing common headers\n",[1050,9336,9337,9340,9342,9344,9346,9349,9351,9353,9355,9358,9360,9362,9364,9367,9369],{"class":1052,"line":4896},[1050,9338,9339],{"class":1348},"        common_headers ",[1050,9341,1523],{"class":1067},[1050,9343,3466],{"class":1067},[1050,9345,1085],{"class":1077},[1050,9347,9348],{"class":1081},"HTTP_ACCEPT",[1050,9350,1085],{"class":1077},[1050,9352,1125],{"class":1067},[1050,9354,1222],{"class":1077},[1050,9356,9357],{"class":1081},"HTTP_ACCEPT_LANGUAGE",[1050,9359,1085],{"class":1077},[1050,9361,1125],{"class":1067},[1050,9363,1222],{"class":1077},[1050,9365,9366],{"class":1081},"HTTP_ACCEPT_ENCODING",[1050,9368,1085],{"class":1077},[1050,9370,1170],{"class":1067},[1050,9372,9373,9376,9378,9380,9382,9384,9386,9389,9391,9394,9396,9398,9400,9402,9404,9406,9408,9410,9412,9414,9417],{"class":1052,"line":4914},[1050,9374,9375],{"class":1348},"        missing_headers ",[1050,9377,1523],{"class":1067},[1050,9379,9073],{"class":2430},[1050,9381,1464],{"class":1067},[1050,9383,9078],{"class":1241},[1050,9385,3559],{"class":1344},[1050,9387,9388],{"class":1526}," header ",[1050,9390,3307],{"class":1344},[1050,9392,9393],{"class":1526}," common_headers ",[1050,9395,6062],{"class":1344},[1050,9397,3881],{"class":1344},[1050,9399,2587],{"class":1063},[1050,9401,1352],{"class":1067},[1050,9403,1468],{"class":1499},[1050,9405,1352],{"class":1067},[1050,9407,2790],{"class":1536},[1050,9409,1352],{"class":1067},[1050,9411,2596],{"class":1526},[1050,9413,1464],{"class":1067},[1050,9415,9416],{"class":1526},"header",[1050,9418,6382],{"class":1067},[1050,9420,9421,9423,9425,9428,9430],{"class":1052,"line":4922},[1050,9422,9223],{"class":1348},[1050,9424,9322],{"class":1067},[1050,9426,9427],{"class":1348}," missing_headers ",[1050,9429,2493],{"class":1503},[1050,9431,7314],{"class":1241},[1050,9433,9434],{"class":1052,"line":4935},[1050,9435,2508],{"class":1348},[1050,9437,9438],{"class":1052,"line":4948},[1050,9439,9440],{"class":1056},"        # Check referer\n",[1050,9442,9443,9446,9448,9450,9452,9454,9456,9458,9460,9462,9464,9466,9468,9470,9472,9474],{"class":1052,"line":4959},[1050,9444,9445],{"class":1348},"        referer ",[1050,9447,1523],{"class":1067},[1050,9449,2587],{"class":1063},[1050,9451,1352],{"class":1067},[1050,9453,1468],{"class":1499},[1050,9455,1352],{"class":1067},[1050,9457,2790],{"class":1536},[1050,9459,1352],{"class":1067},[1050,9461,2596],{"class":1526},[1050,9463,1464],{"class":1067},[1050,9465,1085],{"class":1077},[1050,9467,2801],{"class":1081},[1050,9469,1085],{"class":1077},[1050,9471,1125],{"class":1067},[1050,9473,2808],{"class":1077},[1050,9475,1539],{"class":1067},[1050,9477,9478,9480,9482,9485],{"class":1052,"line":4965},[1050,9479,1545],{"class":1344},[1050,9481,3881],{"class":1503},[1050,9483,9484],{"class":1348}," referer",[1050,9486,1514],{"class":1067},[1050,9488,9489,9491,9493],{"class":1052,"line":4970},[1050,9490,9319],{"class":1348},[1050,9492,9322],{"class":1067},[1050,9494,9495],{"class":1241}," 15\n",[1050,9497,9498],{"class":1052,"line":4976},[1050,9499,2508],{"class":1348},[1050,9501,9502],{"class":1052,"line":5003},[1050,9503,9504],{"class":1056},"        # Check for suspicious IP patterns\n",[1050,9506,9507,9510,9512,9514,9516,9518,9520,9522],{"class":1052,"line":5021},[1050,9508,9509],{"class":1348},"        ip ",[1050,9511,1523],{"class":1067},[1050,9513,6532],{"class":1526},[1050,9515,1464],{"class":1067},[1050,9517,1780],{"class":1063},[1050,9519,1352],{"class":1067},[1050,9521,1468],{"class":1499},[1050,9523,1539],{"class":1067},[1050,9525,9526,9528,9530,9532,9535,9537,9540],{"class":1052,"line":5026},[1050,9527,1545],{"class":1344},[1050,9529,2587],{"class":1063},[1050,9531,1352],{"class":1067},[1050,9533,9534],{"class":1526},"is_suspicious_ip",[1050,9536,1464],{"class":1067},[1050,9538,9539],{"class":1526},"ip",[1050,9541,1471],{"class":1067},[1050,9543,9544,9546,9548],{"class":1052,"line":5034},[1050,9545,9319],{"class":1348},[1050,9547,9322],{"class":1067},[1050,9549,9550],{"class":1241}," 25\n",[1050,9552,9553],{"class":1052,"line":5039},[1050,9554,2508],{"class":1348},[1050,9556,9557,9559,9562,9564,9567],{"class":1052,"line":5053},[1050,9558,1803],{"class":1344},[1050,9560,9561],{"class":1348}," score ",[1050,9563,9112],{"class":1503},[1050,9565,9566],{"class":1241}," 50",[1050,9568,9569],{"class":1056},"  # Threshold for bot detection\n",[1050,9571,9572],{"class":1052,"line":5063},[1050,9573,1626],{"class":1348},[1050,9575,9576,9578,9581,9583,9585,9587,9590],{"class":1052,"line":5092},[1050,9577,1771],{"class":1457},[1050,9579,9580],{"class":1450}," is_suspicious_ip",[1050,9582,1464],{"class":1067},[1050,9584,1780],{"class":1779},[1050,9586,1125],{"class":1067},[1050,9588,9589],{"class":1467}," ip",[1050,9591,1471],{"class":1067},[1050,9593,9594,9596,9599],{"class":1052,"line":5097},[1050,9595,2572],{"class":1477},[1050,9597,9598],{"class":1481},"Check if IP is from known bot networks",[1050,9600,1485],{"class":1477},[1050,9602,9603],{"class":1052,"line":5107},[1050,9604,9605],{"class":1056},"        # This would typically check against known bot IP ranges\n",[1050,9607,9608],{"class":1052,"line":5113},[1050,9609,9610],{"class":1056},"        # For demo purposes, we'll check for localhost\n",[1050,9612,9613,9615,9618,9620,9622,9624,9627,9629,9631,9633,9636,9638],{"class":1052,"line":5140},[1050,9614,1803],{"class":1344},[1050,9616,9617],{"class":1348}," ip ",[1050,9619,3307],{"class":1503},[1050,9621,3466],{"class":1067},[1050,9623,1085],{"class":1077},[1050,9625,9626],{"class":1081},"127.0.0.1",[1050,9628,1085],{"class":1077},[1050,9630,1125],{"class":1067},[1050,9632,1222],{"class":1077},[1050,9634,9635],{"class":1081},"::1",[1050,9637,1085],{"class":1077},[1050,9639,1170],{"class":1067},[1050,9641,9642],{"class":1052,"line":5158},[1050,9643,1177],{"emptyLinePlaceholder":1176},[1050,9645,9646],{"class":1052,"line":5164},[1050,9647,9648],{"class":1056},"# Middleware for bot detection\n",[1050,9650,9651,9653,9656],{"class":1052,"line":5170},[1050,9652,1738],{"class":1457},[1050,9654,9655],{"class":1741}," BotDetectionMiddleware",[1050,9657,1514],{"class":1067},[1050,9659,9660,9662,9665],{"class":1052,"line":5180},[1050,9661,1478],{"class":1477},[1050,9663,9664],{"class":1481},"Middleware to detect and block bots",[1050,9666,1485],{"class":1477},[1050,9668,9669],{"class":1052,"line":5193},[1050,9670,1626],{"class":1348},[1050,9672,9673,9675,9677,9679,9681,9683,9686],{"class":1052,"line":5205},[1050,9674,1771],{"class":1457},[1050,9676,2431],{"class":2430},[1050,9678,1464],{"class":1067},[1050,9680,1780],{"class":1779},[1050,9682,1125],{"class":1067},[1050,9684,9685],{"class":1467}," get_response",[1050,9687,1471],{"class":1067},[1050,9689,9690,9692,9694,9697,9699],{"class":1052,"line":5217},[1050,9691,2467],{"class":1063},[1050,9693,1352],{"class":1067},[1050,9695,9696],{"class":1499},"get_response",[1050,9698,1068],{"class":1067},[1050,9700,9701],{"class":1348}," get_response\n",[1050,9703,9704],{"class":1052,"line":5229},[1050,9705,1626],{"class":1348},[1050,9707,9708,9710,9713,9715,9717,9719,9721],{"class":1052,"line":5239},[1050,9709,1771],{"class":1457},[1050,9711,9712],{"class":2430}," __call__",[1050,9714,1464],{"class":1067},[1050,9716,1780],{"class":1779},[1050,9718,1125],{"class":1067},[1050,9720,1494],{"class":1467},[1050,9722,1471],{"class":1067},[1050,9724,9725],{"class":1052,"line":5245},[1050,9726,9727],{"class":1056},"        # Skip bot detection for certain paths\n",[1050,9729,9730,9733,9735,9737,9739,9742,9744,9746,9748,9751,9753,9755,9757,9760,9762,9764,9766,9769,9771],{"class":1052,"line":5250},[1050,9731,9732],{"class":1348},"        skip_paths ",[1050,9734,1523],{"class":1067},[1050,9736,3466],{"class":1067},[1050,9738,1085],{"class":1077},[1050,9740,9741],{"class":1081},"/admin/",[1050,9743,1085],{"class":1077},[1050,9745,1125],{"class":1067},[1050,9747,1222],{"class":1077},[1050,9749,9750],{"class":1081},"/api/",[1050,9752,1085],{"class":1077},[1050,9754,1125],{"class":1067},[1050,9756,1222],{"class":1077},[1050,9758,9759],{"class":1081},"/static/",[1050,9761,1085],{"class":1077},[1050,9763,1125],{"class":1067},[1050,9765,1222],{"class":1077},[1050,9767,9768],{"class":1081},"/media/",[1050,9770,1085],{"class":1077},[1050,9772,1170],{"class":1067},[1050,9774,9775,9777,9779,9781,9783,9785,9787,9789,9791,9793,9795,9797,9799,9802,9804,9807],{"class":1052,"line":5271},[1050,9776,1545],{"class":1344},[1050,9778,3536],{"class":2430},[1050,9780,1464],{"class":1067},[1050,9782,1468],{"class":1526},[1050,9784,1352],{"class":1067},[1050,9786,2770],{"class":1499},[1050,9788,1352],{"class":1067},[1050,9790,3752],{"class":1526},[1050,9792,1464],{"class":1067},[1050,9794,2770],{"class":1526},[1050,9796,2846],{"class":1067},[1050,9798,3559],{"class":1344},[1050,9800,9801],{"class":1526}," path ",[1050,9803,3307],{"class":1344},[1050,9805,9806],{"class":1526}," skip_paths",[1050,9808,1471],{"class":1067},[1050,9810,9811,9813,9815,9817,9819,9821,9823],{"class":1052,"line":5288},[1050,9812,1586],{"class":1344},[1050,9814,2587],{"class":1063},[1050,9816,1352],{"class":1067},[1050,9818,9696],{"class":1526},[1050,9820,1464],{"class":1067},[1050,9822,1468],{"class":1526},[1050,9824,1539],{"class":1067},[1050,9826,9827],{"class":1052,"line":5293},[1050,9828,2508],{"class":1348},[1050,9830,9831],{"class":1052,"line":5299},[1050,9832,9833],{"class":1056},"        # Perform bot detection\n",[1050,9835,9836,9839,9841,9843,9845,9847],{"class":1052,"line":5315},[1050,9837,9838],{"class":1348},"        detector ",[1050,9840,1523],{"class":1067},[1050,9842,9149],{"class":1526},[1050,9844,1464],{"class":1067},[1050,9846,1468],{"class":1526},[1050,9848,1539],{"class":1067},[1050,9850,9851,9853,9856,9858,9861],{"class":1052,"line":5320},[1050,9852,1545],{"class":1344},[1050,9854,9855],{"class":1348}," detector",[1050,9857,1352],{"class":1067},[1050,9859,9860],{"class":1526},"analyze_request",[1050,9862,1556],{"class":1067},[1050,9864,9865],{"class":1052,"line":5328},[1050,9866,9867],{"class":1056},"            # Log bot attempt\n",[1050,9869,9870,9873],{"class":1052,"line":5333},[1050,9871,9872],{"class":1344},"            import",[1050,9874,9875],{"class":1348}," logging\n",[1050,9877,9878,9881,9883,9886,9888,9891,9893,9895,9898,9900],{"class":1052,"line":5352},[1050,9879,9880],{"class":1348},"            logger ",[1050,9882,1523],{"class":1067},[1050,9884,9885],{"class":1348}," logging",[1050,9887,1352],{"class":1067},[1050,9889,9890],{"class":1526},"getLogger",[1050,9892,1464],{"class":1067},[1050,9894,1085],{"class":1077},[1050,9896,9897],{"class":1081},"security",[1050,9899,1085],{"class":1077},[1050,9901,1539],{"class":1067},[1050,9903,9904,9907,9909,9912,9914,9916,9919,9921,9924,9926,9928,9930,9932,9934],{"class":1052,"line":5362},[1050,9905,9906],{"class":1348},"            logger",[1050,9908,1352],{"class":1067},[1050,9910,9911],{"class":1526},"warning",[1050,9913,1464],{"class":1067},[1050,9915,3337],{"class":1457},[1050,9917,9918],{"class":1081},"'Bot detected from IP ",[1050,9920,3344],{"class":3343},[1050,9922,9923],{"class":1526},"get_client_ip",[1050,9925,1464],{"class":1067},[1050,9927,1468],{"class":1526},[1050,9929,2846],{"class":1067},[1050,9931,3350],{"class":3343},[1050,9933,1085],{"class":1081},[1050,9935,1539],{"class":1067},[1050,9937,9938],{"class":1052,"line":5368},[1050,9939,5161],{"class":1348},[1050,9941,9942],{"class":1052,"line":5387},[1050,9943,9944],{"class":1056},"            # Return 403 Forbidden\n",[1050,9946,9947,9949,9952,9954,9956,9959,9961,9963,9965,9967,9969],{"class":1052,"line":5438},[1050,9948,1586],{"class":1344},[1050,9950,9951],{"class":1526}," HttpResponse",[1050,9953,1464],{"class":1067},[1050,9955,1085],{"class":1077},[1050,9957,9958],{"class":1081},"Access Denied",[1050,9960,1085],{"class":1077},[1050,9962,1125],{"class":1067},[1050,9964,1960],{"class":1720},[1050,9966,1523],{"class":1067},[1050,9968,2912],{"class":1241},[1050,9970,1539],{"class":1067},[1050,9972,9973],{"class":1052,"line":5456},[1050,9974,2508],{"class":1348},[1050,9976,9977,9979,9981,9983,9985,9987,9989],{"class":1052,"line":5461},[1050,9978,1803],{"class":1344},[1050,9980,2587],{"class":1063},[1050,9982,1352],{"class":1067},[1050,9984,9696],{"class":1526},[1050,9986,1464],{"class":1067},[1050,9988,1468],{"class":1526},[1050,9990,1539],{"class":1067},[1030,9992,9994],{"id":9993},"file-upload-security","File Upload Security",[1035,9996,9998],{"id":9997},"secure-file-upload-handling","Secure File Upload Handling",[1040,10000,10002],{"className":1042,"code":10001,"language":1044,"meta":1045,"style":1045},"# utils.py - File upload security utilities\nimport os\nimport magic\nimport hashlib\nfrom django.core.exceptions import ValidationError\nfrom django.conf import settings\n\nclass SecureFileUpload:\n    \"\"\"Secure file upload handler\"\"\"\n    \n    ALLOWED_EXTENSIONS = {\n        'image': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp'],\n        'document': ['.pdf', '.doc', '.docx', '.txt', '.rtf'],\n        'archive': ['.zip', '.tar', '.gz'],\n    }\n    \n    ALLOWED_MIME_TYPES = {\n        'image': ['image/jpeg', 'image/png', 'image/gif', 'image/bmp', 'image/webp'],\n        'document': [\n            'application/pdf',\n            'application/msword',\n            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n            'text/plain',\n            'application/rtf'\n        ],\n        'archive': ['application/zip', 'application/x-tar', 'application/gzip'],\n    }\n    \n    MAX_FILE_SIZE = 10 * 1024 * 1024  # 10MB\n    \n    def __init__(self, file_category='document'):\n        self.file_category = file_category\n        self.allowed_extensions = self.ALLOWED_EXTENSIONS.get(file_category, [])\n        self.allowed_mime_types = self.ALLOWED_MIME_TYPES.get(file_category, [])\n    \n    def validate_file(self, uploaded_file):\n        \"\"\"Comprehensive file validation\"\"\"\n        # Check file size\n        self.validate_file_size(uploaded_file)\n        \n        # Check file extension\n        self.validate_file_extension(uploaded_file.name)\n        \n        # Check MIME type\n        self.validate_mime_type(uploaded_file)\n        \n        # Check file content\n        self.validate_file_content(uploaded_file)\n        \n        # Scan for malware (basic)\n        self.scan_for_malware(uploaded_file)\n        \n        return True\n    \n    def validate_file_size(self, uploaded_file):\n        \"\"\"Validate file size\"\"\"\n        if uploaded_file.size > self.MAX_FILE_SIZE:\n            raise ValidationError(\n                f'File size ({uploaded_file.size} bytes) exceeds maximum allowed size '\n                f'({self.MAX_FILE_SIZE} bytes).'\n            )\n    \n    def validate_file_extension(self, filename):\n        \"\"\"Validate file extension\"\"\"\n        _, ext = os.path.splitext(filename.lower())\n        \n        if ext not in self.allowed_extensions:\n            raise ValidationError(\n                f'File extension {ext} is not allowed. '\n                f'Allowed extensions: {\", \".join(self.allowed_extensions)}'\n            )\n    \n    def validate_mime_type(self, uploaded_file):\n        \"\"\"Validate MIME type using python-magic\"\"\"\n        uploaded_file.seek(0)\n        file_content = uploaded_file.read(1024)  # Read first 1KB\n        uploaded_file.seek(0)  # Reset file pointer\n        \n        try:\n            mime_type = magic.from_buffer(file_content, mime=True)\n        except:\n            # Fallback to Django's content_type\n            mime_type = uploaded_file.content_type\n        \n        if mime_type not in self.allowed_mime_types:\n            raise ValidationError(\n                f'File type {mime_type} is not allowed. '\n                f'Allowed types: {\", \".join(self.allowed_mime_types)}'\n            )\n    \n    def validate_file_content(self, uploaded_file):\n        \"\"\"Validate file content for malicious patterns\"\"\"\n        uploaded_file.seek(0)\n        \n        # Read file in chunks to avoid memory issues\n        chunk_size = 8192\n        suspicious_patterns = [\n            b'\u003Cscript',\n            b'javascript:',\n            b'eval(',\n            b'document.write',\n            b'\u003Ciframe',\n            b'\u003C?php',\n            b'\u003C%',\n            b'exec(',\n            b'system(',\n            b'shell_exec(',\n        ]\n        \n        while True:\n            chunk = uploaded_file.read(chunk_size)\n            if not chunk:\n                break\n            \n            chunk_lower = chunk.lower()\n            for pattern in suspicious_patterns:\n                if pattern in chunk_lower:\n                    raise ValidationError('File contains potentially malicious content.')\n        \n        uploaded_file.seek(0)  # Reset file pointer\n    \n    def scan_for_malware(self, uploaded_file):\n        \"\"\"Basic malware scanning\"\"\"\n        # Calculate file hash\n        uploaded_file.seek(0)\n        file_hash = hashlib.sha256()\n        \n        for chunk in iter(lambda: uploaded_file.read(4096), b\"\"):\n            file_hash.update(chunk)\n        \n        uploaded_file.seek(0)  # Reset file pointer\n        \n        # Check against known malware hashes (simplified)\n        malware_hashes = [\n            # Add known malware file hashes here\n        ]\n        \n        if file_hash.hexdigest() in malware_hashes:\n            raise ValidationError('File identified as malware.')\n    \n    def generate_safe_filename(self, original_filename):\n        \"\"\"Generate safe filename\"\"\"\n        # Remove directory path\n        filename = os.path.basename(original_filename)\n        \n        # Remove dangerous characters\n        safe_chars = '-_.() abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'\n        filename = ''.join(c for c in filename if c in safe_chars)\n        \n        # Limit filename length\n        name, ext = os.path.splitext(filename)\n        if len(name) > 100:\n            name = name[:100]\n        \n        # Add timestamp to prevent conflicts\n        import time\n        timestamp = str(int(time.time()))\n        \n        return f\"{name}_{timestamp}{ext}\"\n\n# forms.py - Secure file upload form\nfrom django import forms\nfrom .utils import SecureFileUpload\n\nclass SecureFileUploadForm(forms.Form):\n    \"\"\"Form with secure file upload\"\"\"\n    \n    title = forms.CharField(max_length=200)\n    description = forms.CharField(widget=forms.Textarea, required=False)\n    document = forms.FileField()\n    \n    def __init__(self, *args, **kwargs):\n        self.file_category = kwargs.pop('file_category', 'document')\n        super().__init__(*args, **kwargs)\n        \n        self.file_validator = SecureFileUpload(self.file_category)\n    \n    def clean_document(self):\n        \"\"\"Validate uploaded document\"\"\"\n        document = self.cleaned_data.get('document')\n        \n        if document:\n            # Perform security validation\n            self.file_validator.validate_file(document)\n            \n            # Generate safe filename\n            safe_filename = self.file_validator.generate_safe_filename(document.name)\n            document.name = safe_filename\n        \n        return document\n    \n    def save(self, upload_path=None):\n        \"\"\"Save uploaded file securely\"\"\"\n        if not upload_path:\n            upload_path = os.path.join(settings.MEDIA_ROOT, 'secure_uploads')\n        \n        # Ensure upload directory exists\n        os.makedirs(upload_path, exist_ok=True)\n        \n        document = self.cleaned_data['document']\n        file_path = os.path.join(upload_path, document.name)\n        \n        # Save file\n        with open(file_path, 'wb+') as destination:\n            for chunk in document.chunks():\n                destination.write(chunk)\n        \n        # Set secure file permissions\n        os.chmod(file_path, 0o644)\n        \n        return file_path\n\n# Virus scanning integration (example with ClamAV)\nclass VirusScanner:\n    \"\"\"Virus scanning utility\"\"\"\n    \n    def __init__(self):\n        self.enabled = getattr(settings, 'VIRUS_SCANNING_ENABLED', False)\n    \n    def scan_file(self, file_path):\n        \"\"\"Scan file for viruses\"\"\"\n        if not self.enabled:\n            return True\n        \n        try:\n            import pyclamd\n            cd = pyclamd.ClamdUnixSocket()\n            \n            # Scan file\n            result = cd.scan_file(file_path)\n            \n            if result is None:\n                return True  # Clean file\n            else:\n                return False  # Virus detected\n                \n        except ImportError:\n            # ClamAV not available, skip scanning\n            return True\n        except Exception as e:\n            # Log error and allow file (fail open)\n            import logging\n            logger = logging.getLogger('security')\n            logger.error(f'Virus scanning failed: {e}')\n            return True\n",[1047,10003,10004,10009,10016,10023,10030,10048,10064,10068,10077,10086,10090,10099,10166,10223,10263,10267,10271,10280,10334,10346,10356,10367,10378,10388,10397,10402,10441,10445,10449,10469,10473,10498,10512,10542,10572,10576,10594,10603,10608,10624,10628,10633,10652,10656,10661,10676,10680,10685,10700,10704,10709,10724,10728,10735,10739,10756,10765,10786,10794,10815,10835,10839,10843,10861,10870,10904,10908,10927,10935,10951,10986,10990,10994,11011,11020,11035,11057,11073,11077,11083,11115,11121,11126,11139,11143,11162,11170,11186,11219,11223,11227,11244,11253,11267,11271,11276,11286,11294,11307,11319,11332,11345,11357,11370,11383,11396,11409,11422,11426,11430,11439,11459,11470,11475,11479,11494,11507,11521,11538,11542,11558,11562,11579,11588,11593,11607,11624,11628,11668,11684,11688,11704,11708,11713,11722,11727,11731,11735,11756,11773,11777,11795,11804,11809,11834,11838,11843,11857,11895,11899,11904,11931,11950,11966,11970,11975,11982,12004,12008,12039,12043,12048,12058,12071,12075,12092,12101,12105,12129,12164,12179,12183,12207,12243,12265,12269,12292,12296,12309,12318,12345,12349,12358,12363,12382,12386,12391,12419,12434,12439,12447,12452,12475,12485,12496,12535,12540,12546,12573,12578,12601,12633,12638,12644,12677,12695,12711,12716,12722,12746,12751,12759,12764,12770,12780,12790,12795,12808,12842,12847,12866,12876,12891,12898,12903,12910,12918,12936,12941,12947,12969,12974,12990,13000,13007,13017,13023,13033,13039,13046,13061,13067,13074,13097,13124],{"__ignoreMap":1045},[1050,10005,10006],{"class":1052,"line":1053},[1050,10007,10008],{"class":1056},"# utils.py - File upload security utilities\n",[1050,10010,10011,10013],{"class":1052,"line":1060},[1050,10012,1368],{"class":1344},[1050,10014,10015],{"class":1348}," os\n",[1050,10017,10018,10020],{"class":1052,"line":1074},[1050,10019,1368],{"class":1344},[1050,10021,10022],{"class":1348}," magic\n",[1050,10024,10025,10027],{"class":1052,"line":1091},[1050,10026,1368],{"class":1344},[1050,10028,10029],{"class":1348}," hashlib\n",[1050,10031,10032,10034,10036,10038,10040,10042,10044,10046],{"class":1052,"line":1103},[1050,10033,1345],{"class":1344},[1050,10035,1349],{"class":1348},[1050,10037,1352],{"class":1067},[1050,10039,2331],{"class":1348},[1050,10041,1352],{"class":1067},[1050,10043,2336],{"class":1348},[1050,10045,1368],{"class":1344},[1050,10047,2341],{"class":1348},[1050,10049,10050,10052,10054,10056,10059,10061],{"class":1052,"line":1115},[1050,10051,1345],{"class":1344},[1050,10053,1349],{"class":1348},[1050,10055,1352],{"class":1067},[1050,10057,10058],{"class":1348},"conf ",[1050,10060,1368],{"class":1344},[1050,10062,10063],{"class":1348}," settings\n",[1050,10065,10066],{"class":1052,"line":1131},[1050,10067,1177],{"emptyLinePlaceholder":1176},[1050,10069,10070,10072,10075],{"class":1052,"line":1143},[1050,10071,1738],{"class":1457},[1050,10073,10074],{"class":1741}," SecureFileUpload",[1050,10076,1514],{"class":1067},[1050,10078,10079,10081,10084],{"class":1052,"line":1155},[1050,10080,1478],{"class":1477},[1050,10082,10083],{"class":1481},"Secure file upload handler",[1050,10085,1485],{"class":1477},[1050,10087,10088],{"class":1052,"line":1167},[1050,10089,1626],{"class":1348},[1050,10091,10092,10095,10097],{"class":1052,"line":1173},[1050,10093,10094],{"class":1063},"    ALLOWED_EXTENSIONS",[1050,10096,1068],{"class":1067},[1050,10098,1653],{"class":1067},[1050,10100,10101,10103,10106,10108,10110,10112,10114,10117,10119,10121,10123,10126,10128,10130,10132,10135,10137,10139,10141,10144,10146,10148,10150,10153,10155,10157,10159,10162,10164],{"class":1052,"line":1180},[1050,10102,1659],{"class":1077},[1050,10104,10105],{"class":1081},"image",[1050,10107,1085],{"class":1077},[1050,10109,1666],{"class":1067},[1050,10111,3466],{"class":1067},[1050,10113,1085],{"class":1077},[1050,10115,10116],{"class":1081},".jpg",[1050,10118,1085],{"class":1077},[1050,10120,1125],{"class":1067},[1050,10122,1222],{"class":1077},[1050,10124,10125],{"class":1081},".jpeg",[1050,10127,1085],{"class":1077},[1050,10129,1125],{"class":1067},[1050,10131,1222],{"class":1077},[1050,10133,10134],{"class":1081},".png",[1050,10136,1085],{"class":1077},[1050,10138,1125],{"class":1067},[1050,10140,1222],{"class":1077},[1050,10142,10143],{"class":1081},".gif",[1050,10145,1085],{"class":1077},[1050,10147,1125],{"class":1067},[1050,10149,1222],{"class":1077},[1050,10151,10152],{"class":1081},".bmp",[1050,10154,1085],{"class":1077},[1050,10156,1125],{"class":1067},[1050,10158,1222],{"class":1077},[1050,10160,10161],{"class":1081},".webp",[1050,10163,1085],{"class":1077},[1050,10165,4066],{"class":1067},[1050,10167,10168,10170,10172,10174,10176,10178,10180,10183,10185,10187,10189,10192,10194,10196,10198,10201,10203,10205,10207,10210,10212,10214,10216,10219,10221],{"class":1052,"line":1186},[1050,10169,1659],{"class":1077},[1050,10171,5546],{"class":1081},[1050,10173,1085],{"class":1077},[1050,10175,1666],{"class":1067},[1050,10177,3466],{"class":1067},[1050,10179,1085],{"class":1077},[1050,10181,10182],{"class":1081},".pdf",[1050,10184,1085],{"class":1077},[1050,10186,1125],{"class":1067},[1050,10188,1222],{"class":1077},[1050,10190,10191],{"class":1081},".doc",[1050,10193,1085],{"class":1077},[1050,10195,1125],{"class":1067},[1050,10197,1222],{"class":1077},[1050,10199,10200],{"class":1081},".docx",[1050,10202,1085],{"class":1077},[1050,10204,1125],{"class":1067},[1050,10206,1222],{"class":1077},[1050,10208,10209],{"class":1081},".txt",[1050,10211,1085],{"class":1077},[1050,10213,1125],{"class":1067},[1050,10215,1222],{"class":1077},[1050,10217,10218],{"class":1081},".rtf",[1050,10220,1085],{"class":1077},[1050,10222,4066],{"class":1067},[1050,10224,10225,10227,10230,10232,10234,10236,10238,10241,10243,10245,10247,10250,10252,10254,10256,10259,10261],{"class":1052,"line":1201},[1050,10226,1659],{"class":1077},[1050,10228,10229],{"class":1081},"archive",[1050,10231,1085],{"class":1077},[1050,10233,1666],{"class":1067},[1050,10235,3466],{"class":1067},[1050,10237,1085],{"class":1077},[1050,10239,10240],{"class":1081},".zip",[1050,10242,1085],{"class":1077},[1050,10244,1125],{"class":1067},[1050,10246,1222],{"class":1077},[1050,10248,10249],{"class":1081},".tar",[1050,10251,1085],{"class":1077},[1050,10253,1125],{"class":1067},[1050,10255,1222],{"class":1077},[1050,10257,10258],{"class":1081},".gz",[1050,10260,1085],{"class":1077},[1050,10262,4066],{"class":1067},[1050,10264,10265],{"class":1052,"line":1214},[1050,10266,2098],{"class":1067},[1050,10268,10269],{"class":1052,"line":1233},[1050,10270,1626],{"class":1348},[1050,10272,10273,10276,10278],{"class":1052,"line":1248},[1050,10274,10275],{"class":1063},"    ALLOWED_MIME_TYPES",[1050,10277,1068],{"class":1067},[1050,10279,1653],{"class":1067},[1050,10281,10282,10284,10286,10288,10290,10292,10294,10296,10298,10300,10302,10304,10306,10308,10310,10312,10314,10316,10318,10321,10323,10325,10327,10330,10332],{"class":1052,"line":1262},[1050,10283,1659],{"class":1077},[1050,10285,10105],{"class":1081},[1050,10287,1085],{"class":1077},[1050,10289,1666],{"class":1067},[1050,10291,3466],{"class":1067},[1050,10293,1085],{"class":1077},[1050,10295,5210],{"class":1081},[1050,10297,1085],{"class":1077},[1050,10299,1125],{"class":1067},[1050,10301,1222],{"class":1077},[1050,10303,5222],{"class":1081},[1050,10305,1085],{"class":1077},[1050,10307,1125],{"class":1067},[1050,10309,1222],{"class":1077},[1050,10311,5234],{"class":1081},[1050,10313,1085],{"class":1077},[1050,10315,1125],{"class":1067},[1050,10317,1222],{"class":1077},[1050,10319,10320],{"class":1081},"image/bmp",[1050,10322,1085],{"class":1077},[1050,10324,1125],{"class":1067},[1050,10326,1222],{"class":1077},[1050,10328,10329],{"class":1081},"image/webp",[1050,10331,1085],{"class":1077},[1050,10333,4066],{"class":1067},[1050,10335,10336,10338,10340,10342,10344],{"class":1052,"line":1280},[1050,10337,1659],{"class":1077},[1050,10339,5546],{"class":1081},[1050,10341,1085],{"class":1077},[1050,10343,1666],{"class":1067},[1050,10345,1071],{"class":1067},[1050,10347,10348,10350,10352,10354],{"class":1052,"line":1285},[1050,10349,2871],{"class":1077},[1050,10351,5198],{"class":1081},[1050,10353,1085],{"class":1077},[1050,10355,1088],{"class":1067},[1050,10357,10358,10360,10363,10365],{"class":1052,"line":1291},[1050,10359,2871],{"class":1077},[1050,10361,10362],{"class":1081},"application/msword",[1050,10364,1085],{"class":1077},[1050,10366,1088],{"class":1067},[1050,10368,10369,10371,10374,10376],{"class":1052,"line":1301},[1050,10370,2871],{"class":1077},[1050,10372,10373],{"class":1081},"application/vnd.openxmlformats-officedocument.wordprocessingml.document",[1050,10375,1085],{"class":1077},[1050,10377,1088],{"class":1067},[1050,10379,10380,10382,10384,10386],{"class":1052,"line":1313},[1050,10381,2871],{"class":1077},[1050,10383,5186],{"class":1081},[1050,10385,1085],{"class":1077},[1050,10387,1088],{"class":1067},[1050,10389,10390,10392,10395],{"class":1052,"line":1325},[1050,10391,2871],{"class":1077},[1050,10393,10394],{"class":1081},"application/rtf",[1050,10396,2976],{"class":1077},[1050,10398,10399],{"class":1052,"line":1330},[1050,10400,10401],{"class":1067},"        ],\n",[1050,10403,10404,10406,10408,10410,10412,10414,10416,10419,10421,10423,10425,10428,10430,10432,10434,10437,10439],{"class":1052,"line":1335},[1050,10405,1659],{"class":1077},[1050,10407,10229],{"class":1081},[1050,10409,1085],{"class":1077},[1050,10411,1666],{"class":1067},[1050,10413,3466],{"class":1067},[1050,10415,1085],{"class":1077},[1050,10417,10418],{"class":1081},"application/zip",[1050,10420,1085],{"class":1077},[1050,10422,1125],{"class":1067},[1050,10424,1222],{"class":1077},[1050,10426,10427],{"class":1081},"application/x-tar",[1050,10429,1085],{"class":1077},[1050,10431,1125],{"class":1067},[1050,10433,1222],{"class":1077},[1050,10435,10436],{"class":1081},"application/gzip",[1050,10438,1085],{"class":1077},[1050,10440,4066],{"class":1067},[1050,10442,10443],{"class":1052,"line":1341},[1050,10444,2098],{"class":1067},[1050,10446,10447],{"class":1052,"line":1379},[1050,10448,1626],{"class":1348},[1050,10450,10451,10454,10456,10458,10460,10462,10464,10466],{"class":1052,"line":1401},[1050,10452,10453],{"class":1063},"    MAX_FILE_SIZE",[1050,10455,1068],{"class":1067},[1050,10457,4998],{"class":1241},[1050,10459,2449],{"class":1503},[1050,10461,5131],{"class":1241},[1050,10463,2449],{"class":1503},[1050,10465,5131],{"class":1241},[1050,10467,10468],{"class":1056},"  # 10MB\n",[1050,10470,10471],{"class":1052,"line":1422},[1050,10472,1626],{"class":1348},[1050,10474,10475,10477,10479,10481,10483,10485,10488,10490,10492,10494,10496],{"class":1052,"line":1439},[1050,10476,1771],{"class":1457},[1050,10478,2431],{"class":2430},[1050,10480,1464],{"class":1067},[1050,10482,1780],{"class":1779},[1050,10484,1125],{"class":1067},[1050,10486,10487],{"class":1467}," file_category",[1050,10489,1523],{"class":1503},[1050,10491,1085],{"class":1077},[1050,10493,5546],{"class":1081},[1050,10495,1085],{"class":1077},[1050,10497,1471],{"class":1067},[1050,10499,10500,10502,10504,10507,10509],{"class":1052,"line":1444},[1050,10501,2467],{"class":1063},[1050,10503,1352],{"class":1067},[1050,10505,10506],{"class":1499},"file_category",[1050,10508,1068],{"class":1067},[1050,10510,10511],{"class":1348}," file_category\n",[1050,10513,10514,10516,10518,10521,10523,10525,10527,10530,10532,10534,10536,10538,10540],{"class":1052,"line":1454},[1050,10515,2467],{"class":1063},[1050,10517,1352],{"class":1067},[1050,10519,10520],{"class":1499},"allowed_extensions",[1050,10522,1068],{"class":1067},[1050,10524,2587],{"class":1063},[1050,10526,1352],{"class":1067},[1050,10528,10529],{"class":1536},"ALLOWED_EXTENSIONS",[1050,10531,1352],{"class":1067},[1050,10533,2596],{"class":1526},[1050,10535,1464],{"class":1067},[1050,10537,10506],{"class":1526},[1050,10539,1125],{"class":1067},[1050,10541,6011],{"class":1067},[1050,10543,10544,10546,10548,10551,10553,10555,10557,10560,10562,10564,10566,10568,10570],{"class":1052,"line":1474},[1050,10545,2467],{"class":1063},[1050,10547,1352],{"class":1067},[1050,10549,10550],{"class":1499},"allowed_mime_types",[1050,10552,1068],{"class":1067},[1050,10554,2587],{"class":1063},[1050,10556,1352],{"class":1067},[1050,10558,10559],{"class":1536},"ALLOWED_MIME_TYPES",[1050,10561,1352],{"class":1067},[1050,10563,2596],{"class":1526},[1050,10565,1464],{"class":1067},[1050,10567,10506],{"class":1526},[1050,10569,1125],{"class":1067},[1050,10571,6011],{"class":1067},[1050,10573,10574],{"class":1052,"line":1488},[1050,10575,1626],{"class":1348},[1050,10577,10578,10580,10583,10585,10587,10589,10592],{"class":1052,"line":1517},[1050,10579,1771],{"class":1457},[1050,10581,10582],{"class":1450}," validate_file",[1050,10584,1464],{"class":1067},[1050,10586,1780],{"class":1779},[1050,10588,1125],{"class":1067},[1050,10590,10591],{"class":1467}," uploaded_file",[1050,10593,1471],{"class":1067},[1050,10595,10596,10598,10601],{"class":1052,"line":1542},[1050,10597,2572],{"class":1477},[1050,10599,10600],{"class":1481},"Comprehensive file validation",[1050,10602,1485],{"class":1477},[1050,10604,10605],{"class":1052,"line":1559},[1050,10606,10607],{"class":1056},"        # Check file size\n",[1050,10609,10610,10612,10614,10617,10619,10622],{"class":1052,"line":1565},[1050,10611,2467],{"class":1063},[1050,10613,1352],{"class":1067},[1050,10615,10616],{"class":1526},"validate_file_size",[1050,10618,1464],{"class":1067},[1050,10620,10621],{"class":1526},"uploaded_file",[1050,10623,1539],{"class":1067},[1050,10625,10626],{"class":1052,"line":1583},[1050,10627,2508],{"class":1348},[1050,10629,10630],{"class":1052,"line":1603},[1050,10631,10632],{"class":1056},"        # Check file extension\n",[1050,10634,10635,10637,10639,10642,10644,10646,10648,10650],{"class":1052,"line":1611},[1050,10636,2467],{"class":1063},[1050,10638,1352],{"class":1067},[1050,10640,10641],{"class":1526},"validate_file_extension",[1050,10643,1464],{"class":1067},[1050,10645,10621],{"class":1526},[1050,10647,1352],{"class":1067},[1050,10649,4551],{"class":1499},[1050,10651,1539],{"class":1067},[1050,10653,10654],{"class":1052,"line":1623},[1050,10655,2508],{"class":1348},[1050,10657,10658],{"class":1052,"line":1629},[1050,10659,10660],{"class":1056},"        # Check MIME type\n",[1050,10662,10663,10665,10667,10670,10672,10674],{"class":1052,"line":1656},[1050,10664,2467],{"class":1063},[1050,10666,1352],{"class":1067},[1050,10668,10669],{"class":1526},"validate_mime_type",[1050,10671,1464],{"class":1067},[1050,10673,10621],{"class":1526},[1050,10675,1539],{"class":1067},[1050,10677,10678],{"class":1052,"line":1673},[1050,10679,2508],{"class":1348},[1050,10681,10682],{"class":1052,"line":1694},[1050,10683,10684],{"class":1056},"        # Check file content\n",[1050,10686,10687,10689,10691,10694,10696,10698],{"class":1052,"line":1700},[1050,10688,2467],{"class":1063},[1050,10690,1352],{"class":1067},[1050,10692,10693],{"class":1526},"validate_file_content",[1050,10695,1464],{"class":1067},[1050,10697,10621],{"class":1526},[1050,10699,1539],{"class":1067},[1050,10701,10702],{"class":1052,"line":1705},[1050,10703,2508],{"class":1348},[1050,10705,10706],{"class":1052,"line":1735},[1050,10707,10708],{"class":1056},"        # Scan for malware (basic)\n",[1050,10710,10711,10713,10715,10718,10720,10722],{"class":1052,"line":1753},[1050,10712,2467],{"class":1063},[1050,10714,1352],{"class":1067},[1050,10716,10717],{"class":1526},"scan_for_malware",[1050,10719,1464],{"class":1067},[1050,10721,10621],{"class":1526},[1050,10723,1539],{"class":1067},[1050,10725,10726],{"class":1052,"line":1763},[1050,10727,2508],{"class":1348},[1050,10729,10730,10732],{"class":1052,"line":1768},[1050,10731,1803],{"class":1344},[1050,10733,10734],{"class":1194}," True\n",[1050,10736,10737],{"class":1052,"line":1789},[1050,10738,1626],{"class":1348},[1050,10740,10741,10743,10746,10748,10750,10752,10754],{"class":1052,"line":1800},[1050,10742,1771],{"class":1457},[1050,10744,10745],{"class":1450}," validate_file_size",[1050,10747,1464],{"class":1067},[1050,10749,1780],{"class":1779},[1050,10751,1125],{"class":1067},[1050,10753,10591],{"class":1467},[1050,10755,1471],{"class":1067},[1050,10757,10758,10760,10763],{"class":1052,"line":1838},[1050,10759,2572],{"class":1477},[1050,10761,10762],{"class":1481},"Validate file size",[1050,10764,1485],{"class":1477},[1050,10766,10767,10769,10771,10773,10775,10777,10779,10781,10784],{"class":1052,"line":1843},[1050,10768,1545],{"class":1344},[1050,10770,10591],{"class":1348},[1050,10772,1352],{"class":1067},[1050,10774,5122],{"class":1499},[1050,10776,3611],{"class":1503},[1050,10778,2587],{"class":1063},[1050,10780,1352],{"class":1067},[1050,10782,10783],{"class":1536},"MAX_FILE_SIZE",[1050,10785,1514],{"class":1067},[1050,10787,10788,10790,10792],{"class":1052,"line":1861},[1050,10789,3330],{"class":1344},[1050,10791,2665],{"class":1526},[1050,10793,4040],{"class":1067},[1050,10795,10796,10799,10802,10804,10806,10808,10810,10812],{"class":1052,"line":1880},[1050,10797,10798],{"class":1457},"                f",[1050,10800,10801],{"class":1081},"'File size (",[1050,10803,3344],{"class":3343},[1050,10805,10621],{"class":1526},[1050,10807,1352],{"class":1067},[1050,10809,5122],{"class":1499},[1050,10811,3350],{"class":3343},[1050,10813,10814],{"class":1081}," bytes) exceeds maximum allowed size '\n",[1050,10816,10817,10819,10822,10824,10826,10828,10830,10832],{"class":1052,"line":1893},[1050,10818,10798],{"class":1457},[1050,10820,10821],{"class":1081},"'(",[1050,10823,3344],{"class":3343},[1050,10825,1780],{"class":1063},[1050,10827,1352],{"class":1067},[1050,10829,10783],{"class":1536},[1050,10831,3350],{"class":3343},[1050,10833,10834],{"class":1081}," bytes).'\n",[1050,10836,10837],{"class":1052,"line":1910},[1050,10838,6607],{"class":1067},[1050,10840,10841],{"class":1052,"line":1933},[1050,10842,1626],{"class":1348},[1050,10844,10845,10847,10850,10852,10854,10856,10859],{"class":1052,"line":1970},[1050,10846,1771],{"class":1457},[1050,10848,10849],{"class":1450}," validate_file_extension",[1050,10851,1464],{"class":1067},[1050,10853,1780],{"class":1779},[1050,10855,1125],{"class":1067},[1050,10857,10858],{"class":1467}," filename",[1050,10860,1471],{"class":1067},[1050,10862,10863,10865,10868],{"class":1052,"line":1975},[1050,10864,2572],{"class":1477},[1050,10866,10867],{"class":1481},"Validate file extension",[1050,10869,1485],{"class":1477},[1050,10871,10872,10875,10877,10879,10881,10884,10886,10888,10890,10893,10895,10898,10900,10902],{"class":1052,"line":1981},[1050,10873,10874],{"class":1348},"        _",[1050,10876,1125],{"class":1067},[1050,10878,3562],{"class":1348},[1050,10880,1523],{"class":1067},[1050,10882,10883],{"class":1348}," os",[1050,10885,1352],{"class":1067},[1050,10887,2770],{"class":1499},[1050,10889,1352],{"class":1067},[1050,10891,10892],{"class":1526},"splitext",[1050,10894,1464],{"class":1067},[1050,10896,10897],{"class":1526},"filename",[1050,10899,1352],{"class":1067},[1050,10901,3095],{"class":1526},[1050,10903,4615],{"class":1067},[1050,10905,10906],{"class":1052,"line":1995},[1050,10907,2508],{"class":1348},[1050,10909,10910,10912,10914,10917,10919,10921,10923,10925],{"class":1052,"line":2005},[1050,10911,1545],{"class":1344},[1050,10913,3562],{"class":1348},[1050,10915,10916],{"class":1503},"not",[1050,10918,3087],{"class":1503},[1050,10920,2587],{"class":1063},[1050,10922,1352],{"class":1067},[1050,10924,10520],{"class":1499},[1050,10926,1514],{"class":1067},[1050,10928,10929,10931,10933],{"class":1052,"line":2031},[1050,10930,3330],{"class":1344},[1050,10932,2665],{"class":1526},[1050,10934,4040],{"class":1067},[1050,10936,10937,10939,10942,10944,10946,10948],{"class":1052,"line":2036},[1050,10938,10798],{"class":1457},[1050,10940,10941],{"class":1081},"'File extension ",[1050,10943,3344],{"class":3343},[1050,10945,3554],{"class":1526},[1050,10947,3350],{"class":3343},[1050,10949,10950],{"class":1081}," is not allowed. '\n",[1050,10952,10953,10955,10958,10960,10963,10966,10968,10970,10972,10974,10976,10978,10980,10982,10984],{"class":1052,"line":2042},[1050,10954,10798],{"class":1457},[1050,10956,10957],{"class":1081},"'Allowed extensions: ",[1050,10959,3344],{"class":3343},[1050,10961,10962],{"class":1077},"\"",[1050,10964,10965],{"class":1081},", ",[1050,10967,10962],{"class":1077},[1050,10969,1352],{"class":1067},[1050,10971,4603],{"class":1526},[1050,10973,1464],{"class":1067},[1050,10975,1780],{"class":1063},[1050,10977,1352],{"class":1067},[1050,10979,10520],{"class":1499},[1050,10981,2846],{"class":1067},[1050,10983,3350],{"class":3343},[1050,10985,2976],{"class":1081},[1050,10987,10988],{"class":1052,"line":2047},[1050,10989,6607],{"class":1067},[1050,10991,10992],{"class":1052,"line":2053},[1050,10993,1626],{"class":1348},[1050,10995,10996,10998,11001,11003,11005,11007,11009],{"class":1052,"line":2059},[1050,10997,1771],{"class":1457},[1050,10999,11000],{"class":1450}," validate_mime_type",[1050,11002,1464],{"class":1067},[1050,11004,1780],{"class":1779},[1050,11006,1125],{"class":1067},[1050,11008,10591],{"class":1467},[1050,11010,1471],{"class":1067},[1050,11012,11013,11015,11018],{"class":1052,"line":2065},[1050,11014,2572],{"class":1477},[1050,11016,11017],{"class":1481},"Validate MIME type using python-magic",[1050,11019,1485],{"class":1477},[1050,11021,11022,11025,11027,11029,11031,11033],{"class":1052,"line":2071},[1050,11023,11024],{"class":1348},"        uploaded_file",[1050,11026,1352],{"class":1067},[1050,11028,5377],{"class":1526},[1050,11030,1464],{"class":1067},[1050,11032,5382],{"class":1241},[1050,11034,1539],{"class":1067},[1050,11036,11037,11040,11042,11044,11046,11048,11050,11052,11054],{"class":1052,"line":2077},[1050,11038,11039],{"class":1348},"        file_content ",[1050,11041,1523],{"class":1067},[1050,11043,10591],{"class":1348},[1050,11045,1352],{"class":1067},[1050,11047,5399],{"class":1526},[1050,11049,1464],{"class":1067},[1050,11051,5404],{"class":1241},[1050,11053,2846],{"class":1067},[1050,11055,11056],{"class":1056},"  # Read first 1KB\n",[1050,11058,11059,11061,11063,11065,11067,11069,11071],{"class":1052,"line":2083},[1050,11060,11024],{"class":1348},[1050,11062,1352],{"class":1067},[1050,11064,5377],{"class":1526},[1050,11066,1464],{"class":1067},[1050,11068,5382],{"class":1241},[1050,11070,2846],{"class":1067},[1050,11072,5453],{"class":1056},[1050,11074,11075],{"class":1052,"line":2089},[1050,11076,2508],{"class":1348},[1050,11078,11079,11081],{"class":1052,"line":2095},[1050,11080,8268],{"class":1344},[1050,11082,1514],{"class":1067},[1050,11084,11085,11088,11090,11093,11095,11098,11100,11103,11105,11108,11110,11113],{"class":1052,"line":2101},[1050,11086,11087],{"class":1348},"            mime_type ",[1050,11089,1523],{"class":1067},[1050,11091,11092],{"class":1348}," magic",[1050,11094,1352],{"class":1067},[1050,11096,11097],{"class":1526},"from_buffer",[1050,11099,1464],{"class":1067},[1050,11101,11102],{"class":1526},"file_content",[1050,11104,1125],{"class":1067},[1050,11106,11107],{"class":1720}," mime",[1050,11109,1523],{"class":1067},[1050,11111,11112],{"class":1194},"True",[1050,11114,1539],{"class":1067},[1050,11116,11117,11119],{"class":1052,"line":2107},[1050,11118,8413],{"class":1344},[1050,11120,1514],{"class":1067},[1050,11122,11123],{"class":1052,"line":2113},[1050,11124,11125],{"class":1056},"            # Fallback to Django's content_type\n",[1050,11127,11128,11130,11132,11134,11136],{"class":1052,"line":2118},[1050,11129,11087],{"class":1348},[1050,11131,1523],{"class":1067},[1050,11133,10591],{"class":1348},[1050,11135,1352],{"class":1067},[1050,11137,11138],{"class":1499},"content_type\n",[1050,11140,11141],{"class":1052,"line":2124},[1050,11142,2508],{"class":1348},[1050,11144,11145,11147,11150,11152,11154,11156,11158,11160],{"class":1052,"line":2130},[1050,11146,1545],{"class":1344},[1050,11148,11149],{"class":1348}," mime_type ",[1050,11151,10916],{"class":1503},[1050,11153,3087],{"class":1503},[1050,11155,2587],{"class":1063},[1050,11157,1352],{"class":1067},[1050,11159,10550],{"class":1499},[1050,11161,1514],{"class":1067},[1050,11163,11164,11166,11168],{"class":1052,"line":2136},[1050,11165,3330],{"class":1344},[1050,11167,2665],{"class":1526},[1050,11169,4040],{"class":1067},[1050,11171,11172,11174,11177,11179,11182,11184],{"class":1052,"line":2141},[1050,11173,10798],{"class":1457},[1050,11175,11176],{"class":1081},"'File type ",[1050,11178,3344],{"class":3343},[1050,11180,11181],{"class":1526},"mime_type",[1050,11183,3350],{"class":3343},[1050,11185,10950],{"class":1081},[1050,11187,11188,11190,11193,11195,11197,11199,11201,11203,11205,11207,11209,11211,11213,11215,11217],{"class":1052,"line":2147},[1050,11189,10798],{"class":1457},[1050,11191,11192],{"class":1081},"'Allowed types: ",[1050,11194,3344],{"class":3343},[1050,11196,10962],{"class":1077},[1050,11198,10965],{"class":1081},[1050,11200,10962],{"class":1077},[1050,11202,1352],{"class":1067},[1050,11204,4603],{"class":1526},[1050,11206,1464],{"class":1067},[1050,11208,1780],{"class":1063},[1050,11210,1352],{"class":1067},[1050,11212,10550],{"class":1499},[1050,11214,2846],{"class":1067},[1050,11216,3350],{"class":3343},[1050,11218,2976],{"class":1081},[1050,11220,11221],{"class":1052,"line":2153},[1050,11222,6607],{"class":1067},[1050,11224,11225],{"class":1052,"line":2159},[1050,11226,1626],{"class":1348},[1050,11228,11229,11231,11234,11236,11238,11240,11242],{"class":1052,"line":2165},[1050,11230,1771],{"class":1457},[1050,11232,11233],{"class":1450}," validate_file_content",[1050,11235,1464],{"class":1067},[1050,11237,1780],{"class":1779},[1050,11239,1125],{"class":1067},[1050,11241,10591],{"class":1467},[1050,11243,1471],{"class":1067},[1050,11245,11246,11248,11251],{"class":1052,"line":2171},[1050,11247,2572],{"class":1477},[1050,11249,11250],{"class":1481},"Validate file content for malicious patterns",[1050,11252,1485],{"class":1477},[1050,11254,11255,11257,11259,11261,11263,11265],{"class":1052,"line":2177},[1050,11256,11024],{"class":1348},[1050,11258,1352],{"class":1067},[1050,11260,5377],{"class":1526},[1050,11262,1464],{"class":1067},[1050,11264,5382],{"class":1241},[1050,11266,1539],{"class":1067},[1050,11268,11269],{"class":1052,"line":2183},[1050,11270,2508],{"class":1348},[1050,11272,11273],{"class":1052,"line":2189},[1050,11274,11275],{"class":1056},"        # Read file in chunks to avoid memory issues\n",[1050,11277,11278,11281,11283],{"class":1052,"line":2195},[1050,11279,11280],{"class":1348},"        chunk_size ",[1050,11282,1523],{"class":1067},[1050,11284,11285],{"class":1241}," 8192\n",[1050,11287,11288,11290,11292],{"class":1052,"line":2200},[1050,11289,5470],{"class":1348},[1050,11291,1523],{"class":1067},[1050,11293,1071],{"class":1067},[1050,11295,11296,11299,11301,11303,11305],{"class":1052,"line":2205},[1050,11297,11298],{"class":1457},"            b",[1050,11300,1085],{"class":1077},[1050,11302,3082],{"class":1081},[1050,11304,1085],{"class":1077},[1050,11306,1088],{"class":1067},[1050,11308,11309,11311,11313,11315,11317],{"class":1052,"line":2211},[1050,11310,11298],{"class":1457},[1050,11312,1085],{"class":1077},[1050,11314,3678],{"class":1081},[1050,11316,1085],{"class":1077},[1050,11318,1088],{"class":1067},[1050,11320,11321,11323,11325,11328,11330],{"class":1052,"line":2217},[1050,11322,11298],{"class":1457},[1050,11324,1085],{"class":1077},[1050,11326,11327],{"class":1081},"eval(",[1050,11329,1085],{"class":1077},[1050,11331,1088],{"class":1067},[1050,11333,11334,11336,11338,11341,11343],{"class":1052,"line":2223},[1050,11335,11298],{"class":1457},[1050,11337,1085],{"class":1077},[1050,11339,11340],{"class":1081},"document.write",[1050,11342,1085],{"class":1077},[1050,11344,1088],{"class":1067},[1050,11346,11347,11349,11351,11353,11355],{"class":1052,"line":2229},[1050,11348,11298],{"class":1457},[1050,11350,1085],{"class":1077},[1050,11352,5566],{"class":1081},[1050,11354,1085],{"class":1077},[1050,11356,1088],{"class":1067},[1050,11358,11359,11361,11363,11366,11368],{"class":1052,"line":2235},[1050,11360,11298],{"class":1457},[1050,11362,1085],{"class":1077},[1050,11364,11365],{"class":1081},"\u003C?php",[1050,11367,1085],{"class":1077},[1050,11369,1088],{"class":1067},[1050,11371,11372,11374,11376,11379,11381],{"class":1052,"line":2241},[1050,11373,11298],{"class":1457},[1050,11375,1085],{"class":1077},[1050,11377,11378],{"class":1081},"\u003C%",[1050,11380,1085],{"class":1077},[1050,11382,1088],{"class":1067},[1050,11384,11385,11387,11389,11392,11394],{"class":1052,"line":2246},[1050,11386,11298],{"class":1457},[1050,11388,1085],{"class":1077},[1050,11390,11391],{"class":1081},"exec(",[1050,11393,1085],{"class":1077},[1050,11395,1088],{"class":1067},[1050,11397,11398,11400,11402,11405,11407],{"class":1052,"line":2252},[1050,11399,11298],{"class":1457},[1050,11401,1085],{"class":1077},[1050,11403,11404],{"class":1081},"system(",[1050,11406,1085],{"class":1077},[1050,11408,1088],{"class":1067},[1050,11410,11411,11413,11415,11418,11420],{"class":1052,"line":2258},[1050,11412,11298],{"class":1457},[1050,11414,1085],{"class":1077},[1050,11416,11417],{"class":1081},"shell_exec(",[1050,11419,1085],{"class":1077},[1050,11421,1088],{"class":1067},[1050,11423,11424],{"class":1052,"line":2263},[1050,11425,5588],{"class":1067},[1050,11427,11428],{"class":1052,"line":2268},[1050,11429,2508],{"class":1348},[1050,11431,11432,11435,11437],{"class":1052,"line":2274},[1050,11433,11434],{"class":1344},"        while",[1050,11436,1195],{"class":1194},[1050,11438,1514],{"class":1067},[1050,11440,11441,11444,11446,11448,11450,11452,11454,11457],{"class":1052,"line":4622},[1050,11442,11443],{"class":1348},"            chunk ",[1050,11445,1523],{"class":1067},[1050,11447,10591],{"class":1348},[1050,11449,1352],{"class":1067},[1050,11451,5399],{"class":1526},[1050,11453,1464],{"class":1067},[1050,11455,11456],{"class":1526},"chunk_size",[1050,11458,1539],{"class":1067},[1050,11460,11461,11463,11465,11468],{"class":1052,"line":4628},[1050,11462,2646],{"class":1344},[1050,11464,3881],{"class":1503},[1050,11466,11467],{"class":1348}," chunk",[1050,11469,1514],{"class":1067},[1050,11471,11472],{"class":1052,"line":4649},[1050,11473,11474],{"class":1344},"                break\n",[1050,11476,11477],{"class":1052,"line":4667},[1050,11478,5161],{"class":1348},[1050,11480,11481,11484,11486,11488,11490,11492],{"class":1052,"line":4672},[1050,11482,11483],{"class":1348},"            chunk_lower ",[1050,11485,1523],{"class":1067},[1050,11487,11467],{"class":1348},[1050,11489,1352],{"class":1067},[1050,11491,3095],{"class":1526},[1050,11493,1620],{"class":1067},[1050,11495,11496,11499,11501,11503,11505],{"class":1052,"line":4678},[1050,11497,11498],{"class":1344},"            for",[1050,11500,5602],{"class":1348},[1050,11502,3307],{"class":1344},[1050,11504,5607],{"class":1348},[1050,11506,1514],{"class":1067},[1050,11508,11509,11512,11514,11516,11519],{"class":1052,"line":4724},[1050,11510,11511],{"class":1344},"                if",[1050,11513,5602],{"class":1348},[1050,11515,3307],{"class":1503},[1050,11517,11518],{"class":1348}," chunk_lower",[1050,11520,1514],{"class":1067},[1050,11522,11523,11526,11528,11530,11532,11534,11536],{"class":1052,"line":4742},[1050,11524,11525],{"class":1344},"                    raise",[1050,11527,2665],{"class":1526},[1050,11529,1464],{"class":1067},[1050,11531,1085],{"class":1077},[1050,11533,5656],{"class":1081},[1050,11535,1085],{"class":1077},[1050,11537,1539],{"class":1067},[1050,11539,11540],{"class":1052,"line":4747},[1050,11541,2508],{"class":1348},[1050,11543,11544,11546,11548,11550,11552,11554,11556],{"class":1052,"line":4755},[1050,11545,11024],{"class":1348},[1050,11547,1352],{"class":1067},[1050,11549,5377],{"class":1526},[1050,11551,1464],{"class":1067},[1050,11553,5382],{"class":1241},[1050,11555,2846],{"class":1067},[1050,11557,5453],{"class":1056},[1050,11559,11560],{"class":1052,"line":4760},[1050,11561,1626],{"class":1348},[1050,11563,11564,11566,11569,11571,11573,11575,11577],{"class":1052,"line":4774},[1050,11565,1771],{"class":1457},[1050,11567,11568],{"class":1450}," scan_for_malware",[1050,11570,1464],{"class":1067},[1050,11572,1780],{"class":1779},[1050,11574,1125],{"class":1067},[1050,11576,10591],{"class":1467},[1050,11578,1471],{"class":1067},[1050,11580,11581,11583,11586],{"class":1052,"line":4784},[1050,11582,2572],{"class":1477},[1050,11584,11585],{"class":1481},"Basic malware scanning",[1050,11587,1485],{"class":1477},[1050,11589,11590],{"class":1052,"line":4809},[1050,11591,11592],{"class":1056},"        # Calculate file hash\n",[1050,11594,11595,11597,11599,11601,11603,11605],{"class":1052,"line":4814},[1050,11596,11024],{"class":1348},[1050,11598,1352],{"class":1067},[1050,11600,5377],{"class":1526},[1050,11602,1464],{"class":1067},[1050,11604,5382],{"class":1241},[1050,11606,1539],{"class":1067},[1050,11608,11609,11612,11614,11617,11619,11622],{"class":1052,"line":4820},[1050,11610,11611],{"class":1348},"        file_hash ",[1050,11613,1523],{"class":1067},[1050,11615,11616],{"class":1348}," hashlib",[1050,11618,1352],{"class":1067},[1050,11620,11621],{"class":1526},"sha256",[1050,11623,1620],{"class":1067},[1050,11625,11626],{"class":1052,"line":4874},[1050,11627,2508],{"class":1348},[1050,11629,11630,11632,11635,11637,11640,11642,11645,11647,11649,11651,11653,11655,11658,11661,11664,11666],{"class":1052,"line":4885},[1050,11631,5599],{"class":1344},[1050,11633,11634],{"class":1348}," chunk ",[1050,11636,3307],{"class":1344},[1050,11638,11639],{"class":2430}," iter",[1050,11641,1464],{"class":1067},[1050,11643,11644],{"class":1457},"lambda",[1050,11646,1666],{"class":1067},[1050,11648,10591],{"class":1526},[1050,11650,1352],{"class":1067},[1050,11652,5399],{"class":1526},[1050,11654,1464],{"class":1067},[1050,11656,11657],{"class":1241},"4096",[1050,11659,11660],{"class":1067},"),",[1050,11662,11663],{"class":1457}," b",[1050,11665,2717],{"class":1077},[1050,11667,1471],{"class":1067},[1050,11669,11670,11673,11675,11677,11679,11682],{"class":1052,"line":4890},[1050,11671,11672],{"class":1348},"            file_hash",[1050,11674,1352],{"class":1067},[1050,11676,3196],{"class":1526},[1050,11678,1464],{"class":1067},[1050,11680,11681],{"class":1526},"chunk",[1050,11683,1539],{"class":1067},[1050,11685,11686],{"class":1052,"line":4896},[1050,11687,2508],{"class":1348},[1050,11689,11690,11692,11694,11696,11698,11700,11702],{"class":1052,"line":4914},[1050,11691,11024],{"class":1348},[1050,11693,1352],{"class":1067},[1050,11695,5377],{"class":1526},[1050,11697,1464],{"class":1067},[1050,11699,5382],{"class":1241},[1050,11701,2846],{"class":1067},[1050,11703,5453],{"class":1056},[1050,11705,11706],{"class":1052,"line":4922},[1050,11707,2508],{"class":1348},[1050,11709,11710],{"class":1052,"line":4935},[1050,11711,11712],{"class":1056},"        # Check against known malware hashes (simplified)\n",[1050,11714,11715,11718,11720],{"class":1052,"line":4948},[1050,11716,11717],{"class":1348},"        malware_hashes ",[1050,11719,1523],{"class":1067},[1050,11721,1071],{"class":1067},[1050,11723,11724],{"class":1052,"line":4959},[1050,11725,11726],{"class":1056},"            # Add known malware file hashes here\n",[1050,11728,11729],{"class":1052,"line":4965},[1050,11730,5588],{"class":1067},[1050,11732,11733],{"class":1052,"line":4970},[1050,11734,2508],{"class":1348},[1050,11736,11737,11739,11742,11744,11747,11749,11751,11754],{"class":1052,"line":4976},[1050,11738,1545],{"class":1344},[1050,11740,11741],{"class":1348}," file_hash",[1050,11743,1352],{"class":1067},[1050,11745,11746],{"class":1526},"hexdigest",[1050,11748,3098],{"class":1067},[1050,11750,3087],{"class":1503},[1050,11752,11753],{"class":1348}," malware_hashes",[1050,11755,1514],{"class":1067},[1050,11757,11758,11760,11762,11764,11766,11769,11771],{"class":1052,"line":5003},[1050,11759,3330],{"class":1344},[1050,11761,2665],{"class":1526},[1050,11763,1464],{"class":1067},[1050,11765,1085],{"class":1077},[1050,11767,11768],{"class":1081},"File identified as malware.",[1050,11770,1085],{"class":1077},[1050,11772,1539],{"class":1067},[1050,11774,11775],{"class":1052,"line":5021},[1050,11776,1626],{"class":1348},[1050,11778,11779,11781,11784,11786,11788,11790,11793],{"class":1052,"line":5026},[1050,11780,1771],{"class":1457},[1050,11782,11783],{"class":1450}," generate_safe_filename",[1050,11785,1464],{"class":1067},[1050,11787,1780],{"class":1779},[1050,11789,1125],{"class":1067},[1050,11791,11792],{"class":1467}," original_filename",[1050,11794,1471],{"class":1067},[1050,11796,11797,11799,11802],{"class":1052,"line":5034},[1050,11798,2572],{"class":1477},[1050,11800,11801],{"class":1481},"Generate safe filename",[1050,11803,1485],{"class":1477},[1050,11805,11806],{"class":1052,"line":5039},[1050,11807,11808],{"class":1056},"        # Remove directory path\n",[1050,11810,11811,11814,11816,11818,11820,11822,11824,11827,11829,11832],{"class":1052,"line":5053},[1050,11812,11813],{"class":1348},"        filename ",[1050,11815,1523],{"class":1067},[1050,11817,10883],{"class":1348},[1050,11819,1352],{"class":1067},[1050,11821,2770],{"class":1499},[1050,11823,1352],{"class":1067},[1050,11825,11826],{"class":1526},"basename",[1050,11828,1464],{"class":1067},[1050,11830,11831],{"class":1526},"original_filename",[1050,11833,1539],{"class":1067},[1050,11835,11836],{"class":1052,"line":5063},[1050,11837,2508],{"class":1348},[1050,11839,11840],{"class":1052,"line":5092},[1050,11841,11842],{"class":1056},"        # Remove dangerous characters\n",[1050,11844,11845,11848,11850,11852,11855],{"class":1052,"line":5097},[1050,11846,11847],{"class":1348},"        safe_chars ",[1050,11849,1523],{"class":1067},[1050,11851,1222],{"class":1077},[1050,11853,11854],{"class":1081},"-_.() abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",[1050,11856,2976],{"class":1077},[1050,11858,11859,11861,11863,11865,11867,11869,11871,11874,11876,11879,11881,11884,11886,11888,11890,11893],{"class":1052,"line":5107},[1050,11860,11813],{"class":1348},[1050,11862,1523],{"class":1067},[1050,11864,2808],{"class":1077},[1050,11866,1352],{"class":1067},[1050,11868,4603],{"class":1526},[1050,11870,1464],{"class":1067},[1050,11872,11873],{"class":1526},"c ",[1050,11875,6051],{"class":1344},[1050,11877,11878],{"class":1526}," c ",[1050,11880,3307],{"class":1344},[1050,11882,11883],{"class":1526}," filename ",[1050,11885,6062],{"class":1344},[1050,11887,11878],{"class":1526},[1050,11889,3307],{"class":1344},[1050,11891,11892],{"class":1526}," safe_chars",[1050,11894,1539],{"class":1067},[1050,11896,11897],{"class":1052,"line":5113},[1050,11898,2508],{"class":1348},[1050,11900,11901],{"class":1052,"line":5140},[1050,11902,11903],{"class":1056},"        # Limit filename length\n",[1050,11905,11906,11909,11911,11913,11915,11917,11919,11921,11923,11925,11927,11929],{"class":1052,"line":5158},[1050,11907,11908],{"class":1348},"        name",[1050,11910,1125],{"class":1067},[1050,11912,3562],{"class":1348},[1050,11914,1523],{"class":1067},[1050,11916,10883],{"class":1348},[1050,11918,1352],{"class":1067},[1050,11920,2770],{"class":1499},[1050,11922,1352],{"class":1067},[1050,11924,10892],{"class":1526},[1050,11926,1464],{"class":1067},[1050,11928,10897],{"class":1526},[1050,11930,1539],{"class":1067},[1050,11932,11933,11935,11937,11939,11941,11943,11945,11948],{"class":1052,"line":5164},[1050,11934,1545],{"class":1344},[1050,11936,3602],{"class":2430},[1050,11938,1464],{"class":1067},[1050,11940,4551],{"class":1526},[1050,11942,2846],{"class":1067},[1050,11944,3611],{"class":1503},[1050,11946,11947],{"class":1241}," 100",[1050,11949,1514],{"class":1067},[1050,11951,11952,11955,11957,11959,11962,11964],{"class":1052,"line":5170},[1050,11953,11954],{"class":1348},"            name ",[1050,11956,1523],{"class":1067},[1050,11958,1721],{"class":1348},[1050,11960,11961],{"class":1067},"[:",[1050,11963,4050],{"class":1241},[1050,11965,1170],{"class":1067},[1050,11967,11968],{"class":1052,"line":5180},[1050,11969,2508],{"class":1348},[1050,11971,11972],{"class":1052,"line":5193},[1050,11973,11974],{"class":1056},"        # Add timestamp to prevent conflicts\n",[1050,11976,11977,11980],{"class":1052,"line":5205},[1050,11978,11979],{"class":1344},"        import",[1050,11981,5685],{"class":1348},[1050,11983,11984,11986,11988,11990,11992,11994,11996,11998,12000,12002],{"class":1052,"line":5217},[1050,11985,8237],{"class":1348},[1050,11987,1523],{"class":1067},[1050,11989,6698],{"class":2481},[1050,11991,1464],{"class":1067},[1050,11993,6703],{"class":2481},[1050,11995,1464],{"class":1067},[1050,11997,6026],{"class":1526},[1050,11999,1352],{"class":1067},[1050,12001,6026],{"class":1526},[1050,12003,8103],{"class":1067},[1050,12005,12006],{"class":1052,"line":5229},[1050,12007,2508],{"class":1348},[1050,12009,12010,12012,12014,12016,12018,12020,12022,12025,12027,12029,12032,12034,12036],{"class":1052,"line":5239},[1050,12011,1803],{"class":1344},[1050,12013,5905],{"class":1457},[1050,12015,10962],{"class":1081},[1050,12017,3344],{"class":3343},[1050,12019,4551],{"class":1348},[1050,12021,3350],{"class":3343},[1050,12023,12024],{"class":1081},"_",[1050,12026,3344],{"class":3343},[1050,12028,8284],{"class":1348},[1050,12030,12031],{"class":3343},"}{",[1050,12033,3554],{"class":1348},[1050,12035,3350],{"class":3343},[1050,12037,12038],{"class":1081},"\"\n",[1050,12040,12041],{"class":1052,"line":5245},[1050,12042,1177],{"emptyLinePlaceholder":1176},[1050,12044,12045],{"class":1052,"line":5250},[1050,12046,12047],{"class":1056},"# forms.py - Secure file upload form\n",[1050,12049,12050,12052,12054,12056],{"class":1052,"line":5271},[1050,12051,1345],{"class":1344},[1050,12053,2297],{"class":1348},[1050,12055,1368],{"class":1344},[1050,12057,2302],{"class":1348},[1050,12059,12060,12062,12064,12066,12068],{"class":1052,"line":5288},[1050,12061,1345],{"class":1344},[1050,12063,3982],{"class":1067},[1050,12065,7018],{"class":1348},[1050,12067,1368],{"class":1344},[1050,12069,12070],{"class":1348}," SecureFileUpload\n",[1050,12072,12073],{"class":1052,"line":5293},[1050,12074,1177],{"emptyLinePlaceholder":1176},[1050,12076,12077,12079,12082,12084,12086,12088,12090],{"class":1052,"line":5299},[1050,12078,1738],{"class":1457},[1050,12080,12081],{"class":1741}," SecureFileUploadForm",[1050,12083,1464],{"class":1067},[1050,12085,2357],{"class":1747},[1050,12087,1352],{"class":1067},[1050,12089,2362],{"class":1747},[1050,12091,1471],{"class":1067},[1050,12093,12094,12096,12099],{"class":1052,"line":5315},[1050,12095,1478],{"class":1477},[1050,12097,12098],{"class":1481},"Form with secure file upload",[1050,12100,1485],{"class":1477},[1050,12102,12103],{"class":1052,"line":5320},[1050,12104,1626],{"class":1348},[1050,12106,12107,12110,12112,12114,12116,12118,12120,12122,12124,12127],{"class":1052,"line":5328},[1050,12108,12109],{"class":1348},"    title ",[1050,12111,1523],{"class":1067},[1050,12113,2387],{"class":1348},[1050,12115,1352],{"class":1067},[1050,12117,2392],{"class":1526},[1050,12119,1464],{"class":1067},[1050,12121,8509],{"class":1720},[1050,12123,1523],{"class":1067},[1050,12125,12126],{"class":1241},"200",[1050,12128,1539],{"class":1067},[1050,12130,12131,12134,12136,12138,12140,12142,12144,12146,12148,12150,12152,12154,12156,12158,12160,12162],{"class":1052,"line":5333},[1050,12132,12133],{"class":1348},"    description ",[1050,12135,1523],{"class":1067},[1050,12137,2387],{"class":1348},[1050,12139,1352],{"class":1067},[1050,12141,2392],{"class":1526},[1050,12143,1464],{"class":1067},[1050,12145,2397],{"class":1720},[1050,12147,1523],{"class":1067},[1050,12149,2357],{"class":1526},[1050,12151,1352],{"class":1067},[1050,12153,4385],{"class":1499},[1050,12155,1125],{"class":1067},[1050,12157,2412],{"class":1720},[1050,12159,1523],{"class":1067},[1050,12161,2417],{"class":1194},[1050,12163,1539],{"class":1067},[1050,12165,12166,12169,12171,12173,12175,12177],{"class":1052,"line":5352},[1050,12167,12168],{"class":1348},"    document ",[1050,12170,1523],{"class":1067},[1050,12172,2387],{"class":1348},[1050,12174,1352],{"class":1067},[1050,12176,4443],{"class":1526},[1050,12178,1620],{"class":1067},[1050,12180,12181],{"class":1052,"line":5362},[1050,12182,1626],{"class":1348},[1050,12184,12185,12187,12189,12191,12193,12195,12197,12199,12201,12203,12205],{"class":1052,"line":5368},[1050,12186,1771],{"class":1457},[1050,12188,2431],{"class":2430},[1050,12190,1464],{"class":1067},[1050,12192,1780],{"class":1779},[1050,12194,1125],{"class":1067},[1050,12196,2449],{"class":1503},[1050,12198,2452],{"class":1467},[1050,12200,1125],{"class":1067},[1050,12202,2457],{"class":1503},[1050,12204,2460],{"class":1467},[1050,12206,1471],{"class":1067},[1050,12208,12209,12211,12213,12215,12217,12220,12222,12225,12227,12229,12231,12233,12235,12237,12239,12241],{"class":1052,"line":5387},[1050,12210,2467],{"class":1063},[1050,12212,1352],{"class":1067},[1050,12214,10506],{"class":1499},[1050,12216,1068],{"class":1067},[1050,12218,12219],{"class":1348}," kwargs",[1050,12221,1352],{"class":1067},[1050,12223,12224],{"class":1526},"pop",[1050,12226,1464],{"class":1067},[1050,12228,1085],{"class":1077},[1050,12230,10506],{"class":1081},[1050,12232,1085],{"class":1077},[1050,12234,1125],{"class":1067},[1050,12236,1222],{"class":1077},[1050,12238,5546],{"class":1081},[1050,12240,1085],{"class":1077},[1050,12242,1539],{"class":1067},[1050,12244,12245,12247,12249,12251,12253,12255,12257,12259,12261,12263],{"class":1052,"line":5438},[1050,12246,2482],{"class":2481},[1050,12248,2485],{"class":1067},[1050,12250,2488],{"class":2430},[1050,12252,1464],{"class":1067},[1050,12254,2493],{"class":1503},[1050,12256,2452],{"class":1526},[1050,12258,1125],{"class":1067},[1050,12260,2457],{"class":1503},[1050,12262,2460],{"class":1526},[1050,12264,1539],{"class":1067},[1050,12266,12267],{"class":1052,"line":5456},[1050,12268,2508],{"class":1348},[1050,12270,12271,12273,12275,12278,12280,12282,12284,12286,12288,12290],{"class":1052,"line":5461},[1050,12272,2467],{"class":1063},[1050,12274,1352],{"class":1067},[1050,12276,12277],{"class":1499},"file_validator",[1050,12279,1068],{"class":1067},[1050,12281,10074],{"class":1526},[1050,12283,1464],{"class":1067},[1050,12285,1780],{"class":1063},[1050,12287,1352],{"class":1067},[1050,12289,10506],{"class":1499},[1050,12291,1539],{"class":1067},[1050,12293,12294],{"class":1052,"line":5467},[1050,12295,1626],{"class":1348},[1050,12297,12298,12300,12303,12305,12307],{"class":1052,"line":5477},[1050,12299,1771],{"class":1457},[1050,12301,12302],{"class":1450}," clean_document",[1050,12304,1464],{"class":1067},[1050,12306,1780],{"class":1779},[1050,12308,1471],{"class":1067},[1050,12310,12311,12313,12316],{"class":1052,"line":5505},[1050,12312,2572],{"class":1477},[1050,12314,12315],{"class":1481},"Validate uploaded document",[1050,12317,1485],{"class":1477},[1050,12319,12320,12323,12325,12327,12329,12331,12333,12335,12337,12339,12341,12343],{"class":1052,"line":5518},[1050,12321,12322],{"class":1348},"        document ",[1050,12324,1523],{"class":1067},[1050,12326,2587],{"class":1063},[1050,12328,1352],{"class":1067},[1050,12330,1578],{"class":1499},[1050,12332,1352],{"class":1067},[1050,12334,2596],{"class":1526},[1050,12336,1464],{"class":1067},[1050,12338,1085],{"class":1077},[1050,12340,5546],{"class":1081},[1050,12342,1085],{"class":1077},[1050,12344,1539],{"class":1067},[1050,12346,12347],{"class":1052,"line":5539},[1050,12348,2508],{"class":1348},[1050,12350,12351,12353,12356],{"class":1052,"line":5559},[1050,12352,1545],{"class":1344},[1050,12354,12355],{"class":1348}," document",[1050,12357,1514],{"class":1067},[1050,12359,12360],{"class":1052,"line":5585},[1050,12361,12362],{"class":1056},"            # Perform security validation\n",[1050,12364,12365,12367,12369,12371,12373,12376,12378,12380],{"class":1052,"line":5591},[1050,12366,1896],{"class":1063},[1050,12368,1352],{"class":1067},[1050,12370,12277],{"class":1499},[1050,12372,1352],{"class":1067},[1050,12374,12375],{"class":1526},"validate_file",[1050,12377,1464],{"class":1067},[1050,12379,5546],{"class":1526},[1050,12381,1539],{"class":1067},[1050,12383,12384],{"class":1052,"line":5596},[1050,12385,5161],{"class":1348},[1050,12387,12388],{"class":1052,"line":5612},[1050,12389,12390],{"class":1056},"            # Generate safe filename\n",[1050,12392,12393,12396,12398,12400,12402,12404,12406,12409,12411,12413,12415,12417],{"class":1052,"line":5645},[1050,12394,12395],{"class":1348},"            safe_filename ",[1050,12397,1523],{"class":1067},[1050,12399,2587],{"class":1063},[1050,12401,1352],{"class":1067},[1050,12403,12277],{"class":1499},[1050,12405,1352],{"class":1067},[1050,12407,12408],{"class":1526},"generate_safe_filename",[1050,12410,1464],{"class":1067},[1050,12412,5546],{"class":1526},[1050,12414,1352],{"class":1067},[1050,12416,4551],{"class":1499},[1050,12418,1539],{"class":1067},[1050,12420,12422,12425,12427,12429,12431],{"class":1052,"line":12421},188,[1050,12423,12424],{"class":1348},"            document",[1050,12426,1352],{"class":1067},[1050,12428,4551],{"class":1499},[1050,12430,1068],{"class":1067},[1050,12432,12433],{"class":1348}," safe_filename\n",[1050,12435,12437],{"class":1052,"line":12436},189,[1050,12438,2508],{"class":1348},[1050,12440,12442,12444],{"class":1052,"line":12441},190,[1050,12443,1803],{"class":1344},[1050,12445,12446],{"class":1348}," document\n",[1050,12448,12450],{"class":1052,"line":12449},191,[1050,12451,1626],{"class":1348},[1050,12453,12455,12457,12460,12462,12464,12466,12469,12471,12473],{"class":1052,"line":12454},192,[1050,12456,1771],{"class":1457},[1050,12458,12459],{"class":1450}," save",[1050,12461,1464],{"class":1067},[1050,12463,1780],{"class":1779},[1050,12465,1125],{"class":1067},[1050,12467,12468],{"class":1467}," upload_path",[1050,12470,1523],{"class":1503},[1050,12472,2444],{"class":1194},[1050,12474,1471],{"class":1067},[1050,12476,12478,12480,12483],{"class":1052,"line":12477},193,[1050,12479,2572],{"class":1477},[1050,12481,12482],{"class":1481},"Save uploaded file securely",[1050,12484,1485],{"class":1477},[1050,12486,12488,12490,12492,12494],{"class":1052,"line":12487},194,[1050,12489,1545],{"class":1344},[1050,12491,3881],{"class":1503},[1050,12493,12468],{"class":1348},[1050,12495,1514],{"class":1067},[1050,12497,12499,12502,12504,12506,12508,12510,12512,12514,12516,12519,12521,12524,12526,12528,12531,12533],{"class":1052,"line":12498},195,[1050,12500,12501],{"class":1348},"            upload_path ",[1050,12503,1523],{"class":1067},[1050,12505,10883],{"class":1348},[1050,12507,1352],{"class":1067},[1050,12509,2770],{"class":1499},[1050,12511,1352],{"class":1067},[1050,12513,4603],{"class":1526},[1050,12515,1464],{"class":1067},[1050,12517,12518],{"class":1526},"settings",[1050,12520,1352],{"class":1067},[1050,12522,12523],{"class":1536},"MEDIA_ROOT",[1050,12525,1125],{"class":1067},[1050,12527,1222],{"class":1077},[1050,12529,12530],{"class":1081},"secure_uploads",[1050,12532,1085],{"class":1077},[1050,12534,1539],{"class":1067},[1050,12536,12538],{"class":1052,"line":12537},196,[1050,12539,2508],{"class":1348},[1050,12541,12543],{"class":1052,"line":12542},197,[1050,12544,12545],{"class":1056},"        # Ensure upload directory exists\n",[1050,12547,12549,12552,12554,12557,12559,12562,12564,12567,12569,12571],{"class":1052,"line":12548},198,[1050,12550,12551],{"class":1348},"        os",[1050,12553,1352],{"class":1067},[1050,12555,12556],{"class":1526},"makedirs",[1050,12558,1464],{"class":1067},[1050,12560,12561],{"class":1526},"upload_path",[1050,12563,1125],{"class":1067},[1050,12565,12566],{"class":1720}," exist_ok",[1050,12568,1523],{"class":1067},[1050,12570,11112],{"class":1194},[1050,12572,1539],{"class":1067},[1050,12574,12576],{"class":1052,"line":12575},199,[1050,12577,2508],{"class":1348},[1050,12579,12581,12583,12585,12587,12589,12591,12593,12595,12597,12599],{"class":1052,"line":12580},200,[1050,12582,12322],{"class":1348},[1050,12584,1523],{"class":1067},[1050,12586,2587],{"class":1063},[1050,12588,1352],{"class":1067},[1050,12590,1578],{"class":1499},[1050,12592,2528],{"class":1067},[1050,12594,1085],{"class":1077},[1050,12596,5546],{"class":1081},[1050,12598,1085],{"class":1077},[1050,12600,1170],{"class":1067},[1050,12602,12604,12607,12609,12611,12613,12615,12617,12619,12621,12623,12625,12627,12629,12631],{"class":1052,"line":12603},201,[1050,12605,12606],{"class":1348},"        file_path ",[1050,12608,1523],{"class":1067},[1050,12610,10883],{"class":1348},[1050,12612,1352],{"class":1067},[1050,12614,2770],{"class":1499},[1050,12616,1352],{"class":1067},[1050,12618,4603],{"class":1526},[1050,12620,1464],{"class":1067},[1050,12622,12561],{"class":1526},[1050,12624,1125],{"class":1067},[1050,12626,12355],{"class":1526},[1050,12628,1352],{"class":1067},[1050,12630,4551],{"class":1499},[1050,12632,1539],{"class":1067},[1050,12634,12636],{"class":1052,"line":12635},202,[1050,12637,2508],{"class":1348},[1050,12639,12641],{"class":1052,"line":12640},203,[1050,12642,12643],{"class":1056},"        # Save file\n",[1050,12645,12647,12650,12653,12655,12658,12660,12662,12665,12667,12669,12672,12675],{"class":1052,"line":12646},204,[1050,12648,12649],{"class":1344},"        with",[1050,12651,12652],{"class":2430}," open",[1050,12654,1464],{"class":1067},[1050,12656,12657],{"class":1526},"file_path",[1050,12659,1125],{"class":1067},[1050,12661,1222],{"class":1077},[1050,12663,12664],{"class":1081},"wb+",[1050,12666,1085],{"class":1077},[1050,12668,2846],{"class":1067},[1050,12670,12671],{"class":1344}," as",[1050,12673,12674],{"class":1348}," destination",[1050,12676,1514],{"class":1067},[1050,12678,12680,12682,12684,12686,12688,12690,12693],{"class":1052,"line":12679},205,[1050,12681,11498],{"class":1344},[1050,12683,11634],{"class":1348},[1050,12685,3307],{"class":1344},[1050,12687,12355],{"class":1348},[1050,12689,1352],{"class":1067},[1050,12691,12692],{"class":1526},"chunks",[1050,12694,1556],{"class":1067},[1050,12696,12698,12701,12703,12705,12707,12709],{"class":1052,"line":12697},206,[1050,12699,12700],{"class":1348},"                destination",[1050,12702,1352],{"class":1067},[1050,12704,5552],{"class":1526},[1050,12706,1464],{"class":1067},[1050,12708,11681],{"class":1526},[1050,12710,1539],{"class":1067},[1050,12712,12714],{"class":1052,"line":12713},207,[1050,12715,2508],{"class":1348},[1050,12717,12719],{"class":1052,"line":12718},208,[1050,12720,12721],{"class":1056},"        # Set secure file permissions\n",[1050,12723,12725,12727,12729,12732,12734,12736,12738,12741,12744],{"class":1052,"line":12724},209,[1050,12726,12551],{"class":1348},[1050,12728,1352],{"class":1067},[1050,12730,12731],{"class":1526},"chmod",[1050,12733,1464],{"class":1067},[1050,12735,12657],{"class":1526},[1050,12737,1125],{"class":1067},[1050,12739,12740],{"class":1457}," 0o",[1050,12742,12743],{"class":1241},"644",[1050,12745,1539],{"class":1067},[1050,12747,12749],{"class":1052,"line":12748},210,[1050,12750,2508],{"class":1348},[1050,12752,12754,12756],{"class":1052,"line":12753},211,[1050,12755,1803],{"class":1344},[1050,12757,12758],{"class":1348}," file_path\n",[1050,12760,12762],{"class":1052,"line":12761},212,[1050,12763,1177],{"emptyLinePlaceholder":1176},[1050,12765,12767],{"class":1052,"line":12766},213,[1050,12768,12769],{"class":1056},"# Virus scanning integration (example with ClamAV)\n",[1050,12771,12773,12775,12778],{"class":1052,"line":12772},214,[1050,12774,1738],{"class":1457},[1050,12776,12777],{"class":1741}," VirusScanner",[1050,12779,1514],{"class":1067},[1050,12781,12783,12785,12788],{"class":1052,"line":12782},215,[1050,12784,1478],{"class":1477},[1050,12786,12787],{"class":1481},"Virus scanning utility",[1050,12789,1485],{"class":1477},[1050,12791,12793],{"class":1052,"line":12792},216,[1050,12794,1626],{"class":1348},[1050,12796,12798,12800,12802,12804,12806],{"class":1052,"line":12797},217,[1050,12799,1771],{"class":1457},[1050,12801,2431],{"class":2430},[1050,12803,1464],{"class":1067},[1050,12805,1780],{"class":1779},[1050,12807,1471],{"class":1067},[1050,12809,12811,12813,12815,12818,12820,12823,12825,12827,12829,12831,12834,12836,12838,12840],{"class":1052,"line":12810},218,[1050,12812,2467],{"class":1063},[1050,12814,1352],{"class":1067},[1050,12816,12817],{"class":1499},"enabled",[1050,12819,1068],{"class":1067},[1050,12821,12822],{"class":2430}," getattr",[1050,12824,1464],{"class":1067},[1050,12826,12518],{"class":1526},[1050,12828,1125],{"class":1067},[1050,12830,1222],{"class":1077},[1050,12832,12833],{"class":1081},"VIRUS_SCANNING_ENABLED",[1050,12835,1085],{"class":1077},[1050,12837,1125],{"class":1067},[1050,12839,1256],{"class":1194},[1050,12841,1539],{"class":1067},[1050,12843,12845],{"class":1052,"line":12844},219,[1050,12846,1626],{"class":1348},[1050,12848,12850,12852,12855,12857,12859,12861,12864],{"class":1052,"line":12849},220,[1050,12851,1771],{"class":1457},[1050,12853,12854],{"class":1450}," scan_file",[1050,12856,1464],{"class":1067},[1050,12858,1780],{"class":1779},[1050,12860,1125],{"class":1067},[1050,12862,12863],{"class":1467}," file_path",[1050,12865,1471],{"class":1067},[1050,12867,12869,12871,12874],{"class":1052,"line":12868},221,[1050,12870,2572],{"class":1477},[1050,12872,12873],{"class":1481},"Scan file for viruses",[1050,12875,1485],{"class":1477},[1050,12877,12879,12881,12883,12885,12887,12889],{"class":1052,"line":12878},222,[1050,12880,1545],{"class":1344},[1050,12882,3881],{"class":1503},[1050,12884,2587],{"class":1063},[1050,12886,1352],{"class":1067},[1050,12888,12817],{"class":1499},[1050,12890,1514],{"class":1067},[1050,12892,12894,12896],{"class":1052,"line":12893},223,[1050,12895,1586],{"class":1344},[1050,12897,10734],{"class":1194},[1050,12899,12901],{"class":1052,"line":12900},224,[1050,12902,2508],{"class":1348},[1050,12904,12906,12908],{"class":1052,"line":12905},225,[1050,12907,8268],{"class":1344},[1050,12909,1514],{"class":1067},[1050,12911,12913,12915],{"class":1052,"line":12912},226,[1050,12914,9872],{"class":1344},[1050,12916,12917],{"class":1348}," pyclamd\n",[1050,12919,12921,12924,12926,12929,12931,12934],{"class":1052,"line":12920},227,[1050,12922,12923],{"class":1348},"            cd ",[1050,12925,1523],{"class":1067},[1050,12927,12928],{"class":1348}," pyclamd",[1050,12930,1352],{"class":1067},[1050,12932,12933],{"class":1526},"ClamdUnixSocket",[1050,12935,1620],{"class":1067},[1050,12937,12939],{"class":1052,"line":12938},228,[1050,12940,5161],{"class":1348},[1050,12942,12944],{"class":1052,"line":12943},229,[1050,12945,12946],{"class":1056},"            # Scan file\n",[1050,12948,12950,12953,12955,12958,12960,12963,12965,12967],{"class":1052,"line":12949},230,[1050,12951,12952],{"class":1348},"            result ",[1050,12954,1523],{"class":1067},[1050,12956,12957],{"class":1348}," cd",[1050,12959,1352],{"class":1067},[1050,12961,12962],{"class":1526},"scan_file",[1050,12964,1464],{"class":1067},[1050,12966,12657],{"class":1526},[1050,12968,1539],{"class":1067},[1050,12970,12972],{"class":1052,"line":12971},231,[1050,12973,5161],{"class":1348},[1050,12975,12977,12979,12982,12985,12988],{"class":1052,"line":12976},232,[1050,12978,2646],{"class":1344},[1050,12980,12981],{"class":1348}," result ",[1050,12983,12984],{"class":1503},"is",[1050,12986,12987],{"class":1194}," None",[1050,12989,1514],{"class":1067},[1050,12991,12993,12995,12997],{"class":1052,"line":12992},233,[1050,12994,6715],{"class":1344},[1050,12996,1195],{"class":1194},[1050,12998,12999],{"class":1056},"  # Clean file\n",[1050,13001,13003,13005],{"class":1052,"line":13002},234,[1050,13004,6521],{"class":1344},[1050,13006,1514],{"class":1067},[1050,13008,13010,13012,13014],{"class":1052,"line":13009},235,[1050,13011,6715],{"class":1344},[1050,13013,1256],{"class":1194},[1050,13015,13016],{"class":1056},"  # Virus detected\n",[1050,13018,13020],{"class":1052,"line":13019},236,[1050,13021,13022],{"class":1348},"                \n",[1050,13024,13026,13028,13031],{"class":1052,"line":13025},237,[1050,13027,8413],{"class":1344},[1050,13029,13030],{"class":2481}," ImportError",[1050,13032,1514],{"class":1067},[1050,13034,13036],{"class":1052,"line":13035},238,[1050,13037,13038],{"class":1056},"            # ClamAV not available, skip scanning\n",[1050,13040,13042,13044],{"class":1052,"line":13041},239,[1050,13043,1586],{"class":1344},[1050,13045,10734],{"class":1194},[1050,13047,13049,13051,13054,13056,13059],{"class":1052,"line":13048},240,[1050,13050,8413],{"class":1344},[1050,13052,13053],{"class":2481}," Exception",[1050,13055,12671],{"class":1344},[1050,13057,13058],{"class":1348}," e",[1050,13060,1514],{"class":1067},[1050,13062,13064],{"class":1052,"line":13063},241,[1050,13065,13066],{"class":1056},"            # Log error and allow file (fail open)\n",[1050,13068,13070,13072],{"class":1052,"line":13069},242,[1050,13071,9872],{"class":1344},[1050,13073,9875],{"class":1348},[1050,13075,13077,13079,13081,13083,13085,13087,13089,13091,13093,13095],{"class":1052,"line":13076},243,[1050,13078,9880],{"class":1348},[1050,13080,1523],{"class":1067},[1050,13082,9885],{"class":1348},[1050,13084,1352],{"class":1067},[1050,13086,9890],{"class":1526},[1050,13088,1464],{"class":1067},[1050,13090,1085],{"class":1077},[1050,13092,9897],{"class":1081},[1050,13094,1085],{"class":1077},[1050,13096,1539],{"class":1067},[1050,13098,13100,13102,13104,13106,13108,13110,13113,13115,13118,13120,13122],{"class":1052,"line":13099},244,[1050,13101,9906],{"class":1348},[1050,13103,1352],{"class":1067},[1050,13105,2874],{"class":1526},[1050,13107,1464],{"class":1067},[1050,13109,3337],{"class":1457},[1050,13111,13112],{"class":1081},"'Virus scanning failed: ",[1050,13114,3344],{"class":3343},[1050,13116,13117],{"class":1526},"e",[1050,13119,3350],{"class":3343},[1050,13121,1085],{"class":1081},[1050,13123,1539],{"class":1067},[1050,13125,13127,13129],{"class":1052,"line":13126},245,[1050,13128,1586],{"class":1344},[1050,13130,10734],{"class":1194},[1030,13132,459],{"id":13133},"session-security",[1035,13135,13137],{"id":13136},"secure-session-management","Secure Session Management",[1040,13139,13141],{"className":1042,"code":13140,"language":1044,"meta":1045,"style":1045},"# settings.py - Secure session configuration\nSESSION_COOKIE_SECURE = True  # HTTPS only\nSESSION_COOKIE_HTTPONLY = True  # Prevent JavaScript access\nSESSION_COOKIE_SAMESITE = 'Strict'  # Strict same-site policy\nSESSION_COOKIE_AGE = 3600  # 1 hour session timeout\nSESSION_EXPIRE_AT_BROWSER_CLOSE = True\nSESSION_SAVE_EVERY_REQUEST = True  # Update session on every request\n\n# Custom session key\nSESSION_COOKIE_NAME = 'sessionid'\n\n# Session engine (database-backed for security)\nSESSION_ENGINE = 'django.contrib.sessions.backends.db'\n\n# middleware.py - Session security middleware\nfrom django.utils import timezone\nfrom django.contrib.auth import logout\nfrom django.shortcuts import redirect\n\nclass SessionSecurityMiddleware:\n    \"\"\"Enhanced session security middleware\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # Check session security\n        if request.user.is_authenticated:\n            self.validate_session_security(request)\n        \n        response = self.get_response(request)\n        \n        # Update session security info\n        if request.user.is_authenticated:\n            self.update_session_info(request)\n        \n        return response\n    \n    def validate_session_security(self, request):\n        \"\"\"Validate session security\"\"\"\n        session = request.session\n        \n        # Check for session hijacking\n        if self.detect_session_hijacking(request, session):\n            logout(request)\n            return redirect('login')\n        \n        # Check session timeout\n        if self.is_session_expired(session):\n            logout(request)\n            return redirect('login')\n    \n    def detect_session_hijacking(self, request, session):\n        \"\"\"Detect potential session hijacking\"\"\"\n        current_ip = get_client_ip(request)\n        current_user_agent = request.META.get('HTTP_USER_AGENT', '')\n        \n        # Check IP address consistency\n        session_ip = session.get('security_ip')\n        if session_ip and session_ip != current_ip:\n            return True\n        \n        # Check User-Agent consistency\n        session_user_agent = session.get('security_user_agent')\n        if session_user_agent and session_user_agent != current_user_agent:\n            return True\n        \n        return False\n    \n    def is_session_expired(self, session):\n        \"\"\"Check if session has expired\"\"\"\n        last_activity = session.get('last_activity')\n        if not last_activity:\n            return False\n        \n        # Convert string back to datetime\n        from datetime import datetime\n        last_activity = datetime.fromisoformat(last_activity)\n        \n        # Check if session has been inactive too long\n        inactive_time = timezone.now() - last_activity\n        max_inactive_time = timezone.timedelta(minutes=30)  # 30 minutes\n        \n        return inactive_time > max_inactive_time\n    \n    def update_session_info(self, request):\n        \"\"\"Update session security information\"\"\"\n        session = request.session\n        \n        # Store security information\n        session['security_ip'] = get_client_ip(request)\n        session['security_user_agent'] = request.META.get('HTTP_USER_AGENT', '')\n        session['last_activity'] = timezone.now().isoformat()\n        \n        # Regenerate session key periodically\n        last_regeneration = session.get('last_key_regeneration')\n        if not last_regeneration:\n            session.cycle_key()\n            session['last_key_regeneration'] = timezone.now().isoformat()\n        else:\n            last_regen = datetime.fromisoformat(last_regeneration)\n            if timezone.now() - last_regen > timezone.timedelta(hours=1):\n                session.cycle_key()\n                session['last_key_regeneration'] = timezone.now().isoformat()\n",[1047,13142,13143,13148,13160,13171,13186,13198,13207,13219,13223,13228,13242,13246,13251,13265,13269,13274,13289,13310,13324,13328,13337,13346,13350,13366,13378,13382,13398,13403,13419,13434,13438,13457,13461,13466,13482,13497,13501,13507,13511,13528,13537,13551,13555,13560,13582,13593,13610,13614,13619,13637,13647,13663,13667,13688,13697,13712,13743,13747,13752,13776,13795,13801,13805,13810,13834,13852,13858,13862,13869,13873,13890,13899,13923,13934,13940,13944,13949,13962,13982,13986,13991,14012,14041,14045,14057,14061,14078,14087,14099,14103,14108,14133,14173,14202,14206,14211,14235,14246,14258,14286,14293,14313,14349,14360],{"__ignoreMap":1045},[1050,13144,13145],{"class":1052,"line":1053},[1050,13146,13147],{"class":1056},"# settings.py - Secure session configuration\n",[1050,13149,13150,13153,13155,13157],{"class":1052,"line":1060},[1050,13151,13152],{"class":1063},"SESSION_COOKIE_SECURE",[1050,13154,1068],{"class":1067},[1050,13156,1195],{"class":1194},[1050,13158,13159],{"class":1056},"  # HTTPS only\n",[1050,13161,13162,13165,13167,13169],{"class":1052,"line":1074},[1050,13163,13164],{"class":1063},"SESSION_COOKIE_HTTPONLY",[1050,13166,1068],{"class":1067},[1050,13168,1195],{"class":1194},[1050,13170,1211],{"class":1056},[1050,13172,13173,13176,13178,13180,13182,13184],{"class":1052,"line":1091},[1050,13174,13175],{"class":1063},"SESSION_COOKIE_SAMESITE",[1050,13177,1068],{"class":1067},[1050,13179,1222],{"class":1077},[1050,13181,1225],{"class":1081},[1050,13183,1085],{"class":1077},[1050,13185,1230],{"class":1056},[1050,13187,13188,13191,13193,13195],{"class":1052,"line":1103},[1050,13189,13190],{"class":1063},"SESSION_COOKIE_AGE",[1050,13192,1068],{"class":1067},[1050,13194,1242],{"class":1241},[1050,13196,13197],{"class":1056},"  # 1 hour session timeout\n",[1050,13199,13200,13203,13205],{"class":1052,"line":1115},[1050,13201,13202],{"class":1063},"SESSION_EXPIRE_AT_BROWSER_CLOSE",[1050,13204,1068],{"class":1067},[1050,13206,10734],{"class":1194},[1050,13208,13209,13212,13214,13216],{"class":1052,"line":1131},[1050,13210,13211],{"class":1063},"SESSION_SAVE_EVERY_REQUEST",[1050,13213,1068],{"class":1067},[1050,13215,1195],{"class":1194},[1050,13217,13218],{"class":1056},"  # Update session on every request\n",[1050,13220,13221],{"class":1052,"line":1143},[1050,13222,1177],{"emptyLinePlaceholder":1176},[1050,13224,13225],{"class":1052,"line":1155},[1050,13226,13227],{"class":1056},"# Custom session key\n",[1050,13229,13230,13233,13235,13237,13240],{"class":1052,"line":1167},[1050,13231,13232],{"class":1063},"SESSION_COOKIE_NAME",[1050,13234,1068],{"class":1067},[1050,13236,1222],{"class":1077},[1050,13238,13239],{"class":1081},"sessionid",[1050,13241,2976],{"class":1077},[1050,13243,13244],{"class":1052,"line":1173},[1050,13245,1177],{"emptyLinePlaceholder":1176},[1050,13247,13248],{"class":1052,"line":1180},[1050,13249,13250],{"class":1056},"# Session engine (database-backed for security)\n",[1050,13252,13253,13256,13258,13260,13263],{"class":1052,"line":1186},[1050,13254,13255],{"class":1063},"SESSION_ENGINE",[1050,13257,1068],{"class":1067},[1050,13259,1222],{"class":1077},[1050,13261,13262],{"class":1081},"django.contrib.sessions.backends.db",[1050,13264,2976],{"class":1077},[1050,13266,13267],{"class":1052,"line":1201},[1050,13268,1177],{"emptyLinePlaceholder":1176},[1050,13270,13271],{"class":1052,"line":1214},[1050,13272,13273],{"class":1056},"# middleware.py - Session security middleware\n",[1050,13275,13276,13278,13280,13282,13284,13286],{"class":1052,"line":1233},[1050,13277,1345],{"class":1344},[1050,13279,1349],{"class":1348},[1050,13281,1352],{"class":1067},[1050,13283,7018],{"class":1348},[1050,13285,1368],{"class":1344},[1050,13287,13288],{"class":1348}," timezone\n",[1050,13290,13291,13293,13295,13297,13300,13302,13305,13307],{"class":1052,"line":1248},[1050,13292,1345],{"class":1344},[1050,13294,1349],{"class":1348},[1050,13296,1352],{"class":1067},[1050,13298,13299],{"class":1348},"contrib",[1050,13301,1352],{"class":1067},[1050,13303,13304],{"class":1348},"auth ",[1050,13306,1368],{"class":1344},[1050,13308,13309],{"class":1348}," logout\n",[1050,13311,13312,13314,13316,13318,13320,13322],{"class":1052,"line":1262},[1050,13313,1345],{"class":1344},[1050,13315,1349],{"class":1348},[1050,13317,1352],{"class":1067},[1050,13319,6984],{"class":1348},[1050,13321,1368],{"class":1344},[1050,13323,6993],{"class":1348},[1050,13325,13326],{"class":1052,"line":1280},[1050,13327,1177],{"emptyLinePlaceholder":1176},[1050,13329,13330,13332,13335],{"class":1052,"line":1285},[1050,13331,1738],{"class":1457},[1050,13333,13334],{"class":1741}," SessionSecurityMiddleware",[1050,13336,1514],{"class":1067},[1050,13338,13339,13341,13344],{"class":1052,"line":1291},[1050,13340,1478],{"class":1477},[1050,13342,13343],{"class":1481},"Enhanced session security middleware",[1050,13345,1485],{"class":1477},[1050,13347,13348],{"class":1052,"line":1301},[1050,13349,1626],{"class":1348},[1050,13351,13352,13354,13356,13358,13360,13362,13364],{"class":1052,"line":1313},[1050,13353,1771],{"class":1457},[1050,13355,2431],{"class":2430},[1050,13357,1464],{"class":1067},[1050,13359,1780],{"class":1779},[1050,13361,1125],{"class":1067},[1050,13363,9685],{"class":1467},[1050,13365,1471],{"class":1067},[1050,13367,13368,13370,13372,13374,13376],{"class":1052,"line":1325},[1050,13369,2467],{"class":1063},[1050,13371,1352],{"class":1067},[1050,13373,9696],{"class":1499},[1050,13375,1068],{"class":1067},[1050,13377,9701],{"class":1348},[1050,13379,13380],{"class":1052,"line":1330},[1050,13381,1626],{"class":1348},[1050,13383,13384,13386,13388,13390,13392,13394,13396],{"class":1052,"line":1335},[1050,13385,1771],{"class":1457},[1050,13387,9712],{"class":2430},[1050,13389,1464],{"class":1067},[1050,13391,1780],{"class":1779},[1050,13393,1125],{"class":1067},[1050,13395,1494],{"class":1467},[1050,13397,1471],{"class":1067},[1050,13399,13400],{"class":1052,"line":1341},[1050,13401,13402],{"class":1056},"        # Check session security\n",[1050,13404,13405,13407,13409,13411,13413,13415,13417],{"class":1052,"line":1379},[1050,13406,1545],{"class":1344},[1050,13408,1494],{"class":1348},[1050,13410,1352],{"class":1067},[1050,13412,6919],{"class":1499},[1050,13414,1352],{"class":1067},[1050,13416,6924],{"class":1499},[1050,13418,1514],{"class":1067},[1050,13420,13421,13423,13425,13428,13430,13432],{"class":1052,"line":1401},[1050,13422,1896],{"class":1063},[1050,13424,1352],{"class":1067},[1050,13426,13427],{"class":1526},"validate_session_security",[1050,13429,1464],{"class":1067},[1050,13431,1468],{"class":1526},[1050,13433,1539],{"class":1067},[1050,13435,13436],{"class":1052,"line":1422},[1050,13437,2508],{"class":1348},[1050,13439,13440,13443,13445,13447,13449,13451,13453,13455],{"class":1052,"line":1439},[1050,13441,13442],{"class":1348},"        response ",[1050,13444,1523],{"class":1067},[1050,13446,2587],{"class":1063},[1050,13448,1352],{"class":1067},[1050,13450,9696],{"class":1526},[1050,13452,1464],{"class":1067},[1050,13454,1468],{"class":1526},[1050,13456,1539],{"class":1067},[1050,13458,13459],{"class":1052,"line":1444},[1050,13460,2508],{"class":1348},[1050,13462,13463],{"class":1052,"line":1454},[1050,13464,13465],{"class":1056},"        # Update session security info\n",[1050,13467,13468,13470,13472,13474,13476,13478,13480],{"class":1052,"line":1474},[1050,13469,1545],{"class":1344},[1050,13471,1494],{"class":1348},[1050,13473,1352],{"class":1067},[1050,13475,6919],{"class":1499},[1050,13477,1352],{"class":1067},[1050,13479,6924],{"class":1499},[1050,13481,1514],{"class":1067},[1050,13483,13484,13486,13488,13491,13493,13495],{"class":1052,"line":1488},[1050,13485,1896],{"class":1063},[1050,13487,1352],{"class":1067},[1050,13489,13490],{"class":1526},"update_session_info",[1050,13492,1464],{"class":1067},[1050,13494,1468],{"class":1526},[1050,13496,1539],{"class":1067},[1050,13498,13499],{"class":1052,"line":1517},[1050,13500,2508],{"class":1348},[1050,13502,13503,13505],{"class":1052,"line":1542},[1050,13504,1803],{"class":1344},[1050,13506,6718],{"class":1348},[1050,13508,13509],{"class":1052,"line":1559},[1050,13510,1626],{"class":1348},[1050,13512,13513,13515,13518,13520,13522,13524,13526],{"class":1052,"line":1565},[1050,13514,1771],{"class":1457},[1050,13516,13517],{"class":1450}," validate_session_security",[1050,13519,1464],{"class":1067},[1050,13521,1780],{"class":1779},[1050,13523,1125],{"class":1067},[1050,13525,1494],{"class":1467},[1050,13527,1471],{"class":1067},[1050,13529,13530,13532,13535],{"class":1052,"line":1583},[1050,13531,2572],{"class":1477},[1050,13533,13534],{"class":1481},"Validate session security",[1050,13536,1485],{"class":1477},[1050,13538,13539,13542,13544,13546,13548],{"class":1052,"line":1603},[1050,13540,13541],{"class":1348},"        session ",[1050,13543,1523],{"class":1067},[1050,13545,1494],{"class":1348},[1050,13547,1352],{"class":1067},[1050,13549,13550],{"class":1499},"session\n",[1050,13552,13553],{"class":1052,"line":1611},[1050,13554,2508],{"class":1348},[1050,13556,13557],{"class":1052,"line":1623},[1050,13558,13559],{"class":1056},"        # Check for session hijacking\n",[1050,13561,13562,13564,13566,13568,13571,13573,13575,13577,13580],{"class":1052,"line":1629},[1050,13563,1545],{"class":1344},[1050,13565,2587],{"class":1063},[1050,13567,1352],{"class":1067},[1050,13569,13570],{"class":1526},"detect_session_hijacking",[1050,13572,1464],{"class":1067},[1050,13574,1468],{"class":1526},[1050,13576,1125],{"class":1067},[1050,13578,13579],{"class":1526}," session",[1050,13581,1471],{"class":1067},[1050,13583,13584,13587,13589,13591],{"class":1052,"line":1656},[1050,13585,13586],{"class":1526},"            logout",[1050,13588,1464],{"class":1067},[1050,13590,1468],{"class":1526},[1050,13592,1539],{"class":1067},[1050,13594,13595,13597,13599,13601,13603,13606,13608],{"class":1052,"line":1673},[1050,13596,1586],{"class":1344},[1050,13598,1589],{"class":1526},[1050,13600,1464],{"class":1067},[1050,13602,1085],{"class":1077},[1050,13604,13605],{"class":1081},"login",[1050,13607,1085],{"class":1077},[1050,13609,1539],{"class":1067},[1050,13611,13612],{"class":1052,"line":1694},[1050,13613,2508],{"class":1348},[1050,13615,13616],{"class":1052,"line":1700},[1050,13617,13618],{"class":1056},"        # Check session timeout\n",[1050,13620,13621,13623,13625,13627,13630,13632,13635],{"class":1052,"line":1705},[1050,13622,1545],{"class":1344},[1050,13624,2587],{"class":1063},[1050,13626,1352],{"class":1067},[1050,13628,13629],{"class":1526},"is_session_expired",[1050,13631,1464],{"class":1067},[1050,13633,13634],{"class":1526},"session",[1050,13636,1471],{"class":1067},[1050,13638,13639,13641,13643,13645],{"class":1052,"line":1735},[1050,13640,13586],{"class":1526},[1050,13642,1464],{"class":1067},[1050,13644,1468],{"class":1526},[1050,13646,1539],{"class":1067},[1050,13648,13649,13651,13653,13655,13657,13659,13661],{"class":1052,"line":1753},[1050,13650,1586],{"class":1344},[1050,13652,1589],{"class":1526},[1050,13654,1464],{"class":1067},[1050,13656,1085],{"class":1077},[1050,13658,13605],{"class":1081},[1050,13660,1085],{"class":1077},[1050,13662,1539],{"class":1067},[1050,13664,13665],{"class":1052,"line":1763},[1050,13666,1626],{"class":1348},[1050,13668,13669,13671,13674,13676,13678,13680,13682,13684,13686],{"class":1052,"line":1768},[1050,13670,1771],{"class":1457},[1050,13672,13673],{"class":1450}," detect_session_hijacking",[1050,13675,1464],{"class":1067},[1050,13677,1780],{"class":1779},[1050,13679,1125],{"class":1067},[1050,13681,1494],{"class":1467},[1050,13683,1125],{"class":1067},[1050,13685,13579],{"class":1467},[1050,13687,1471],{"class":1067},[1050,13689,13690,13692,13695],{"class":1052,"line":1789},[1050,13691,2572],{"class":1477},[1050,13693,13694],{"class":1481},"Detect potential session hijacking",[1050,13696,1485],{"class":1477},[1050,13698,13699,13702,13704,13706,13708,13710],{"class":1052,"line":1800},[1050,13700,13701],{"class":1348},"        current_ip ",[1050,13703,1523],{"class":1067},[1050,13705,6532],{"class":1526},[1050,13707,1464],{"class":1067},[1050,13709,1468],{"class":1526},[1050,13711,1539],{"class":1067},[1050,13713,13714,13717,13719,13721,13723,13725,13727,13729,13731,13733,13735,13737,13739,13741],{"class":1052,"line":1838},[1050,13715,13716],{"class":1348},"        current_user_agent ",[1050,13718,1523],{"class":1067},[1050,13720,1494],{"class":1348},[1050,13722,1352],{"class":1067},[1050,13724,2790],{"class":1536},[1050,13726,1352],{"class":1067},[1050,13728,2596],{"class":1526},[1050,13730,1464],{"class":1067},[1050,13732,1085],{"class":1077},[1050,13734,9264],{"class":1081},[1050,13736,1085],{"class":1077},[1050,13738,1125],{"class":1067},[1050,13740,2808],{"class":1077},[1050,13742,1539],{"class":1067},[1050,13744,13745],{"class":1052,"line":1843},[1050,13746,2508],{"class":1348},[1050,13748,13749],{"class":1052,"line":1861},[1050,13750,13751],{"class":1056},"        # Check IP address consistency\n",[1050,13753,13754,13757,13759,13761,13763,13765,13767,13769,13772,13774],{"class":1052,"line":1880},[1050,13755,13756],{"class":1348},"        session_ip ",[1050,13758,1523],{"class":1067},[1050,13760,13579],{"class":1348},[1050,13762,1352],{"class":1067},[1050,13764,2596],{"class":1526},[1050,13766,1464],{"class":1067},[1050,13768,1085],{"class":1077},[1050,13770,13771],{"class":1081},"security_ip",[1050,13773,1085],{"class":1077},[1050,13775,1539],{"class":1067},[1050,13777,13778,13780,13783,13786,13788,13790,13793],{"class":1052,"line":1893},[1050,13779,1545],{"class":1344},[1050,13781,13782],{"class":1348}," session_ip ",[1050,13784,13785],{"class":1503},"and",[1050,13787,13782],{"class":1348},[1050,13789,2652],{"class":1503},[1050,13791,13792],{"class":1348}," current_ip",[1050,13794,1514],{"class":1067},[1050,13796,13797,13799],{"class":1052,"line":1910},[1050,13798,1586],{"class":1344},[1050,13800,10734],{"class":1194},[1050,13802,13803],{"class":1052,"line":1933},[1050,13804,2508],{"class":1348},[1050,13806,13807],{"class":1052,"line":1970},[1050,13808,13809],{"class":1056},"        # Check User-Agent consistency\n",[1050,13811,13812,13815,13817,13819,13821,13823,13825,13827,13830,13832],{"class":1052,"line":1975},[1050,13813,13814],{"class":1348},"        session_user_agent ",[1050,13816,1523],{"class":1067},[1050,13818,13579],{"class":1348},[1050,13820,1352],{"class":1067},[1050,13822,2596],{"class":1526},[1050,13824,1464],{"class":1067},[1050,13826,1085],{"class":1077},[1050,13828,13829],{"class":1081},"security_user_agent",[1050,13831,1085],{"class":1077},[1050,13833,1539],{"class":1067},[1050,13835,13836,13838,13841,13843,13845,13847,13850],{"class":1052,"line":1981},[1050,13837,1545],{"class":1344},[1050,13839,13840],{"class":1348}," session_user_agent ",[1050,13842,13785],{"class":1503},[1050,13844,13840],{"class":1348},[1050,13846,2652],{"class":1503},[1050,13848,13849],{"class":1348}," current_user_agent",[1050,13851,1514],{"class":1067},[1050,13853,13854,13856],{"class":1052,"line":1995},[1050,13855,1586],{"class":1344},[1050,13857,10734],{"class":1194},[1050,13859,13860],{"class":1052,"line":2005},[1050,13861,2508],{"class":1348},[1050,13863,13864,13866],{"class":1052,"line":2031},[1050,13865,1803],{"class":1344},[1050,13867,13868],{"class":1194}," False\n",[1050,13870,13871],{"class":1052,"line":2036},[1050,13872,1626],{"class":1348},[1050,13874,13875,13877,13880,13882,13884,13886,13888],{"class":1052,"line":2042},[1050,13876,1771],{"class":1457},[1050,13878,13879],{"class":1450}," is_session_expired",[1050,13881,1464],{"class":1067},[1050,13883,1780],{"class":1779},[1050,13885,1125],{"class":1067},[1050,13887,13579],{"class":1467},[1050,13889,1471],{"class":1067},[1050,13891,13892,13894,13897],{"class":1052,"line":2047},[1050,13893,2572],{"class":1477},[1050,13895,13896],{"class":1481},"Check if session has expired",[1050,13898,1485],{"class":1477},[1050,13900,13901,13904,13906,13908,13910,13912,13914,13916,13919,13921],{"class":1052,"line":2053},[1050,13902,13903],{"class":1348},"        last_activity ",[1050,13905,1523],{"class":1067},[1050,13907,13579],{"class":1348},[1050,13909,1352],{"class":1067},[1050,13911,2596],{"class":1526},[1050,13913,1464],{"class":1067},[1050,13915,1085],{"class":1077},[1050,13917,13918],{"class":1081},"last_activity",[1050,13920,1085],{"class":1077},[1050,13922,1539],{"class":1067},[1050,13924,13925,13927,13929,13932],{"class":1052,"line":2059},[1050,13926,1545],{"class":1344},[1050,13928,3881],{"class":1503},[1050,13930,13931],{"class":1348}," last_activity",[1050,13933,1514],{"class":1067},[1050,13935,13936,13938],{"class":1052,"line":2065},[1050,13937,1586],{"class":1344},[1050,13939,13868],{"class":1194},[1050,13941,13942],{"class":1052,"line":2071},[1050,13943,2508],{"class":1348},[1050,13945,13946],{"class":1052,"line":2077},[1050,13947,13948],{"class":1056},"        # Convert string back to datetime\n",[1050,13950,13951,13954,13957,13959],{"class":1052,"line":2083},[1050,13952,13953],{"class":1344},"        from",[1050,13955,13956],{"class":1348}," datetime ",[1050,13958,1368],{"class":1344},[1050,13960,13961],{"class":1348}," datetime\n",[1050,13963,13964,13966,13968,13971,13973,13976,13978,13980],{"class":1052,"line":2089},[1050,13965,13903],{"class":1348},[1050,13967,1523],{"class":1067},[1050,13969,13970],{"class":1348}," datetime",[1050,13972,1352],{"class":1067},[1050,13974,13975],{"class":1526},"fromisoformat",[1050,13977,1464],{"class":1067},[1050,13979,13918],{"class":1526},[1050,13981,1539],{"class":1067},[1050,13983,13984],{"class":1052,"line":2095},[1050,13985,2508],{"class":1348},[1050,13987,13988],{"class":1052,"line":2101},[1050,13989,13990],{"class":1056},"        # Check if session has been inactive too long\n",[1050,13992,13993,13996,13998,14001,14003,14005,14007,14009],{"class":1052,"line":2107},[1050,13994,13995],{"class":1348},"        inactive_time ",[1050,13997,1523],{"class":1067},[1050,13999,14000],{"class":1348}," timezone",[1050,14002,1352],{"class":1067},[1050,14004,6176],{"class":1526},[1050,14006,3098],{"class":1067},[1050,14008,6131],{"class":1503},[1050,14010,14011],{"class":1348}," last_activity\n",[1050,14013,14014,14017,14019,14021,14023,14026,14028,14031,14033,14036,14038],{"class":1052,"line":2113},[1050,14015,14016],{"class":1348},"        max_inactive_time ",[1050,14018,1523],{"class":1067},[1050,14020,14000],{"class":1348},[1050,14022,1352],{"class":1067},[1050,14024,14025],{"class":1526},"timedelta",[1050,14027,1464],{"class":1067},[1050,14029,14030],{"class":1720},"minutes",[1050,14032,1523],{"class":1067},[1050,14034,14035],{"class":1241},"30",[1050,14037,2846],{"class":1067},[1050,14039,14040],{"class":1056},"  # 30 minutes\n",[1050,14042,14043],{"class":1052,"line":2118},[1050,14044,2508],{"class":1348},[1050,14046,14047,14049,14052,14054],{"class":1052,"line":2124},[1050,14048,1803],{"class":1344},[1050,14050,14051],{"class":1348}," inactive_time ",[1050,14053,5492],{"class":1503},[1050,14055,14056],{"class":1348}," max_inactive_time\n",[1050,14058,14059],{"class":1052,"line":2130},[1050,14060,1626],{"class":1348},[1050,14062,14063,14065,14068,14070,14072,14074,14076],{"class":1052,"line":2136},[1050,14064,1771],{"class":1457},[1050,14066,14067],{"class":1450}," update_session_info",[1050,14069,1464],{"class":1067},[1050,14071,1780],{"class":1779},[1050,14073,1125],{"class":1067},[1050,14075,1494],{"class":1467},[1050,14077,1471],{"class":1067},[1050,14079,14080,14082,14085],{"class":1052,"line":2141},[1050,14081,2572],{"class":1477},[1050,14083,14084],{"class":1481},"Update session security information",[1050,14086,1485],{"class":1477},[1050,14088,14089,14091,14093,14095,14097],{"class":1052,"line":2147},[1050,14090,13541],{"class":1348},[1050,14092,1523],{"class":1067},[1050,14094,1494],{"class":1348},[1050,14096,1352],{"class":1067},[1050,14098,13550],{"class":1499},[1050,14100,14101],{"class":1052,"line":2153},[1050,14102,2508],{"class":1348},[1050,14104,14105],{"class":1052,"line":2159},[1050,14106,14107],{"class":1056},"        # Store security information\n",[1050,14109,14110,14113,14115,14117,14119,14121,14123,14125,14127,14129,14131],{"class":1052,"line":2165},[1050,14111,14112],{"class":1348},"        session",[1050,14114,2528],{"class":1067},[1050,14116,1085],{"class":1077},[1050,14118,13771],{"class":1081},[1050,14120,1085],{"class":1077},[1050,14122,3853],{"class":1067},[1050,14124,1068],{"class":1067},[1050,14126,6532],{"class":1526},[1050,14128,1464],{"class":1067},[1050,14130,1468],{"class":1526},[1050,14132,1539],{"class":1067},[1050,14134,14135,14137,14139,14141,14143,14145,14147,14149,14151,14153,14155,14157,14159,14161,14163,14165,14167,14169,14171],{"class":1052,"line":2171},[1050,14136,14112],{"class":1348},[1050,14138,2528],{"class":1067},[1050,14140,1085],{"class":1077},[1050,14142,13829],{"class":1081},[1050,14144,1085],{"class":1077},[1050,14146,3853],{"class":1067},[1050,14148,1068],{"class":1067},[1050,14150,1494],{"class":1348},[1050,14152,1352],{"class":1067},[1050,14154,2790],{"class":1536},[1050,14156,1352],{"class":1067},[1050,14158,2596],{"class":1526},[1050,14160,1464],{"class":1067},[1050,14162,1085],{"class":1077},[1050,14164,9264],{"class":1081},[1050,14166,1085],{"class":1077},[1050,14168,1125],{"class":1067},[1050,14170,2808],{"class":1077},[1050,14172,1539],{"class":1067},[1050,14174,14175,14177,14179,14181,14183,14185,14187,14189,14191,14193,14195,14197,14200],{"class":1052,"line":2177},[1050,14176,14112],{"class":1348},[1050,14178,2528],{"class":1067},[1050,14180,1085],{"class":1077},[1050,14182,13918],{"class":1081},[1050,14184,1085],{"class":1077},[1050,14186,3853],{"class":1067},[1050,14188,1068],{"class":1067},[1050,14190,14000],{"class":1348},[1050,14192,1352],{"class":1067},[1050,14194,6176],{"class":1526},[1050,14196,2485],{"class":1067},[1050,14198,14199],{"class":1526},"isoformat",[1050,14201,1620],{"class":1067},[1050,14203,14204],{"class":1052,"line":2183},[1050,14205,2508],{"class":1348},[1050,14207,14208],{"class":1052,"line":2189},[1050,14209,14210],{"class":1056},"        # Regenerate session key periodically\n",[1050,14212,14213,14216,14218,14220,14222,14224,14226,14228,14231,14233],{"class":1052,"line":2195},[1050,14214,14215],{"class":1348},"        last_regeneration ",[1050,14217,1523],{"class":1067},[1050,14219,13579],{"class":1348},[1050,14221,1352],{"class":1067},[1050,14223,2596],{"class":1526},[1050,14225,1464],{"class":1067},[1050,14227,1085],{"class":1077},[1050,14229,14230],{"class":1081},"last_key_regeneration",[1050,14232,1085],{"class":1077},[1050,14234,1539],{"class":1067},[1050,14236,14237,14239,14241,14244],{"class":1052,"line":2200},[1050,14238,1545],{"class":1344},[1050,14240,3881],{"class":1503},[1050,14242,14243],{"class":1348}," last_regeneration",[1050,14245,1514],{"class":1067},[1050,14247,14248,14251,14253,14256],{"class":1052,"line":2205},[1050,14249,14250],{"class":1348},"            session",[1050,14252,1352],{"class":1067},[1050,14254,14255],{"class":1526},"cycle_key",[1050,14257,1620],{"class":1067},[1050,14259,14260,14262,14264,14266,14268,14270,14272,14274,14276,14278,14280,14282,14284],{"class":1052,"line":2211},[1050,14261,14250],{"class":1348},[1050,14263,2528],{"class":1067},[1050,14265,1085],{"class":1077},[1050,14267,14230],{"class":1081},[1050,14269,1085],{"class":1077},[1050,14271,3853],{"class":1067},[1050,14273,1068],{"class":1067},[1050,14275,14000],{"class":1348},[1050,14277,1352],{"class":1067},[1050,14279,6176],{"class":1526},[1050,14281,2485],{"class":1067},[1050,14283,14199],{"class":1526},[1050,14285,1620],{"class":1067},[1050,14287,14288,14291],{"class":1052,"line":2217},[1050,14289,14290],{"class":1344},"        else",[1050,14292,1514],{"class":1067},[1050,14294,14295,14298,14300,14302,14304,14306,14308,14311],{"class":1052,"line":2223},[1050,14296,14297],{"class":1348},"            last_regen ",[1050,14299,1523],{"class":1067},[1050,14301,13970],{"class":1348},[1050,14303,1352],{"class":1067},[1050,14305,13975],{"class":1526},[1050,14307,1464],{"class":1067},[1050,14309,14310],{"class":1526},"last_regeneration",[1050,14312,1539],{"class":1067},[1050,14314,14315,14317,14319,14321,14323,14325,14327,14330,14332,14334,14336,14338,14340,14343,14345,14347],{"class":1052,"line":2229},[1050,14316,2646],{"class":1344},[1050,14318,14000],{"class":1348},[1050,14320,1352],{"class":1067},[1050,14322,6176],{"class":1526},[1050,14324,3098],{"class":1067},[1050,14326,6131],{"class":1503},[1050,14328,14329],{"class":1348}," last_regen ",[1050,14331,5492],{"class":1503},[1050,14333,14000],{"class":1348},[1050,14335,1352],{"class":1067},[1050,14337,14025],{"class":1526},[1050,14339,1464],{"class":1067},[1050,14341,14342],{"class":1720},"hours",[1050,14344,1523],{"class":1067},[1050,14346,9078],{"class":1241},[1050,14348,1471],{"class":1067},[1050,14350,14351,14354,14356,14358],{"class":1052,"line":2235},[1050,14352,14353],{"class":1348},"                session",[1050,14355,1352],{"class":1067},[1050,14357,14255],{"class":1526},[1050,14359,1620],{"class":1067},[1050,14361,14362,14364,14366,14368,14370,14372,14374,14376,14378,14380,14382,14384,14386],{"class":1052,"line":2241},[1050,14363,14353],{"class":1348},[1050,14365,2528],{"class":1067},[1050,14367,1085],{"class":1077},[1050,14369,14230],{"class":1081},[1050,14371,1085],{"class":1077},[1050,14373,3853],{"class":1067},[1050,14375,1068],{"class":1067},[1050,14377,14000],{"class":1348},[1050,14379,1352],{"class":1067},[1050,14381,6176],{"class":1526},[1050,14383,2485],{"class":1067},[1050,14385,14199],{"class":1526},[1050,14387,1620],{"class":1067},[1026,14389,14390],{},"Form security requires a multi-layered approach combining CSRF protection, input validation, rate limiting, bot detection, secure file uploads, and session management. By implementing these comprehensive security measures, you can protect your applications from common attacks while maintaining usability and performance. Regular security audits and staying updated with the latest security practices are essential for maintaining robust form security.",[7965,14392,14393],{},"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 .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}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 .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}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 .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 .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 .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 .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}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 .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);}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sETVe, html code.shiki .sETVe{--shiki-light:#39ADB5;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sRJPX, html code.shiki .sRJPX{--shiki-light:#91B859;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sk0MF, html code.shiki .sk0MF{--shiki-light:#90A4AE;--shiki-default:#BDA437;--shiki-dark:#E6CC77}html pre.shiki code .sGuSu, html code.shiki .sGuSu{--shiki-light:#39ADB5;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .s27EL, html code.shiki .s27EL{--shiki-light:#91B859;--shiki-default:#AB5E3F;--shiki-dark:#C4704F}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}",{"title":1045,"searchDepth":1053,"depth":1060,"links":14395},[14396,14400,14403,14407,14410],{"id":1032,"depth":1060,"text":1033,"children":14397},[14398,14399],{"id":1037,"depth":1074,"text":1038},{"id":2279,"depth":1074,"text":2280},{"id":2979,"depth":1060,"text":2980,"children":14401},[14402],{"id":2983,"depth":1074,"text":2984},{"id":5663,"depth":1060,"text":5664,"children":14404},[14405,14406],{"id":5667,"depth":1074,"text":5668},{"id":7772,"depth":1074,"text":7773},{"id":9993,"depth":1060,"text":9994,"children":14408},[14409],{"id":9997,"depth":1074,"text":9998},{"id":13133,"depth":1060,"text":459,"children":14411},[14412],{"id":13136,"depth":1074,"text":13137},"md",null,{},{"title":250,"description":1028},"ZVurEVswDamKNCXp77qsfYidGXUh8itkJWLIC2h6y2E",[14419,14421],{"title":246,"path":247,"stem":248,"description":14420,"children":-1},"Django's form system supports sophisticated patterns for complex user interfaces, including multi-step forms, dynamic field generation, AJAX integration, and custom validation workflows. This chapter covers advanced techniques for building professional-grade form experiences.",{"title":254,"path":255,"stem":256,"description":14422,"children":-1},"Django's Object-Relational Mapping (ORM) system provides a powerful abstraction layer between your Python code and the database. This chapter covers everything from basic model definition to advanced database operations, query optimization, and working with multiple databases.",1772474915996]