Skip to content

Commit 7a497ed

Browse files
committed
v1.0
0 parents  commit 7a497ed

File tree

5 files changed

+167
-0
lines changed

5 files changed

+167
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
vendor

README.md

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# PHP CSRF
2+
3+
## Kurulum
4+
```shell
5+
composer require ahmetbarut\csrf
6+
```
7+
8+
### Basit Kullanım
9+
`vendor/autoload.php` dosyasını dahil ettikten sonra `Csrf` sınıfını üretin. Sınıfı `new` anahtar kelimesiyle çağırdığınızda token üretecektir. Tokeni kullanmak için:
10+
```php
11+
use ahmetbarut\Csrf\Csrf;
12+
13+
require __DIR__ . "/vendor/autoload.php";
14+
15+
// Sınıfı ürettiğinizde token oluşturur. Herhangi bir istek yoksa üretilir, istek varsa token üretmez.
16+
$csrf = new Csrf;
17+
18+
// Üretilen token değerini getirir.
19+
$csrf->getToken();
20+
```
21+
### HTML İçinde Kullanım Ve Kontrol
22+
Burda kolay kullanım açısından form içinde helper fonksiyonları kullanılıyor. İki yöntemi de kullanabilirsiniz.
23+
24+
## ! Not :
25+
`hasToken` yöntemine gelen verileri olduğu gibi veriniz arkaplanda, `input[name=_token]` olarak bakacaktır.
26+
```php
27+
<?php
28+
use ahmetbarut\Csrf\Csrf;
29+
30+
require __DIR__ . "/vendor/autoload.php";
31+
32+
$csrf = new Csrf;
33+
if($_POST){
34+
$csrf->tokenHas($_POST); // bool
35+
}
36+
?>
37+
38+
<form method="POST">
39+
<?=csrf_field()?>
40+
<input type="text" name="test">
41+
<button>Gönder</button>
42+
</form>
43+
```
44+
45+
| Method | Hakkında |
46+
| :--- | :----:
47+
| __construct | Nesne üretildiğinde beraberinde `session`'u başlatır ve token oluşturur. |
48+
| tokenHas | Verilen tokeni, oluşturulan token ile karşılaştırır. |
49+
| getToken | Oluşturulan son tokeni döndürür.
50+
| csrf_field | İnput oluşturur ve token verir. Helper fonksiyonudur.
51+
| create_token | Yeni token oluşturur.

composer.json

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"name": "ahmetbarut/csrf",
3+
"autoload": {
4+
"psr-4": {
5+
"ahmetbarut\\Csrf\\": "src/"
6+
},
7+
"files": [
8+
"./src/helper.php"
9+
]
10+
},
11+
"authors": [
12+
{
13+
"name": "Ahmet Barut",
14+
"email": "[email protected]"
15+
}
16+
],
17+
"require": {}
18+
}

src/Csrf.php

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
namespace ahmetbarut\Csrf;
4+
5+
class Csrf
6+
{
7+
/**
8+
* Tokeni tutar
9+
* @var string
10+
*/
11+
protected string $token;
12+
13+
public function __construct()
14+
{
15+
if (session_status() === PHP_SESSION_NONE) {
16+
session_start();
17+
}
18+
19+
if (empty($_REQUEST)) {
20+
$this->generateToken();
21+
}
22+
}
23+
24+
/**
25+
* Yeni bir token oluşturur
26+
*/
27+
public function generateToken()
28+
{
29+
$this->token = $_SESSION["_token"] = md5(time() . rand(0, 9999));
30+
}
31+
32+
/**
33+
* tokenin varlığını kontrol eder.
34+
* @param array|object $post
35+
* @return bool
36+
*/
37+
public function tokenHas(array | object $post): bool
38+
{
39+
if (is_array($post)) {
40+
$post = (object) $post;
41+
}
42+
if (isset($post->_token)) {
43+
if ($post) {
44+
if ($post->_token === $this->getToken()) {
45+
return true;
46+
}
47+
return false;
48+
}
49+
}
50+
return false;
51+
}
52+
53+
/**
54+
* Oluşturulan Tokeni getirir.
55+
* @return string
56+
*/
57+
public function getToken(): string
58+
{
59+
return $_SESSION['_token'];
60+
}
61+
62+
/**
63+
* Hata durumunda dönecek hata kodu ve mesajı
64+
* @param int $code
65+
* @param string $message
66+
*/
67+
public function error($code = 419, $message = "Page Expired")
68+
{
69+
return header("HTTP/1.1 {$code} {$message}");
70+
}
71+
}

src/helper.php

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
use ahmetbarut\Csrf\Csrf;
4+
5+
/**
6+
* Yeni Tokeni Döndürür
7+
*
8+
* @return void
9+
*/
10+
function create_token()
11+
{
12+
return (new Csrf)->getToken();
13+
}
14+
15+
/**
16+
* Token için input oluşturur
17+
*
18+
* @return void
19+
*/
20+
function csrf_field()
21+
{
22+
$token = create_token();
23+
echo <<<csrf
24+
<input type="hidden" name="_token" value="{$token}">
25+
csrf;
26+
}

0 commit comments

Comments
 (0)