Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PDO layer and any questions ! #45

Open
N-studio18fr opened this issue Nov 24, 2024 · 6 comments
Open

PDO layer and any questions ! #45

N-studio18fr opened this issue Nov 24, 2024 · 6 comments

Comments

@N-studio18fr
Copy link
Contributor

Hi, I’d like to know if you have any information regarding one of the official FluxBB repositories, specifically the one that might help implement PDO.
Do you think it’s relevant to implement such a feature?

I have another question regarding CSRF protection using HTTP referrers.
Wouldn’t it be more secure to tie forms to tokens?

One last question to bother you: all the revisions you included today seem to be updates to maintain PHP, MySQL, etc.
Is the SQLite3 version fully functional?

Have your revisions included all the modifications from the original FluxBB 1.6 roadmap?

https://web.archive.org/web/20220812065625/https://fluxbb.org/development/core/tickets/?m=33&s=all

I’m in the process of transforming the table system into definition lists to improve readability on e-readers and SEO, as well as converting everything to HTML5. If you're interested, I haven’t pushed this to GitHub yet, but I could share the source files with you if you’d like to study them, and later I could propose a merge when I think it’s functional.

Thanks in advance for your reply!
And sorry for the translation! I'm french ^^

// RU

Привет! Мне хотелось бы узнать, есть ли у тебя информация об одном из официальных репозиториев FluxBB, а именно о том, который может помочь с внедрением PDO.
Как ты думаешь, есть ли смысл реализовать такую функцию?

У меня есть ещё один вопрос о защите CSRF с использованием HTTP referrer.
Не было бы безопаснее привязать формы к токенам?

И последний вопрос, чтобы тебя ещё немного побеспокоить: все изменения, которые ты включил сегодня, кажутся обновлениями для поддержки PHP, MySQL и т.д.
Версия SQLite3 полностью функциональна?

Твои изменения включили все модификации из оригинальной дорожной карты FluxBB 1.6?

https://web.archive.org/web/20220812065625/https://fluxbb.org/development/core/tickets/?m=33&s=all

Я сейчас преобразую систему таблиц в списки определений, чтобы улучшить читаемость на ридерах и SEO, а также перевожу всё на HTML5. Если тебе интересно, я пока не выкладывал это на GitHub, но могу поделиться исходниками, если хочешь их изучить. Позже я могу предложить merge, когда посчитаю, что всё работает корректно.

Заранее спасибо за ответ!
И извиняюсь за перевод!

@MioVisman
Copy link
Owner

MioVisman commented Nov 25, 2024

Hi!

Hi, I’d like to know if you have any information regarding one of the official FluxBB repositories, specifically the one that might help implement PDO.
Do you think it’s relevant to implement such a feature?

https://github.com/fluxbb/database/tree/master this?
Looks clever :) At first glance it uses prepared statements, which is safe. But the values ​​passed are not tied to a type (number, string or boolean), it seems. But it is necessary to test for different types of databases. Some SQL queries will probably still have to be formed differently.

I have another question regarding CSRF protection using HTTP referrers.
Wouldn’t it be more secure to tie forms to tokens?

https://github.com/MioVisman/FluxBB_by_Visman/blob/master/include/functions.php#L1178-L1192
I generate a token based on:

  1. PUN_ROOT
  2. file name
  3. $user['id']
  4. user ip
  5. $user['password']
  6. $pun_config['o_crypto_pas']
  7. get_current_protocol()

And it even seems fat :)
But yes, it would be correct to generate a unique token for each form call, but all these tokens need to be stored somewhere while they are valid or used tokens need to be stored until the set token lifetime expires, and this is unnecessary costs or complication of the installation and operation of the forum.

In ForkBB I take into account other parameters to form a token: user id, ip and password + secret key + BASE_URL + time + file marker + form data.

One last question to bother you: all the revisions you included today seem to be updates to maintain PHP, MySQL, etc.
Is the SQLite3 version fully functional?

I haven't tested SQLite on PHP 8.4. It seems to me that there were no changes from 8.3 to 8.4 for SQLite.
For SQLite to function properly, you need to include the following lines in the config file

//define('FORUM_SQLITE3_BUSY_TIMEOUT', 5000);
//define('FORUM_SQLITE3_WAL_ON', 1);

replace to

define('FORUM_SQLITE3_BUSY_TIMEOUT', 5000);
define('FORUM_SQLITE3_WAL_ON', 1);

After this, a special transaction mode for SQLite will be enabled:

BEGIN IMMEDIATE TRANSACTION

https://github.com/MioVisman/FluxBB_by_Visman/blob/master/include/dblayer/sqlite3.php#L75
The database busy errors should disappear.

Have your revisions included all the modifications from the original FluxBB 1.6 roadmap?
I don't remember now. A lot of time has passed.

If you're interested, I haven’t pushed this to GitHub yet, but I could share the source files with you if you’d like to study them,

Thanks, but I already left FluxBB ;)

@N-studio18fr
Copy link
Contributor Author

##RU
Есть ли у тебя идея, что меня блокирует?
Что касается токенов, даже если твоя версия остается защищенной, я считаю, что защита сейчас важнее, поскольку стоимость этого минимальна. Сегодня я попытался внедрить токены в форму на post.php, но столкнулся с проблемой. Я не трогал твой код, вот что я внедрил:

functions.php :

function generate_csrf_token() {
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

function validate_csrf_token() {
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
    if (empty($_POST['csrf_token']) || $_POST['csrf_token'] !== ($_SESSION['csrf_token'] ?? '')) {
        error('Invalid CSRF token. Please try again.', __FILE__, __LINE__);
    }
    // Facultatif : Régénérer le token après validation pour limiter sa réutilisation.
    unset($_SESSION['csrf_token']);
}

Dans post.php l72:

// Did someone just hit "Submit" or "Preview"?
if (isset($_POST['form_sent'])) {
    flux_hook('post_before_validation');

    try {
        // Test CSRF token
        validate_csrf_token();  // exception if token is invalid
        // check_csrf($_POST['csrf_hash']);    // exception if Referer is invalid

        // all valid, traiter le formulaire
        echo "Le formulaire a été soumis avec succès!";
        
    } catch (Exception $e) {
        echo "Erreur : " . $e->getMessage();
    }
}

ligne 706:

<div class="infldset txtarea">
    <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">
    <input type="hidden" name="csrf_hash" value="<?php echo csrf_hash() ?>" />
    <input type="hidden" name="form_sent" value="1" />
</div>

Я сделал это, чтобы использовать токены в дополнение к твоей базовой защите, но что-то пошло не так. Когда я в блоке try, который я добавил, пытаюсь проверить check_csrf, если я вставляю var_dump($_POST['csrf_hash'], pun_csrf_token());, два вывода разные, и поэтому возникает ошибка...

##EN
Do you have any idea what is blocking me?
Regarding tokens, even though your version remains secure, I believe that protection is more important today, as the cost is minimal. Today, I tried to implement tokens in the form on post.php, but I'm facing an issue. I haven't touched your code, here's what I implemented:

functions.php :

function generate_csrf_token() {
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

function validate_csrf_token() {
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
    if (empty($_POST['csrf_token']) || $_POST['csrf_token'] !== ($_SESSION['csrf_token'] ?? '')) {
        error('Invalid CSRF token. Please try again.', __FILE__, __LINE__);
    }
    // Facultatif : Régénérer le token après validation pour limiter sa réutilisation.
    unset($_SESSION['csrf_token']);
}

Dans post.php l72:

// Did someone just hit "Submit" or "Preview"?
if (isset($_POST['form_sent'])) {
    flux_hook('post_before_validation');

    try {
        // Test CSRF token
        validate_csrf_token();  // exception if token is invalid
        // check_csrf($_POST['csrf_hash']);    // exception if Referer is invalid

        // all valid, traiter le formulaire
        echo "Le formulaire a été soumis avec succès!";
        
    } catch (Exception $e) {
        echo "Erreur : " . $e->getMessage();
    }
}

ligne 706:

<div class="infldset txtarea">
    <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">
    <input type="hidden" name="csrf_hash" value="<?php echo csrf_hash() ?>" />
    <input type="hidden" name="form_sent" value="1" />
</div>

I did this to use tokens in addition to your basic protection, but something's wrong. When, in the try block I added, I try to check check_csrf, if I dump var_dump($_POST['csrf_hash'], pun_csrf_token());, the two outputs are different, and that's why I get an error...

##FR
Concernant les tokens, même si ta version reste sécurisée, je pense qu'aujourd'hui la protection prévaut sur le coût qui est minime. Aujourd'hui, j'ai tenté d'implémenter des tokens sur le formulaire de post.php, mais je suis confronté à un souci. Je n'ai pas du tout touché à ton code, j'ai implémenté :

Dans functions.php :

function generate_csrf_token() {
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

function validate_csrf_token() {
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
    if (empty($_POST['csrf_token']) || $_POST['csrf_token'] !== ($_SESSION['csrf_token'] ?? '')) {
        error('Invalid CSRF token. Please try again.', __FILE__, __LINE__);
    }
    // Facultatif : Régénérer le token après validation pour limiter sa réutilisation.
    unset($_SESSION['csrf_token']);
}

Dans post.php l72:

// Did someone just hit "Submit" or "Preview"?
if (isset($_POST['form_sent'])) {
    flux_hook('post_before_validation');

    try {
        // Test CSRF token
        validate_csrf_token();  // exception if token is invalid
        // check_csrf($_POST['csrf_hash']);    // exception if Referer is invalid

        // all valid, traiter le formulaire
        echo "Le formulaire a été soumis avec succès!";
        
    } catch (Exception $e) {
        echo "Erreur : " . $e->getMessage();
    }
}

ligne 706:

<div class="infldset txtarea">
    <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">
    <input type="hidden" name="csrf_hash" value="<?php echo csrf_hash() ?>" />
    <input type="hidden" name="form_sent" value="1" />
</div>

J'ai fait cela afin d'utiliser les tokens en plus de ta protection de base, mais il y a quelque chose qui cloche. Quand, dans le bloc try que j'ai ajouté, je cherche à vérifier check_csrf, si je colle un var_dump($_POST['csrf_hash'], pun_csrf_token());, mes deux sorties sont différentes, et du coup, j'ai une erreur...

@MioVisman
Copy link
Owner

Is the session cookie set in the browser when the post form is displayed? Does it not change on the post submission verification page?

@N-studio18fr
Copy link
Contributor Author

Ru :

Проблема в том, что ошибка появляется только когда я раскомментирую эту строку в блоке try/catch:

//check_csrf($_POST['csrf_hash']);

Кроме того, достаточно раскомментировать её только один раз для теста, и я полностью ломаю систему.

PHPSESSID не меняется между страницей формы и отправкой, независимо от того, раскомментирована ли строка, то есть сессия в порядке. Но у меня создается впечатление, что я непреднамеренно ввожу ошибку, связанную с:

function check_csrf($token)
{
    global $lang_common;

    if (! is_string($token) || ! hash_equals($token, pun_csrf_token()))
        message($lang_common['Bad csrf hash'], false, '404 Not Found');
        // Логирование данных для отладки
    var_dump([
        'id' => $pun_user['id'],
        'password' => $pun_user['password'],
        'remote_address' => $remote_address,
        'token' => $token
    ]);
}

Мой var_dump здесь для отладки ^^


EN :

The problem is that the issue only appears when I uncomment this line in my try/catch block:

//check_csrf($_POST['csrf_hash']);

Moreover, I only need to uncomment it once for testing, and it completely breaks the system.

PHPSESSID does not change between the form page and submission, whether the line is uncommented or not, so the session is fine. But I feel like I am unintentionally introducing a bug related to:

function check_csrf($token)
{
    global $lang_common;

    if (! is_string($token) || ! hash_equals($token, pun_csrf_token()))
        message($lang_common['Bad csrf hash'], false, '404 Not Found');
        // Logging data for debugging
    var_dump([
        'id' => $pun_user['id'],
        'password' => $pun_user['password'],
        'remote_address' => $remote_address,
        'token' => $token
    ]);
}

My var_dump is here for debugging ^^


FR

le problème c'est que le soucis apparait seulement quand je décommente une fois cette ligne dans mon block try/catch :

       //check_csrf($_POST['csrf_hash']); 

de plus il suffit que je la décommente une seul fois pour des test et je casse entièrement le système.

PHPSESSID ne change pas entre la page du formulaire et l'envoie , que la ligne soit décommentée ou non donc la session est Ok.
mais j'ai l'impression que j'introduit un bug sans le vouloir en lien avec :

function check_csrf($token)
{
	global $lang_common;

	if (! is_string($token) || ! hash_equals($token, pun_csrf_token()))
		message($lang_common['Bad csrf hash'], false, '404 Not Found');
	        // Journalisation des données pour déboguer
        var_dump([
            'id' => $pun_user['id'],
            'password' => $pun_user['password'],
            'remote_address' => $remote_address,
            'token' => $token
        ]);
}

mon vardump est la pour debugage ^^

@MioVisman
Copy link
Owner

I don't use the check_csrf() function in my code.
The csrf_hash() and confirm_referrer() functions are used to generate and verify the token.

@N-studio18fr
Copy link
Contributor Author

Ой, ну я глупый(ая)! Правда, так это работает гораздо лучше.

Oh, but I'm silly! It's true that it works much better this way.

non mais je suis bête c'est vrai que comme cela ça marche beaucoup mieux :

    try {
        // Test CSRF token
        validate_csrf_token();  // Exception si le token est invalide

        // Vérification du Referer
        confirm_referrer('post.php');  // Exception si le Referer est invalide

        // Si tout est valide, traiter le formulaire
        echo "Le formulaire a été soumis avec succès !";
    } catch (Exception $e) {
        // Gestion des erreurs
        echo "Erreur : " . $e->getMessage();
    }

Alright, I'm going to add the missing hidden inputs to the rest of the script!

Хорошо, я добавлю недостающие скрытые поля в остальную часть скрипта!

Bon, je vais aller ajouter les inputs hidden manquants dans le reste du script !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants