Skip to content
This repository was archived by the owner on Nov 20, 2024. It is now read-only.

Commit 8325312

Browse files
committed
first commit
0 parents  commit 8325312

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+6974
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/vendor

.htaccess

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
RewriteEngine On
2+
ServerSignature Off
3+
RewriteBase /
4+
RewriteCond %{REQUEST_FILENAME} !-d
5+
RewriteCond %{REQUEST_FILENAME} !-f
6+
RewriteRule ^(.+)$ ./index.php [QSA,L]
7+
Options All -Indexes
8+
ErrorDocument 400 /view/err/400.php
9+
ErrorDocument 401 /view/err/401.php
10+
ErrorDocument 403 /view/err/403.php
11+
ErrorDocument 404 /view/err/404.php
12+
ErrorDocument 408 /view/err/408.php
13+
ErrorDocument 414 /view/err/414.php
14+
ErrorDocument 429 /view/err/429.php
15+
ErrorDocument 500 /view/err/500.php
16+
ErrorDocument 502 /view/err/502.php
17+
ErrorDocument 503 /view/err/503.php
18+
ErrorDocument 504 /view/err/504.php
19+
#RewriteCond %{HTTPS} off
20+
#RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
21+
php_value memory_limit 256M
22+
php_value post_max_size 256M
23+
php_value upload_max_filesize 64M
24+
php_value max_input_vars 1800
25+
php_value max_execution_time 300
26+
php_value max_input_time 300
27+
28+
<FilesMatch \.(phps|php2|php3|php4|php5|phtml|pl|py|jsp|asp|htm|html|shtml|sh|cgi)$>
29+
Order Deny,Allow
30+
Deny from all
31+
</FilesMatch>
32+
33+
<Files *.php>
34+
Order Deny,Allow
35+
Deny from all
36+
Allow from 127.0.0.1
37+
Allow from localhost
38+
</Files>
39+
40+
<Files *.log>
41+
Order Deny,Allow
42+
Deny from all
43+
</Files>
44+
45+
<Files index.php>
46+
Order Allow,Deny
47+
Allow from all
48+
</Files>
49+
50+
<Files dl.php>
51+
Order Allow,Deny
52+
Allow from all
53+
</Files>
54+
55+
<Files 400.php>
56+
Order Allow,Deny
57+
Allow from all
58+
</Files>
59+
60+
<Files 401.php>
61+
Order Allow,Deny
62+
Allow from all
63+
</Files>
64+
65+
<Files 403.php>
66+
Order Allow,Deny
67+
Allow from all
68+
</Files>
69+
70+
<Files 404.php>
71+
Order Allow,Deny
72+
Allow from all
73+
</Files>
74+
75+
<Files 408.php>
76+
Order Allow,Deny
77+
Allow from all
78+
</Files>
79+
80+
<Files 500.php>
81+
Order Allow,Deny
82+
Allow from all
83+
</Files>
84+
85+
<Files 502.php>
86+
Order Allow,Deny
87+
Allow from all
88+
</Files>
89+
90+
<Files 503.php>
91+
Order Allow,Deny
92+
Allow from all
93+
</Files>
94+
95+
<Files 504.php>
96+
Order Allow,Deny
97+
Allow from all
98+
</Files>
99+
100+
<IfModule mod_setenvif.c>
101+
<IfModule mod_headers.c>
102+
Header always set X-Frame-Options "DENY" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
103+
Header always set X-Content-Type-Options "nosniff"
104+
Header unset X-Powered-By
105+
Header always unset X-Powered-By
106+
<FilesMatch "\.(jpe?g|png|webp|bmp|gif|ico)$">
107+
SetEnvIf Origin ":" IS_CORS
108+
Header set Access-Control-Allow-Origin "*" env=*IS_CORS*
109+
</FilesMatch>
110+
</IfModule>
111+
</IfModule>
112+
113+
<IfModule mod_expires.c>
114+
ExpiresActive on
115+
ExpiresDefault "access plus 1 day"
116+
ExpiresByType text/html "access plus 1 day"
117+
ExpiresByType text/javascript "access plus 1 day"
118+
ExpiresByType text/css "access plus 1 day"
119+
</IfModule>
120+
121+
<IfModule mod_autoindex.c>
122+
Options -Indexes
123+
</IfModule>
124+
125+

app/controllers/Controller.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
3+
namespace App\controllers;
4+
class Controller{
5+
6+
}

app/db/.gitkeep

Whitespace-only changes.

app/helpers/.gitkeep

Whitespace-only changes.

app/middlewares/CorsMiddleware.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace App\middlewares;
4+
5+
6+
class CorsMiddleware extends Middleware
7+
{
8+
private array $allowedOrigins;
9+
private array $allowedMethods;
10+
private array $allowedHeaders;
11+
private int $maxAge;
12+
13+
public function __construct(array $allowedOrigins = ['*'], array $allowedMethods = ['GET', 'POST', 'PUT', 'DELETE'], array $allowedHeaders = ['Content-Type'], int $maxAge = 86400)
14+
{
15+
$this->allowedOrigins = $allowedOrigins;
16+
$this->allowedMethods = $allowedMethods;
17+
$this->allowedHeaders = $allowedHeaders;
18+
$this->maxAge = $maxAge;
19+
}
20+
21+
public function handle(string $request): ?string
22+
{
23+
$this->setCorsHeaders();
24+
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
25+
header('Access-Control-Max-Age: ' . $this->maxAge);
26+
header('Content-Length: 0');
27+
exit;
28+
} else {
29+
return parent::handle($request);
30+
}
31+
}
32+
33+
private function setCorsHeaders(): void
34+
{
35+
$requestOrigin = $_SERVER['HTTP_ORIGIN'] ?? '';
36+
if (in_array('*', $this->allowedOrigins) || in_array($requestOrigin, $this->allowedOrigins)) {
37+
header('Access-Control-Allow-Origin: ' . $requestOrigin);
38+
}
39+
header('Access-Control-Allow-Methods: ' . implode(', ', $this->allowedMethods));
40+
header('Access-Control-Allow-Headers: ' . implode(', ', $this->allowedHeaders));
41+
header('Access-Control-Allow-Credentials: true');
42+
}
43+
}

app/middlewares/CsrfMiddleware.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace App\middlewares;
4+
5+
use System\request\Request;
6+
use System\session\Session;
7+
8+
class CsrfMiddleware extends Middleware
9+
{
10+
protected array $excludedUrls = [];
11+
12+
public function __construct(array $excludedUrls = [])
13+
{
14+
$this->excludedUrls = $excludedUrls;
15+
}
16+
17+
public function handle(string $request): ?string
18+
{
19+
if (methodField() !== 'get') {
20+
$req = new Request();
21+
$currentUrl = $req->getUri();
22+
foreach ($this->excludedUrls as $excludedUrl) {
23+
if (str_starts_with($currentUrl, $excludedUrl)) {
24+
return parent::handle($request);
25+
}
26+
}
27+
$token = $req->input("CSRF_TOKEN") ?? '';
28+
if (!hash_equals(Session::get('CSRF_TOKEN'), $token)) {
29+
return 'Invalid CSRF token';
30+
} else {
31+
$newToken = randomToken();
32+
Session::set('CSRF_TOKEN', $newToken);
33+
}
34+
}
35+
return parent::handle($request);
36+
}
37+
}

app/middlewares/Middleware.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace App\middlewares;
4+
5+
use System\middlewares\MiddlewareInterface;
6+
7+
abstract class Middleware implements MiddlewareInterface
8+
{
9+
private $nextMiddleware;
10+
11+
public function setNext(MiddlewareInterface $middleware): MiddlewareInterface
12+
{
13+
$this->nextMiddleware = $middleware;
14+
return $middleware;
15+
}
16+
17+
public function handle(string $request): ?string
18+
{
19+
if ($this->nextMiddleware) {
20+
return $this->nextMiddleware->handle($request);
21+
}
22+
return null;
23+
}
24+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace App\middlewares;
4+
5+
class RateLimitMiddleware extends Middleware
6+
{
7+
private int $maxRequestsPerSecond;
8+
private int $second;
9+
10+
11+
public function __construct(int $maxRequestsPerSecond = 80, int $second = 60)
12+
{
13+
$this->maxRequestsPerSecond = $maxRequestsPerSecond;
14+
$this->second = $second;
15+
}
16+
17+
public function handle(string $request): ?string
18+
{
19+
$time = time();
20+
$count = $_SESSION['rateLimitCount'] ?? 0;
21+
if (isset($_SESSION['rateLimitTime']) && ($time - $this->second) > $_SESSION['rateLimitTime']) {
22+
unset($_SESSION['rateLimitTime']);
23+
unset($_SESSION['rateLimitCount']);
24+
}
25+
if ($count >= $this->maxRequestsPerSecond) {
26+
return 'Too many requests';
27+
}
28+
!isset($_SESSION['rateLimitCount']) ? $_SESSION['rateLimitCount'] = 1 : $_SESSION['rateLimitCount']++;
29+
isset($_SESSION['rateLimitTime']) ?: $_SESSION['rateLimitTime'] = $time;
30+
return parent::handle($request);
31+
}
32+
}

app/models/User.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace App\models;
4+
5+
use System\database\orm\Model;
6+
7+
class User extends Model
8+
{
9+
protected $table = 'users';
10+
protected array $fillable = ['username'];
11+
}

0 commit comments

Comments
 (0)