Перейти к контенту

Обновление безопасности в IPB 2.1.x (17.10.06)


Рекомендуемые сообщения

Вот тут написано, как вручную исправить уязвимость

Обновление безопасности в IPB 2.1.x (17.10.06)

 

Кусок кода из class_bbcode_core.php

else
{
 # Tricky.. match anything that's not a closing tag, or nothing
 preg_match_all( "#(\[$preg_tag\])((?!\[/$preg_tag\]).+?)?(\[/$preg_tag\])#si", $t, $match );

  for ($i=0; $i < count($match[0]); $i++)
  {
		 $tmp = $row['bbcode_replace'];
		 $tmp = str_replace( '{content}', $match[2][$i], $tmp );
		 $t   = str_replace( $match[0][$i], $tmp, $t );
   }
}

 

Написано, что после

preg_match_all( "#(\[$preg_tag\])((?!\[/$preg_tag\]).+?)?(\[/$preg_tag\])#si", $t, $match );

 

нужно вставить

if ( $row['bbcode_tag'] == 'snapback' )
{
$match[2][$i] = intval( $match[2][$i] );
}

 

Но цикла-то нет! Есть foreach выше по коду, но что-то мне подсказывает, что это не в кассу..

Может конечный код должен выглядеть так

else
{
 # Tricky.. match anything that's not a closing tag, or nothing
 preg_match_all( "#(\[$preg_tag\])((?!\[/$preg_tag\]).+?)?(\[/$preg_tag\])#si", $t, $match );

  for ($i=0; $i < count($match[0]); $i++)
  {
		 # Bug fix!
		 if ( $row['bbcode_tag'] == 'snapback' )
		 {
			 $match[2][$i] = intval( $match[2][$i] );
		 }

		 $tmp = $row['bbcode_replace'];
		 $tmp = str_replace( '{content}', $match[2][$i], $tmp );
		 $t   = str_replace( $match[0][$i], $tmp, $t );
   }
}

Ссылка на комментарий
Поделиться на других сайтах

Вы говорите чепуху. Вам следует ещё раз прочитать объявление о патче безопасности форума и выполнить исправление в файле строго соблюдая инструкцию, которая ясно и понятно предлагает алгоритм по устранению уязвимости.
Ссылка на комментарий
Поделиться на других сайтах

Ок ;) просто посмотрел кусок кода выше..

 

if ( $row['bbcode_useoption'] )
				{
					preg_match_all( "#(\[".preg_quote($row['bbcode_tag'], '#' )."=(?:"|&\#39;)?(.+?)(?:"|&\#39;)?\])(.+?)(\[/".preg_quote($row['bbcode_tag'], '#' )."\])#si", $t, $match );

					for ($i=0; $i < count($match[0]); $i++)
					{
						# XSS Check: Bug ID: 980
						if ( $row['bbcode_tag'] == 'post' OR $row['bbcode_tag'] == 'topic' )
						{
							$match[2][$i] = intval( $match[2][$i] );
						}

						$tmp = $row['bbcode_replace'];
						$tmp = str_replace( '{option}' , $match[2][$i], $tmp );
						$tmp = str_replace( '{content}', $match[3][$i], $tmp );
						$t   = str_replace( $match[0][$i], $tmp, $t );
					}
				}
				else
				{
					# Tricky.. match anything that's not a closing tag, or nothing
					preg_match_all( "#(\[$preg_tag\])((?!\[/$preg_tag\]).+?)?(\[/$preg_tag\])#si", $t, $match );

					for ($i=0; $i < count($match[0]); $i++)
					{
						$tmp = $row['bbcode_replace'];
						$tmp = str_replace( '{content}', $match[2][$i], $tmp );
						$t   = str_replace( $match[0][$i], $tmp, $t );
					}
				}

 

Ну почему чепуху? Использование $match[2][$i] предполагает наличие цикла, которого нет, если следовать вашему алгоритму.. :D

Ссылка на комментарий
Поделиться на других сайтах

Ну почему чепуху? Использование $match[2][$i] предполагает наличие цикла, которого нет, если следовать вашему алгоритму..

Это почему ж?

$match возврщает preg_match_all

а $row берётся из froreach намного выше

Ссылка на комментарий
Поделиться на других сайтах

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.