Follow along with the video below to see how to install our site as a web app on your home screen.
Бележка: This feature may not be available in some browsers.
pro12 каза:Да
<?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;
}
}
<?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');
}
<?php
require './CSRFToken.php';
CSRFToken::setSecurityToken();
?>
<a href="query.php/users/delete/admin?<?= CSRFToken::TOKEN_NAME; ?>=<?= CSRFToken::getTokenValue(); ?>">Query string test</a>
pix3l каза:...
Благодаря!Fakeheal каза:pro12 каза:Да
Значи проблема е следния:
Формата ти се извиква преди кода за проверката, а във формата РЕГЕНЕРИРАШ нов токен.
След това проверяваш дали в токена от урла е същия с този, който вече си регенерирал (възможно е някога да съвпаднат, но шанса е минимален).
Затова и в като var_dump-ваш в (видях, че е в <head>), което е преди формата и все още не си го презаписал, затова все още съвпадат.
Да, с end() изглежда по-яко.Fakeheal каза:pix3l каза:...
PHP е почнал да изглежда като красив език
PS: това $path[count($path) - 1]; май ще изглежда по-красиво така echo end($path), но не знам.
session_start();
class CSRF
{
private $token;
public function set()
{
$this->token = md5(uniqid(rand(), true));
$_SESSION["token"] = $this->token;
return $this;
}
public function get()
{
return $this->token;
}
public function clean()
{
$_SESSION["token"] = false;
$this->token = false;
return $this;
}
}
$csrf = new CSRF;
if (isset($_POST['submit']) and $_POST['token'] === $_SESSION['token']) {
$searchdata['search'] = $_POST['search'];
print "It is ok!";
}
$token = $csrf->set()->get();
?>
<form action="" method="post">
<input type="text" id="searchpole" size="15" maxlength="25" name="search">
<br/><input type="hidden" name="token" value="<?php print $token; ?>">
<input type="submit" name="submit" id="btnsearch" value="search" />
</form>
pix3l каза:@dakata__92 много съм любопитен да видя как ще парснеш страницата така, че да вземеш ключът на потребителя. Ето ти код, върху който да размишляваш:
...
Ехх... Така, като кажете "хаква" и ми иде да извадя коректора. :mrgreen:pix3l каза:Дай работещо решение с реален код, който хаква кода по-горе.![]()
pix3l каза:Не случайно използвах "хак", понеже ако излъжеш CSRF защитата, електронното банкиране ще спре да съществува.
CSRF не защитава само GET заявки... POST заявките са по-критичната част.
Не знам ти какви ботове пишеш на PHP, аз съм използвал само Java и Python за подобно нещо. PHP не ми се струва подходящ.
Тц, тц, тццц... Какво ли се занимавам. Изпрати ми линк, да ми смениш паролата, че явно GET формите са на мода и всеки втори пише глупости, защото чете глупости. Направи ми хипервръзка харакири (http://web-tourist.net/forum/account.php?delete=true) или по-добре ти го направи (http://web-tourist.net/forum/account.php?new_password=abc123). CSRF в пълната си красота... Не ти трябва XSS, SQLi или BruteForce, просто му прати линк който да отвори без да иска и да си смени паролата с поставената от теб, след което да се логнеш и да му смениш профилната снимка с такава на магаре. Добре, че token ще защити потребителя от това сам да извърши по невнимание действие с акаунта си позволено от кода на системата, подтикнато от злонамерен потребител. :arrow: :idea:pix3l каза:Виж, препоръчвам ти да прочетеш какво е CSRF и после пак да прегледаш кода, който постнах.
CSRF защитата по никакъв начин не те пази от спамери - факт! Пази те от нещо къде-къде по-сериозно.![]()
Цял ден обяснявам за GET и POST заявки, а ти чак сега ми задаваш този реторичен за мен въпрос. Толкова си и прочел какво съм написал. CAPTCHA само на входната точка при логване в акаунта, за да знаеш, че пред системата ти се е легитимирал човек, не бот. От там нататък се процедира по съвсем друг начини, но честно да ти кажа, не си заслужава ти да обяснявам какви. За теб аз не знам какво е CSRF, а за мен, ти изобщо не приемаш чуждото мнение за вярно.pix3l каза:Кой е казал, че CSRF работи само с GET форми?
Съгласи се, че да караш потребител да попълва CAPTCHA всеки път, когато има потенциален риск от CSRF е най-малоумното нещо, което някой може да направи... тук вече говорим за UX.
Вместо постоянното генериране на някакви ключове колко по-елегантно решение е да попиташ потребителя за потвърждение на заявката? Все пак ако е толкова важна за него то не пречи да се съгласи и да я потвърди. Това е за вътрешни страници за някои важни функциии примерно свързани с акаунта или нещо около него. Така потребителя ще бъде информиран, че нещо става, и може да вземе мерки, а не просто да му се изпише - "Паролата Ви беше сменена успешно". Генерирането на ключове е решение за някои частни случаи и не мога да го успоря, но никой не пожела да се замисли дали са правилното решение на проблема в който са попаднали. После се започва с едно питане защо приложението зарежда бавно, ами тук малко, там малко усложнения и накрая пренаписване на ново...dakata__92 каза:Тц, тц, тццц... Какво ли се занимавам. Изпрати ми линк, да ми смениш паролата, че явно GET формите са на мода и всеки втори пише глупости, защото чете глупости. Направи ми хипервръзка харакири (http://web-tourist.net/forum/account.php?delete=true) или по-добре ти го направи (http://web-tourist.net/forum/account.php?new_password=abc123). CSRF в пълната си красота... Не ти трябва XSS, SQLi или BruteForce, просто му прати линк който да отвори без да иска и да си смени паролата с поставената от теб, след което да се логнеш и да му смениш профилната снимка с такава на магаре. Добре, че token ще защити потребителя от това сам да извърши по невнимание действие с акаунта си позволено от кода на системата, подтикнато от злонамерен потребител. :arrow: :idea:pix3l каза:Виж, препоръчвам ти да прочетеш какво е CSRF и после пак да прегледаш кода, който постнах.
CSRF защитата по никакъв начин не те пази от спамери - факт! Пази те от нещо къде-къде по-сериозно.![]()