Loading...
Поиск скриптов | Нужна соц сеть.
161817535, вбей токен в сессию и выгружай где надо. Также можно сделать обновляемый токен, быть точнее уникальный на каждый запрос. Но вполне достаточно одного на сессию
php
class CSRF
{
public function get_token_id() {
if(isset($_SESSION['token_id'])) {
return $_SESSION['token_id'];
} else {
$token_id = $this->random(10);
$_SESSION['token_id'] = $token_id;
return $token_id;
}
}

public function get_token() {
if(isset($_SESSION['token_value'])) {
return $_SESSION['token_value'];
} else {
$token = hash('sha256', $this->random(500));
$_SESSION['token_value'] = $token;
return $token;
}

}

public function check_valid($method) {
if($method == 'post' || $method == 'get') {
$post = $_POST;
$get = $_GET;
if(isset(${$method}[$this->get_token_id()]) && (${$method}[$this->get_token_id()] == $this->get_token())) {
return true;
} else {
return false;
}
} else {
return false;
}
}

public function form_names($names, $regenerate) {

$values = array();
foreach ($names as $n) {
if($regenerate == true) {
unset($_SESSION[$n]);
}
$s = isset($_SESSION[$n]) ? $_SESSION[$n] : $this->random(10);
$_SESSION[$n] = $s;
$values[$n] = $s;
}
return $values;
}

private function random($len) {
if (function_exists('openssl_random_pseudo_bytes')) {
$byteLen = intval(($len / 2) + 1);
$return = substr(bin2hex(openssl_random_pseudo_bytes($byteLen)), 0, $len);
} elseif (@is_readable('/dev/urandom')) {
$f=fopen('/dev/urandom', 'r');
$urandom=fread($f, $len);
fclose($f);
$return = '';
}

if (empty($return)) {
for ($i=0;$i<$len;++$i) {
if (!isset($urandom)) {
if ($i%2==0) {
mt_srand(time()%2147 * 1000000 + (double)microtime() * 1000000);
}
$rand=48+mt_rand()%64;
} else {
$rand=48+ord($urandom[$i])%64;
}

if ($rand>57)
$rand+=7;
if ($rand>90)
$rand+=6;

if ($rand==123) $rand=52;
if ($rand==124) $rand=53;
$return.=chr($rand);
}
}

return $return;
}
}


Файл csrf.class.php это. Его нужно про иклюдить.

php
<?php
session_start();
include 'csrf.class.php';

$csrf = new csrf();


// Генерация id и значения токена
$token_id = $csrf->get_token_id();
$token_value = $csrf->get_token($token_id);

// Генерация случайных названий для полей формы
$form_names = $csrf->form_names(array('user', 'password'), false);


if(isset($_POST[$form_names['user']], $_POST[$form_names['password']])) {
// Проверяем являются ли валидными id и значение токена.
if($csrf->check_valid('post')) {
// Получаем переменные формы.
$user = $_POST[$form_names['user']];
$password = $_POST[$form_names['password']];

// Метод формы идет тут
}
// Генерируем новое случайное значение для формы.
$form_names = $csrf->form_names(array('user', 'password'), true);
}

?>

<form action="index.php" method="post">
<input type="hidden" name="<?= $token_id; ?>" value="<?= $token_value; ?>" />
<input type="text" name="<?= $form_names['user']; ?>" /><br/>
<input type="text" name="<?= $form_names['password']; ?>" />
<input type="submit" value="Login"/>
</form>


Защищаем auth.php от уязвимости CSRF.
Toruz (24.10.2020 в 11:11)
HTTPS-протокол наоборот, предовращает уязвимость CSRF. Сделали для этого SSL-сертификаты, чтобы не поделывать страницу от главной. Читай внимательно. А не всякую х...ню читай. Комментарии от пользователей, тем более от рядовых, не читай. Им хоть кол на голове чиши, они всё равно будут считать что HTTPS-протокол тоже уязвим. Скажу одно, HTTPS-протокол защищает на 60-70% от этой уязвимости. Всё остальное, 30-40% защищает сайт. Главное, мозги и прямые руки от разработчика.
Toruz (24.10.2020 в 11:11)
HTTPS-протокол наоборот, предовращает уязвимость CSRF. Сделали для этого SSL-сертификаты, чтобы не поделывать страницу от главной. Читай внимательно. А не всякую х...ню читай. Комментарии от пользователей, тем более от рядовых, не читай. Им хоть кол на голове чиши, они всё равно будут считать что HTTPS-протокол тоже уязвим. Скажу одно, HTTPS-протокол защищает на 60-70% от этой уязвимости. Всё остальное, 30-40% защищает сайт. Главное, мозги и прямые руки от разработчика.

Я знаю что протол https защищает поток данных от сервера к клиенту но он тоже не совершенный так как ключ шифруется в base64 и его можно, а Басё в наше время можно тоже расшифровать для этого есть утилиты.
161817535 (24.10.2020 в 15:53)
Я знаю что протол https защищает поток данных от сервера к клиенту но он тоже не совершенный так как ключ шифруется в base64 и его можно, а Басё в наше время можно тоже расшифровать для этого есть утилиты.


Ты сам знаешь что такое base64. И как он реализуется и выполеяется. Base64 ты не расшифруешь, даже опытные хакеры(взломщики) не днями расшифровают его, а месяцами. Читай внимательно.
Toruz (24.10.2020 в 11:30)
php
class CSRF
{
public function get_token_id() {
if(isset($_SESSION['token_id'])) {
return $_SESSION['token_id'];
} else {
$token_id = $this->random(10);
$_SESSION['token_id'] = $token_id;
return $token_id;
}
}

public function get_token() {
if(isset($_SESSION['token_value'])) {
return $_SESSION['token_value'];
} else {
$token = hash('sha256', $this->random(500));
$_SESSION['token_value'] = $token;
return $token;
}

}

public function check_valid($method) {
if($method == 'post' || $method == 'get') {
$post = $_POST;
$get = $_GET;
if(isset(${$method}[$this->get_token_id()]) && (${$method}[$this->get_token_id()] == $this->get_token())) {
return true;
} else {
return false;
}
} else {
return false;
}
}

public function form_names($names, $regenerate) {

$values = array();
foreach ($names as $n) {
if($regenerate == true) {
unset($_SESSION[$n]);
}
$s = isset($_SESSION[$n]) ? $_SESSION[$n] : $this->random(10);
$_SESSION[$n] = $s;
$values[$n] = $s;
}
return $values;
}

private function random($len) {
if (function_exists('openssl_random_pseudo_bytes')) {
$byteLen = intval(($len / 2) + 1);
$return = substr(bin2hex(openssl_random_pseudo_bytes($byteLen)), 0, $len);
} elseif (@is_readable('/dev/urandom')) {
$f=fopen('/dev/urandom', 'r');
$urandom=fread($f, $len);
fclose($f);
$return = '';
}

if (empty($return)) {
for ($i=0;$i<$len;++$i) {
if (!isset($urandom)) {
if ($i%2==0) {
mt_srand(time()%2147 * 1000000 + (double)microtime() * 1000000);
}
$rand=48+mt_rand()%64;
} else {
$rand=48+ord($urandom[$i])%64;
}

if ($rand>57)
$rand+=7;
if ($rand>90)
$rand+=6;

if ($rand==123) $rand=52;
if ($rand==124) $rand=53;
$return.=chr($rand);
}
}

return $return;
}
}


Файл csrf.class.php это. Его нужно про иклюдить.

php
<?php
session_start();
include 'csrf.class.php';

$csrf = new csrf();


// Генерация id и значения токена
$token_id = $csrf->get_token_id();
$token_value = $csrf->get_token($token_id);

// Генерация случайных названий для полей формы
$form_names = $csrf->form_names(array('user', 'password'), false);


if(isset($_POST[$form_names['user']], $_POST[$form_names['password']])) {
// Проверяем являются ли валидными id и значение токена.
if($csrf->check_valid('post')) {
// Получаем переменные формы.
$user = $_POST[$form_names['user']];
$password = $_POST[$form_names['password']];

// Метод формы идет тут
}
// Генерируем новое случайное значение для формы.
$form_names = $csrf->form_names(array('user', 'password'), true);
}

?>

<form action="index.php" method="post">
<input type="hidden" name="<?= $token_id; ?>" value="<?= $token_value; ?>" />
<input type="text" name="<?= $form_names['user']; ?>" /><br/>
<input type="text" name="<?= $form_names['password']; ?>" />
<input type="submit" value="Login"/>
</form>


Защищаем auth.php от уязвимости CSRF.

[hljs class="php"]
А можно зделать что бы он генерировал токен такого вида, так на много удобней и красивей.
хххх-хххх-хххх-хххх
Ab5f-56Gf-hu3c-g7rw
Toruz (24.10.2020 в 15:59)
Ты сам знаешь что такое base64. И как он реализуется и выполеяется. Base64 ты не расшифруешь, даже опытные хакеры(взломщики) не днями расшифровают его, а месяцами. Читай внимательно.

Я не знаю точно, но про утилиты знаю которые могут его расшифровать, правда расшифровка была не верная. Почему он что имеет ключ?
161817535 (24.10.2020 в 16:01)
[hljs class="php"]А можно зделать что бы он генерировал токен такого вида, так на много удобней и красивей.хххх-хххх-хххх-ххххAb5f-56Gf-hu3c-g7rw


Хеши давно устарели 32-битные. Запросто можно своровать и в брут засунуть. А вот sha256 64-битные не засунешь в брут. Он очень безопасный. Белые хакеры именно и рекомендуют использовать хеши(sha256) в паролях. Как ты его отделишь, если он слеплен в одно целое.
Вот именно. Сервисы не очень обрабатывают base64. Это уже на уровне машиного кода.
Toruz (24.10.2020 в 16:08)
Хеши давно устарели 32-битные. Запросто можно своровать и в брут засунуть. А вот sha256 64-битные не засунешь в брут. Он очень безопасный. Белые хакеры именно и рекомендуют использовать хеши(sha256) в паролях. Как ты его отделишь, если он слеплен в одно целое.

Жаль было бы удобней, поро басе64 тоже запомню.
Онлайн: 2
Время:
Gen. 0.0954
(c) Bym.Guru 2010-2025