- CSRF на търсачка
12345
WT форуми -> PHP MySQL ASP.NET -> CSRF на търсачка
Създайте нова тема Напишете отговор 
Автор Съобщение
Fakeheal
Support
Support

Регистриран на: 17/04/2010 8:37 am

Support: 350
Bonus: 698
Мнения: 2649
Мнение 10/04/2018 4:47 pm      Отговорете с цитат


dakata__92 написа:
<form action="/search" method="GET" name="searchf">
<input type="submit" name="searchf" id="btnsearch" value="search" />

Две структури с едно име...



name атрибута на форма не се подава в гета...
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pro12
Турист
Турист

Регистриран на: 10/01/2013 5:08 pm

Support: 0
Bonus: 0
Мнения: 444
Мнение 10/04/2018 4:49 pm      Отговорете с цитат


И двата стринга имат различни стоиности. Но щом е безсмислена защитата я махам.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
dakata__92
Активен
Активен

Регистриран на: 02/08/2011 9:24 pm

Support: 119
Bonus: 231
Мнения: 3069
Мнение 10/04/2018 4:51 pm      Отговорете с цитат


Fakeheal написа:
dakata__92 написа:
...


Просто исках да кажа, че няма смисъл да предлагаш нещо, което не е много от помощ. Без дори да обясниш каква е разлиакта. Тук сме да се учим.

Иначе чисто логически погледнато. Щом токена е успял да го подаде на URL (и го взима с $_GET) е стринг.

Ако го е подал на страницата, която е сложила URL-a, значи е стринг.

Автоматично изключваме проблем в операторите за сравнение.

Поне това е моя начин на мислене.


За трети път ще визирам, че нашият начин на мислене е различен. Самият му код не е структуриран правилно (поне от към имена на променливите и масивите) и се поставям на негово място. Той ако пробва нещата, които му давам като информация и ми върне отговор ще получи и обяснение какъв е проблема му. Това дали е стринг или не, няма как да знаем защото, ако GET му е стринг, то не се знае дали пък сесията не му е била число, примерно. Така, че не е нужно да се хващаш за това, че не съм му обяснил в дълбочина, защо му предложих да пробва различен оператор, защото реално исках просто да отметна този казус като причина. Тръгвам от проблема. Щом това условие не отговаря и не влиза в него, търся защо с най-простите средства и след това с по-завързаните неща. Не е нужно да го насмитаме излишно, поне в началото.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Fakeheal
Support
Support

Регистриран на: 17/04/2010 8:37 am

Support: 350
Bonus: 698
Мнения: 2649
Мнение 10/04/2018 4:54 pm      Отговорете с цитат


pro12 написа:
И двата стринга имат различни стоиности. Но щом е безсмислена защитата я махам.


Защото вероятно променяш токена в сесията, преди сравниш предния токен, който идва от урла.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pro12
Турист
Турист

Регистриран на: 10/01/2013 5:08 pm

Support: 0
Bonus: 0
Мнения: 444
Мнение 10/04/2018 4:55 pm      Отговорете с цитат


dakata__92 написа:
<form action="/search" method="GET" name="searchf">
<input type="submit" name="searchf" id="btnsearch" value="search" />

Две структури с едно име...
Това грешно ли е?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
dakata__92
Активен
Активен

Регистриран на: 02/08/2011 9:24 pm

Support: 119
Bonus: 231
Мнения: 3069
Мнение 10/04/2018 4:55 pm      Отговорете с цитат


Fakeheal написа:
dakata__92 написа:
<form action="/search" method="GET" name="searchf">
<input type="submit" name="searchf" id="btnsearch" value="search" />

Две структури с едно име...



name атрибута на форма не се подава в гета...

Пак ми е ясно, но това беше забележка към автора.

pro12 написа:
И двата стринга имат различни стоиности. Но щом е безсмислена защитата я махам.


Мое си е виждането, че няма файда от тази защита, поне в този и вид. Относно разликите, проблема ти вероятно е при генерирането и сетването на сесията в класът. Някъде си объркал логиката там. Не се вижда къде и как я презаписваш или унистожаваш. Ако все пак искаш да си ползваш тази защита драсни и кода на класът тук.

Последната промяна е направена от dakata__92 на 10/04/2018 4:57 pm; мнението е било променяно общо 1 път
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
dakata__92
Активен
Активен

Регистриран на: 02/08/2011 9:24 pm

Support: 119
Bonus: 231
Мнения: 3069
Мнение 10/04/2018 4:57 pm      Отговорете с цитат


pro12 написа:
dakata__92 написа:
<form action="/search" method="GET" name="searchf">
<input type="submit" name="searchf" id="btnsearch" value="search" />

