Plack::Middleware::CSRFBlock(3pm) | User Contributed Perl Documentation | Plack::Middleware::CSRFBlock(3pm) |
Plack::Middleware::CSRFBlock - Block CSRF Attacks with minimal changes to your app
version 0.10
use Plack::Builder; my $app = sub { ... } builder { enable 'Session'; enable 'CSRFBlock'; $app; }
This middleware blocks CSRF. You can use this middleware without any modifications to your application, in most cases. Here is the strategy:
<html> <head> <title>input form</title> </head> <body> <form action="/api" method="post"> <input type="text" name="email" /><input type="submit" /> </form> </html>
This becomes:
<html> <head> <title>input form</title> </head> <body> <form action="/api" method="post"><input type="hidden" name="SEC" value="0f15ba869f1c0d77" /> <input type="text" name="email" /><input type="submit" /> </form> </html>
This affects "form" tags with "method="post"", case insensitive.
It is possible to add an optional meta tag by setting "meta_tag" to a defined value. The 'name' attribute of the HTML tag will be set to the value of "meta_tag". For the previous example, when "meta_tag" is set to 'csrf_token', the output will be:
<html> <head><meta name="csrf_token" content="0f15ba869f1c0d77"/> <title>input form</title> </head> <body> <form action="/api" method="post"><input type="hidden" name="SEC" value="0f15ba869f1c0d77" /> <input type="text" name="email" /><input type="submit" /> </form> </html>
Supports "application/x-www-form-urlencoded" and "multipart/form-data" for input parameters, but any "POST" will be validated with the "X-CSRF-Token" header. Thus, every "POST" will have to have either the header, or the appropriate form parameters in the body.
$(document).ajaxSend(function(e, xhr, options) { var token = $("meta[name='csrftoken']").attr("content"); xhr.setRequestHeader("X-CSRF-Token", token); });
This will include the X-CSRF-Token header with any "AJAX" requests made from your javascript.
use Plack::Builder; my $app = sub { ... } builder { enable 'Session'; enable 'CSRFBlock', parameter_name => 'csrf_secret', token_length => 20, session_key => 'csrf_token', blocked => sub { [302, [Location => 'http://www.google.com'], ['']]; }, onetime => 0, ; $app; }
Note: This application can read posted data, but DO NOT use them!
This makes your applications more secure, but in many cases, is too strict.
Plack::Middleware::Session
This software is copyright (c) 2014 by the Authors of Plack-Middleware-CSRFBlock.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
2022-06-16 | perl v5.34.0 |