Skip to content

Commit c0ff7c7

Browse files
committed
Csrf class
1 parent 999e674 commit c0ff7c7

File tree

1 file changed

+157
-0
lines changed

1 file changed

+157
-0
lines changed

src/csrf.php

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
<?php
2+
3+
/**
4+
* Class csrf
5+
*
6+
* @author Baha Şener
7+
* @mail baha.sener@hotmail.com
8+
* @date 8 December 2022
9+
*/
10+
11+
class Csrf{
12+
13+
public $config;
14+
15+
public function __construct($config){
16+
17+
$this->config = $config;
18+
19+
if(!in_array('openssl', get_loaded_extensions())){
20+
$this->showError('OpenSSL extension must be installed in PHP.');
21+
die();
22+
}
23+
24+
if(!isset($this->config['key']) || empty($this->config['key'])){
25+
$this->showError('You must specify a key value with the configuration.');
26+
die();
27+
}
28+
29+
if(!isset($this->config['secret']) || empty($this->config['secret'])){
30+
$this->showError('You must specify a secret value with the configuration.');
31+
die();
32+
}
33+
34+
if(empty($_SESSION['_csrf'])){
35+
$_SESSION['_csrf'] = $this->EncryptToken(bin2hex(random_bytes(32)));
36+
}
37+
38+
}
39+
40+
private function EncryptToken($data){
41+
42+
if(isset($data)){
43+
44+
$key = hash('sha256', $this->config['key']);
45+
$iv = substr(hash('sha256', $this->config['secret']), 0, 16);
46+
$encrypt = openssl_encrypt($data, 'AES-128-CBC', $key, 0, $iv);
47+
return $encrypt;
48+
49+
}
50+
51+
}
52+
53+
public function Get(){
54+
return $_SESSION['_csrf'];
55+
}
56+
57+
public function Check($token){
58+
59+
$userToken = $this->EncryptToken($token);
60+
$systemToken = $this->EncryptToken($_SESSION['_csrf']);
61+
62+
if(hash_equals($userToken, $systemToken)){
63+
unset($_SESSION['_csrf']);
64+
return true;
65+
}else{
66+
return false;
67+
}
68+
69+
}
70+
71+
public function Reset(){
72+
73+
if(isset($_SESSION['_csrf'])){
74+
75+
unset($_SESSION['_csrf']);
76+
77+
if(!isset($_SESSION['_csrf'])){
78+
79+
$_SESSION['_csrf'] = $this->EncryptToken(bin2hex(random_bytes(32)));
80+
if(isset($_SESSION['_csrf'])){
81+
return true;
82+
}else{
83+
return false;
84+
}
85+
86+
}
87+
88+
}else{
89+
90+
if(empty($_SESSION['_csrf'])){
91+
92+
$_SESSION['_csrf'] = $this->EncryptToken(bin2hex(random_bytes(32)));
93+
if(isset($_SESSION['_csrf'])){
94+
return true;
95+
}else{
96+
return false;
97+
}
98+
99+
}else{
100+
return false;
101+
}
102+
103+
}
104+
105+
}
106+
107+
private function DecryptToken($data){
108+
109+
if(isset($data)){
110+
111+
$key = hash('sha256', $this->config['key']);
112+
$iv = substr(hash('sha256', $this->config['secret']), 0, 16);
113+
return openssl_decrypt($data, 'AES-128-CBC', $key, 0, $iv);
114+
115+
}
116+
117+
}
118+
119+
private function showError($error){
120+
$this->errorTemplate($error);
121+
}
122+
123+
private function errorTemplate($errorMsg, $title = null)
124+
{
125+
?>
126+
<div class="php-encryption-error-msg-content">
127+
<div class="php-encryption-error-title">
128+
<?= $title ? $title : __CLASS__ . ' Error:' ?>
129+
</div>
130+
<div class="php-encryption-error-msg"><?= $errorMsg ?></div>
131+
</div>
132+
<style>
133+
.php-encryption-error-msg-content {
134+
padding: 15px;
135+
border-left: 5px solid #c00000;
136+
background: rgba(192, 0, 0, 0.06);
137+
background: #f8f8f8;
138+
margin-bottom: 10px;
139+
}
140+
141+
.php-encryption-error-title {
142+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
143+
font-size: 16px;
144+
font-weight: 500;
145+
}
146+
147+
.php-encryption-error-msg {
148+
margin-top: 15px;
149+
font-size: 14px;
150+
font-family: Consolas, Monaco, Menlo, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, sans-serif;
151+
color: #c00000;
152+
}
153+
</style>
154+
<?php
155+
}
156+
157+
}

0 commit comments

Comments
 (0)