Last active
August 29, 2015 14:05
-
-
Save trcio/e4677a20db99cecec4fe to your computer and use it in GitHub Desktop.
An easy way to implement CSRF protection into your web forms.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?PHP | |
class Csrfer { | |
const SESSION_NAME = 'csrfer_name'; | |
const SESSION_VALUE = 'csrfer_value'; | |
const TOKEN_FORMAT = '<input type=\'hidden\' name=\'%s\' value=\'%s\'>'; | |
const TOKEN_LENGTH = 128; | |
public static function generate() { | |
$token_name = self::generate_token(); | |
$token_value = self::generate_token(); | |
$_SESSION[self::SESSION_NAME] = $token_name; | |
$_SESSION[self::SESSION_VALUE] = $token_value; | |
return sprintf(self::TOKEN_FORMAT, $token_name, $token_value); | |
} | |
public static function check() { | |
if (empty($_POST)) { return false; } | |
if (!array_key_exists(self::SESSION_NAME, $_SESSION)) { return false; } | |
if (!array_key_exists(self::SESSION_VALUE, $_SESSION)) { return false; } | |
$token_name = $_SESSION[self::SESSION_NAME]; | |
$token_value = $_SESSION[self::SESSION_VALUE]; | |
unset($_SESSION[self::SESSION_NAME]); | |
unset($_SESSION[self::SESSION_VALUE]); | |
if (!array_key_exists($token_name, $_POST)) { return false; } | |
return ($_POST[$token_name] === $token_value); | |
} | |
private static function generate_token() { | |
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; | |
$strlen = strlen($chars); | |
$output = ''; | |
for ($i = 0; $i < self::TOKEN_LENGTH; $i++) { | |
$output .= $chars[mt_rand(0, $strlen - 1)]; | |
} | |
return $output; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment