صدور الترقيع الأمني vBulletin 3.8.7 PL3 بحيث عالجت فيه الشركة ثغرة أمنية من نوع " فلود "


الملفات المحدثة هي :


  • includes/class_dm_threadpost.php
  • includes/class_floodcheck.php
  • includes/functions.php
  • includes/init.php
  • includes/version_vbulletin.php


لأصحاب الترخيص يمكنهم تحميل الترقيع الأمني من ( منطقة الأعضاء )


تنبيه : الترقية الى vb.3.8.7 PL3 مبنية على الترقية من النسخة التي تسبقها وهي vb.3.8.7 PL2

للذين لا يملكون الترخيص يمكنهم اتباع الشرح التالي من اجل الترقيع :


أولا : ملف ( class_dm_threadpost.php )

نبحث بداخله على :

كود:
if ($user['lastpost'] <= TIMENOW AND
                    !can_moderate($this->info['forum']['forumid'],       '', $user['userid'], $user['usergroupid'] .       (trim($user['membergroupids']) ? ",$user[membergroupids]" : '')))
                {
نستبدله بالتالي :

كود:
if  (!can_moderate($this->info['forum']['forumid'], '',       $user['userid'], $user['usergroupid'] . (trim($user['membergroupids']) ?       ",$user[membergroupids]" : '')))
                {
ثانيا : ملف ( class_floodcheck.php )

نبحث في داخله على :

كود:
// if we updated something, we're not flooding; otherwise, we have to wait
        $this->flood_wait = ($db->affected_rows() > 0 ? 0 :      ($this->read_value - $floodmin_value));
نستبدله بالتالي :

كود:
// if we updated something, we're not flooding; otherwise, we have to wait
        if ($db->affected_rows() > 0)
        {
            // we are not flooding
            $this->flood_wait = 0;
        }
        else
        {
            // we are flooding and have to wait
            $this->flood_wait = $this->read_value - $floodmin_value;

            if ($this->flood_wait == 0)
            {
                $db->query_write("
                    UPDATE " . TABLE_PREFIX . $this->table . " AS " . $this->table . "
                    SET " . $this->read_column . " = " . $this->commit_value . "
                    WHERE " . $this->primary_key . " = " . intval($this->key_value) . "
                    AND " . $this->read_column . " = $floodmin_value
                ");
                if ($db->affected_rows() == 0)
                {
                    // flood wait time is zero and no updated has happened,
                    // this means another post has already been made in this second
                    $this->flood_wait = $this->commit_value - $floodmin_value;
                }
                else
                {
                    $this->flood_wait = 0;
                }
            }
        }
ثالثا : ملف ( functions.php )

نبحث في داخله على :

كود:
return 'standard_redirect("' . $phrase . '", ' . intval($forceredirect) . ');';
نستبدله بالتالي :


كود:
return 'standard_redirect("' . $phrase . '", ' .  intval($forceredirect) . ', ' . ($bypasswhitelist ? 'true' : 'false') .  ');';
نبحث في داخله على :

كود:
function print_standard_redirect($redir_phrase, $doquery = true, $forceredirect = false, $languageid = -1)
نستبدله بالتالي :

كود:
function  print_standard_redirect($redir_phrase, $doquery = true,     $forceredirect = false, $languageid = -1, $bypasswhitelist = false)
رابعا : ملف ( init.php )

نبحث في داخله على :
كود:
if ($http_host AND $_SERVER['HTTP_REFERER'])
        {
            $http_host = preg_replace('#:80$#', '', trim($http_host));
            $referrer_parts = @parse_url($_SERVER['HTTP_REFERER']);
            $ref_port = intval($referrer_parts['port']);
            $ref_host = $referrer_parts['host'] . ((!empty($ref_port) AND $ref_port != '80') ? ":$ref_port" : '');

            $allowed = preg_split('#\s+#', $vbulletin->options['allowedreferrers'], -1, PREG_SPLIT_NO_EMPTY);
            $allowed[] = preg_replace('#^www\.#i', '', $http_host);
            $allowed[] = '.paypal.com';

            $pass_ref_check = false;
            foreach ($allowed AS $host)
            {
                if (preg_match('#' . preg_quote($host, '#') . '$#siU', $ref_host))
                {
                    $pass_ref_check = true;
                    break;
                }
            }
            unset($allowed);

            if ($pass_ref_check == false)
            {
                die('In order to accept POST request originating from     this domain, the admin must add this domain to the whitelist.');
            }
        }
    }
}
نستبدله بالتالي :

كود:
if ($http_host AND $_SERVER['HTTP_REFERER'])
        {
            $http_host = strtolower(preg_replace('#:80$#', '', trim($http_host)));
            $referrer_parts = @parse_url($_SERVER['HTTP_REFERER']);
            $ref_port = intval($referrer_parts['port']);
            $ref_host = strtolower($referrer_parts['host'] . ((!empty($ref_port) AND $ref_port != '80') ? ":$ref_port" : ''));

            if ($http_host == $ref_host)
            {    /* Instant match is good enough
                no need to check anything further. */
                $pass_ref_check = true;
            }
            else
            {
                $pass_ref_check = false;
                $allowed = array('.paypal.com');
                $allowed[] = '.'.preg_replace('#^www\.#i', '', $http_host);
                $whitelist = preg_split('#\s+#',     $vbulletin->options['allowedreferrers'], -1, PREG_SPLIT_NO_EMPTY);    //  Get whitelist
                $allowed =  array_unique(is_array($whitelist) ?    array_merge($allowed,$whitelist) :  $allowed); // Merge and   de-duplicate.

                foreach ($allowed AS $host)
                {
                    $host = strtolower($host);
                    if (substr($host,0,1) == '.' AND 
                    (preg_match('#' . preg_quote($host, '#') . '$#siU', $ref_host) OR substr($host,1) == $ref_host))
                    {
                        $pass_ref_check = true;
                        break;
                    }
                }
                unset($allowed, $whitelist);
            }

            if ($pass_ref_check == false)
            {
                die('In order to accept POST requests originating from     this domain, the admin must add the domain to the whitelist.');
            }
        }
    }
}



خامساً :
ملف ( version_vbulletin.php )

نستبدل محتواه بالتالي :

كود:
<?php
define('FILE_VERSION_VBULLETIN', '3.8.7 Patch Level 3');
?>
هذا ولله التوفيق لنا ولكم


المصدر : منتديات الريسي التطويرية