Две структури с едно име...
Това грешно ли е?

Може да доведе, до последващи обърквания след време ако ползваш парсъри и други неща примерно с визуализацията или някакъв последващ JS.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pro12
Турист
Турист

Регистриран на: 10/01/2013 5:08 pm

Support: 0
Bonus: 0
Мнения: 444
Мнение 10/04/2018 5:01 pm      Отговорете с цитат


Това е класа
PHP code:
class Csrftoken{

public function generetetoken() {
$token = md5(uniqid(rand(), true));
return $token;
}



public function searchtoken() {//search token
$token = $this->generetetoken();

return $_SESSION['toksearch'] = $token;
//


}
}
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Fakeheal
Support
Support

Регистриран на: 17/04/2010 8:37 am

Support: 350
Bonus: 698
Мнения: 2649
Мнение 10/04/2018 5:11 pm      Отговорете с цитат


Формата ти преди този код ли е?


if (isset($_GET['searchf'])) {
    $searchdata['search'] = $_GET['search'];
    $token = $_GET['tokens'];


    if (isset($_SESSION['toksearch']) && $token === $_SESSION['toksearch']) {
        echo 'ok';
    } else {
        echo 'try again';
    }
}
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pro12
Турист
Турист

Регистриран на: 10/01/2013 5:08 pm

Support: 0
Bonus: 0
Мнения: 444
Мнение 10/04/2018 5:12 pm      Отговорете с цитат


Да
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Fakeheal
Support
Support

Регистриран на: 17/04/2010 8:37 am

Support: 350
Bonus: 698
Мнения: 2649
Мнение 10/04/2018 5:14 pm      Отговорете с цитат


pro12 написа:
Да


Значи проблема е следния:

Формата ти се извиква преди кода за проверката, а във формата РЕГЕНЕРИРАШ нов токен.

След това проверяваш дали в токена от урла е същия с този, който вече си регенерирал (възможно е някога да съвпаднат, но шанса е минимален).

При var_dump (видях, че е в <head>), което е преди формата и все още не е презаписан токена и затова съвпадат.

Последната промяна е направена от Fakeheal на 10/04/2018 5:22 pm; мнението е било променяно общо 3 пъти
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pix3l
Нов
Нов

Регистриран на: 08/10/2016 4:31 pm

Support: 6
Bonus: 12
Мнения: 138
Мнение 10/04/2018 5:15 pm      Отговорете с цитат


@dakata__92 много съм любопитен да видя как ще парснеш страницата така, че да вземеш ключът на потребителя. Ето ти код, върху който да размишляваш:

CSRFToken.php
PHP code:

<?php

class CSRFToken
{
const TOKEN_NAME = 'csrf_token';
const PATH = '/';
const DOMAIN = 'localhost';
const SECURE = false;
const HTTP_ONLY = true;

/**
* @var string
*/
private static $tokenValue = null;

private function __construct()
{
// Doesn't need an instance
}

/**
* Sets a cookie with randomly generated security token.
*/
public static function setSecurityToken(): void
{
self::$tokenValue = uniqid();

setcookie(
self::TOKEN_NAME,
self::$tokenValue,
0,
self::PATH,
self::DOMAIN,
self::SECURE,
self::HTTP_ONLY

);
}

/**
* Returns the security token cookie, or null if this is
* the first time the user hits a guarded area.
*
* @return null|string
*/
public static function getSecurityToken(): ?string
{
return $_COOKIE[self::TOKEN_NAME];
}

/**
* Returns the randomly generated security token, or null
* if it's called before <b>setSecurityToken()</b>.
*
* @return null|string
*/
public static function getTokenValue(): ?string
{
return self::$tokenValue;
}

/**
* Checks if the given security token is valid.
*
* @param string $token
* @return bool
*/
public static function isTokenValid(string $token): bool
{
return self::getSecurityToken() === $token;
}
}


query.php
PHP code:

<?php

require 'CSRFToken.php';

CSRFToken::setSecurityToken();

if (isset($_GET[CSRFToken::TOKEN_NAME]) && CSRFToken::isTokenValid($_GET[CSRFToken::TOKEN_NAME])) {
$path = explode('/', $_SERVER['PATH_INFO']);

echo 'Deleting ' . $path[count($path) - 1];
} else {
die('Invalid security token');
}


index.php
PHP code:

<?php

require './CSRFToken.php';

CSRFToken::setSecurityToken();
?>
<a href="query.php/users/delete/admin?<?= CSRFToken::TOKEN_NAME; ?>=<?= CSRFToken::getTokenValue(); ?>">Query string test</a>
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
12345
Страница 2 от 5


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети