1

Perhaps I am doing this wrong for php-fpm PHP 8. It seems to work otherwise on my local test server.

Server is Running Apache 2.4 and php-fpm v8.1.15

I have tried changing around the following bootstrap settings:

ini_set('session.use_only_cookies', '1'); // Avoid any PHP version to move sessions on URLs
ini_set('session.auto_start', '1'); // Prevent error to use session_start() if it's active in php.ini
ini_set('session.use_trans_sid', '0');
ini_set('session.cookie_samesite', 'Strict');
ini_set('session.cookie_httponly', 'true');
ini_set('session.cookie_secure', $secureCookie);
ini_set('session.cookie_domain', $_SERVER['SERVER_NAME']);
ini_set('url_rewriter.tags', '');

Each Save or Refresh in PHP 8 I get the following:

var_dump($csrfToken); csrfToken : string(40) "be0749f416c90c5d779d55891703026dabeb7b89"

var_dump($currentToken); currentToken : string(40) "2cb299479ac8b1905a35cb72f4cf809408235243"

var_dump($_SESSION); Session : array(4) { ["lang"]=> string(2) "en" ["SESSION_TIMESTAMP"]=> int(1676371294) ["CURRENT_USER"]=> int(1) ["phpmyfaq_csrf_token"]=> string(40) "2cb299479ac8b1905a35cb72f4cf809408235243" }

This is how I am trying to work with the tokens:

if ($user->perm->hasPermission($user->getUserId(), 'editconfig')) {
    
    // actions defined by url: user_action=
    $userAction = Filter::filterInput(INPUT_GET, 'config_action', FILTER_UNSAFE_RAW, 'listConfig');
    $csrfToken = Filter::filterInput(INPUT_POST, 'csrf', FILTER_UNSAFE_RAW);
    $currentToken = $user->getCsrfTokenFromSession();
    
    echo 'csrfToken : ';
    var_dump($csrfToken);
    echo '<br />';
    echo 'currentToken : ';
    var_dump($currentToken);
    echo '<br />';
    echo 'Session : ';
    var_dump($_SESSION);
        
        // Save the configuration
    //if ('saveConfig' === $userAction && $currentToken === $csrfToken) {
    # This code has a problem comparing the current token with the csrf token??
    #
    #
    # I can get the editer config to work only by removing the above line!  
    if ('saveConfig' === $userAction) {
        $checks = [
            'filter' => FILTER_UNSAFE_RAW,
            'flags' => FILTER_REQUIRE_ARRAY,
        ];
        $editData = Filter::filterInputArray(INPUT_POST, ['edit' => $checks]);
        $userAction = 'listConfig';
        $oldConfigValues = $faqConfig->config;

        // Set the new values
        $forbiddenValues = ['{', '}', '$'];
        $newConfigValues = [];
        $escapeValues = [
            'main.contactInformations',
            'main.customPdfHeader',
            'main.customPdfFooter',
            'main.titleFAQ',
            'main.metaKeywords'
        ];

        // Special checks
        if (isset($editData['edit']['main.enableMarkdownEditor'])) {
            $editData['edit']['main.enableWysiwygEditor'] = false; // Disable WYSIWG editor if Markdown is enabled
        }

        foreach ($editData['edit'] as $key => $value) {
            // Remove forbidden characters
            $newConfigValues[$key] = str_replace($forbiddenValues, '', $value);
            // Escape some values
            if (isset($escapeValues[$key])) {
                $newConfigValues[$key] = Strings::htmlspecialchars($value, ENT_QUOTES);
            }
            $keyArray = array_values(explode('.', $key));
            $newConfigClass = array_shift($keyArray);
        }

        foreach ($oldConfigValues as $key => $value) {
            $keyArray = array_values(explode('.', $key));
            $oldConfigClass = array_shift($keyArray);
            if (isset($newConfigValues[$key])) {
                continue;
            } else {
                if ($oldConfigClass === $newConfigClass && $oldConfigValues[$key] === 'true') {
                    $newConfigValues[$key] = 'false';
                } else {
                    $newConfigValues[$key] = $oldConfigValues[$key];
                }
            }
        }

        if (!is_null($editData)) {
            $faqConfig->update($newConfigValues);
        }

        $faqConfig->getAll();
    }
    ?>
    <form id="config_list" name="config_list" method="post" action="?action=config&amp;config_action=saveConfig">
    <input type="hidden" name="csrf" value="<?= $currentToken ?>">

    <div
      class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
      <h1 class="h2">
        <i aria-hidden="true" class="fa fa-wrench"></i>
          <?= $PMF_LANG['ad_config_edit'] ?>
      </h1>
      <div class="btn-toolbar mb-2 mb-md-0">
        <div class="btn-group mr-2">
          <button class="btn btn-sm btn-warning" type="reset">
              <?= $PMF_LANG['ad_config_reset'] ?>
          </button>
          <button class="btn btn-sm btn-success" type="submit">
              <?= $PMF_LANG['ad_config_save'] ?>
          </button>
        </div>
      </div>
    </div>

    <div class="row">
      <div class="col-lg-12">

        <ul class="nav nav-tabs" role="tablist">
          <li role="presentation" class="nav-item">
            <a href="#main" aria-controls="main" role="tab" data-toggle="tab" class="nav-link active">
              <i aria-hidden="true" class="fa fa-home"></i>
                <?= $PMF_LANG['mainControlCenter'] ?>
            </a>
          </li>
          <li role="presentation" class="nav-item">
            <a href="#records" aria-controls="records" role="tab" data-toggle="tab" class="nav-link">
              <i aria-hidden="true" class="fa fa-th-list"></i>
                <?= $PMF_LANG['recordsControlCenter'] ?>
            </a>
          </li>
          <li role="presentation" class="nav-item">
            <a href="#search" aria-controls="search" role="tab" data-toggle="tab" class="nav-link">
              <i aria-hidden="true" class="fa fa-search"></i>
                <?= $PMF_LANG['searchControlCenter'] ?>
            </a>
          </li>
          <li role="presentation" class="nav-item">
            <a href="#security" aria-controls="security" role="tab" data-toggle="tab" class="nav-link">
              <i aria-hidden="true" class="fa fa-warning"></i>
                <?= $PMF_LANG['securityControlCenter'] ?>
            </a>
          </li>
          <li role="presentation" class="nav-item">
            <a href="#spam" aria-controls="spam" role="tab" data-toggle="tab" class="nav-link">
              <i aria-hidden="true" class="fa fa-thumbs-down"></i>
                <?= $PMF_LANG['spamControlCenter'] ?>
            </a>
          </li>
          <li role="presentation" class="nav-item">
            <a href="#seo" aria-controls="seo" role="tab" data-toggle="tab" class="nav-link">
              <i aria-hidden="true" class="fa fa-search"></i>
                <?= $PMF_LANG['seoCenter'] ?>
            </a>
          </li>
          <li role="presentation" class="nav-item">
            <a href="#social" aria-controls="social" role="tab" data-toggle="tab" class="nav-link">
              <i aria-hidden="true" class="fa fa-retweet"></i>
                <?= $PMF_LANG['socialNetworksControlCenter'] ?>
            </a>
          </li>
          <li role="presentation" class="nav-item">
            <a href="#mail" aria-controls="mail" role="tab" data-toggle="tab" class="nav-link">
              <i aria-hidden="true" class="fa fa-inbox"></i>
                <?= $PMF_LANG['mailControlCenter'] ?>
            </a>
          </li>
          <li role="presentation" class="nav-item">
            <a href="#ldap" aria-controls="ldap" role="tab" data-toggle="tab" class="nav-link">
              <i aria-hidden="true" class="fa fa-sitemap"></i>
                <?= 'LDAP' ?>
            </a>
          </li>
          <li role="presentation" class="nav-item">
            <a href="#api" aria-controls="ldap" role="tab" data-toggle="tab" class="nav-link">
              <i aria-hidden="true" class="fa fa-gears"></i>
                <?= 'API' ?>
            </a>
          </li>
        </ul>

        <div class="tab-content p-2 pt-4 pmf-configuration-panel">
          <div role="tabpanel" class="tab-pane fade show active" id="main"></div>
          <div role="tabpanel" class="tab-pane fade" id="records"></div>
          <div role="tabpanel" class="tab-pane fade" id="search"></div>
          <div role="tabpanel" class="tab-pane fade" id="security"></div>
          <div role="tabpanel" class="tab-pane fade" id="spam"></div>
          <div role="tabpanel" class="tab-pane fade" id="seo"></div>
          <div role="tabpanel" class="tab-pane fade" id="social"></div>
          <div role="tabpanel" class="tab-pane fade" id="mail"></div>
          <div role="tabpanel" class="tab-pane fade" id="ldap"></div>
          <div role="tabpanel" class="tab-pane fade" id="api"></div>
        </div>
      </div>
    </div>

  </form>

  <script src="assets/js/configuration.js"></script>
    <?php
} else {
    echo $PMF_LANG['err_NotAuth'];
}

I switched back and forth between PHP versions from 7 to 8 to 8.1.15

This works local on my test server but when I upload it to a remote production server, every refresh seems to affect my token comparison.

I made sure the session cookie domain was setup right.

Progman
  • 16,827
  • 6
  • 33
  • 48

0 Answers0