Проблем със bbcode и оцветяване на php код

Хехехе май не ме четеш но както и да е я вземи подай на твоя код
текст[*php]<?php //neshto ?>[*/php] и ми кажи този червен текст каде отива :D За XSS кво да ти кажа все едно си минал през htmlspecialcharts това го обеснявам от половин час с по-горните си постове, но както казах ако си поиграеш със регулярните изрази се получава :D Я махни добавките с # и пак ще си говорим :) Въпроса е принципен се както си описъл горе в прег реплейса върнеш $1 ако този долар е украсен <a href="$1"></a> може да се прават олелий :) Всичко е до писането, а не до говоренето в конкретния случай който е подал автора казвам каквото виждам :)
 
Абе човек, стига говори празни приказки и ми тествай кода. Подавай каквото пожелаеш, аз чакам XSS атака от теб. На теория си говори, аз давам практически пример, на който чакам да му дадеш XSS атака.



http://79.132.12.122/kikity-wt2.php

Ето, подавай каквото си искаш, вкарвай в базата данни. Всичко отдолу под полето е изведено от базата данни.
Направи XSS атака и ми дай скрийншот, та да се разберем.



Кода е този:

PHP:
<?php   
$link = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("test", $link) or die(mysql_error());

function highlight($string){
	
	$code = preg_replace("#\[php\](.*?)\[\/php\]#is", "$1", $string);
	highlight_string($code);
}

if(isset($_POST['submit'])){
	highlight($_POST['php']);
	mysql_query("INSERT INTO `test`(`pics`, `links`, `times`) VALUES('', '', '{$_POST['php']}')") or die(mysql_error());
}  
?>
<form action="" method="post">
<textarea name="php" style="width: 500px; height: 200px;"></textarea>
<input type="submit" name="submit" value="Send" />
</form>

<?php

$query = mysql_query("SELECT `times` FROM `test`");

while($row = mysql_fetch_assoc($query)){
	echo highlight($row['times']) . "<br />";
}

Чакам XSS.
И да подчертая... не се дразня, а просто си доказвам това, което казвам. Сега ти докажи твоето, за да не бъркаш друг път колегите от форума.
 
Ти май говориш празни приказки и си филосовстваш ! И аз мога да ти дам код с регулярен израз който да матчва само между определените тагове, тааа къде чу да съм казал, че мога да ти вкарам XSS през highlight_string която филтрира <> и "" и други ? С промени всичко става и на луната ще кацнем, този спор с теб е напълно безсмислен, поради 2 причини едната е че оспамваме темата, другата е че си подал вече променен regex което променя коренно нещата ! Предопредих автора какво да чака при подадените от него параметри на регулярния израз /\[php\](.+?)\[\/php\]/is :shock: Проблема при него е както вече за сетен път ще обясна htmlspecialchars защото подава вече променено съдържание на <> и неможе да бъде оцветено от highlight_string . Защитите са в друга тема специално съсдадена с тази цел и моля прочети ми постовете и кажи къде съм казал, че мога да въведа там XSS. :idea:
 
dakata__92 каза:
Ти май говориш празни приказки и си филосовстваш ! И аз мога да ти дам код с регулярен израз който да матчва само между определените тагове, тааа къде чу да съм казал, че мога да ти вкарам XSS през highlight_string която филтрира <> и "" и други ? С промени всичко става и на луната ще кацнем, този спор с теб е напълно безсмислен, поради 2 причини едната е че оспамваме темата, другата е че си подал вече променен regex което променя коренно нещата ! Предопредих автора какво да чака при подадените от него параметри на регулярния израз /\[php\](.+?)\[\/php\]/is :shock: Проблема при него е както вече за сетен път ще обясна htmlspecialchars защото подава вече променено съдържание на <> и неможе да бъде оцветено от highlight_string . Защитите са в друга тема специално съсдадена с тази цел и моля прочети ми постовете и кажи къде съм казал, че мога да въведа там XSS. :idea:


Ами поне като си променяш постовете слагай едно ЕДИТ, та да се види, че си дописал нещо. Сега ги прочетох отново и някои постове са ти дописани. Аз чета един след друг постовете, не се връщам назад.

Но все пак обясни ми това:

<a href='blablalink'>Eto link</a>[*php]<?php // hhehee ?>[*/php]
и ще се покаже така :

Въпроса е принципен се както си описъл горе в прег реплейса върнеш $1 ако този долар е украсен <a href="$1"></a> може да се прават олелий

Обясни как и какви олелии ще станат с това.

А и аз никъде не съм направил защита на кода. Кода си е написан правилно, а един правилно написан код, не са му нужни защити.



ЕДИТ: Ако искаш дай на лични да не оспамваме допълнително на човека темата.
 
Както виждам и ти си дописваш защото и аз чета по твоя начин ! Въпросното нещо от първия цитат се отнасяше за примера с регулярния израз на автора, не видях че с ипостнал с променен regex . За втория цитата в по-преден пост съм обяснил, за проблеми и отворени вратички за XSS при подаване на изображения и линкове с недобре направени регулярни изрази
preg_replace('/\[url\=(.+?)\](.+?)\[\/url\]/is','<a href="$1" rel="nofollow" target="_blank">$3</a>',$code);

Ето просто примерче какво ще се покаже в някой браузери :
<a href="javascript:alert(blabla);" rel="nofollow" target="_blank">Link</a>
 
TryMe каза:
Абе човек, стига говори празни приказки и ми тествай кода. Подавай каквото пожелаеш, аз чакам XSS атака от теб. На теория си говори, аз давам практически пример, на който чакам да му дадеш XSS атака.



http://79.132.12.122/kikity-wt2.php

Ето, подавай каквото си искаш, вкарвай в базата данни. Всичко отдолу под полето е изведено от базата данни.
Направи XSS атака и ми дай скрийншот, та да се разберем.



Кода е този:

PHP:
<?php   
$link = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("test", $link) or die(mysql_error());

function highlight($string){
	
	$code = preg_replace("#\[php\](.*?)\[\/php\]#is", "$1", $string);
	highlight_string($code);
}

if(isset($_POST['submit'])){
	highlight($_POST['php']);
	mysql_query("INSERT INTO `test`(`pics`, `links`, `times`) VALUES('', '', '{$_POST['php']}')") or die(mysql_error());
}  
?>
<form action="" method="post">
<textarea name="php" style="width: 500px; height: 200px;"></textarea>
<input type="submit" name="submit" value="Send" />
</form>

<?php

$query = mysql_query("SELECT `times` FROM `test`");

while($row = mysql_fetch_assoc($query)){
	echo highlight($row['times']) . "<br />";
}

Чакам XSS.
И да подчертая... не се дразня, а просто си доказвам това, което казвам. Сега ти докажи твоето, за да не бъркаш друг път колегите от форума.

С този пример забелязали, че когато се въведе някакъв php код в текстареата и ако той не е м-у ббкод тага пак се оцветява а това също се опитвам да избегна!
 
dakata__92 каза:
Както виждам и ти си дописваш защото и аз чета по твоя начин ! Въпросното нещо от първия цитат се отнасяше за примера с регулярния израз на автора, не видях че с ипостнал с променен regex . За втория цитата в по-преден пост съм обяснил, за проблеми и отворени вратички за XSS при подаване на изображения и линкове с недобре направени регулярни изрази
preg_replace('/\[url\=(.+?)\](.+?)\[\/url\]/is','<a href="$1" rel="nofollow" target="_blank">$3</a>',$code);

Ето просто примерче какво ще се покаже в някой браузери :
<a href="javascript:alert(blabla);" rel="nofollow" target="_blank">Link</a>

Е, тука вече отиваме в друга сфера. Вече в тоя случай опира до това как ти е написан израза. Но относно темата, автора питаше за конкретно php таговете. Вече другите bb кодове, как са му написани, мен не ме интересува, защото не е по темата.

Край на спора.
 
Теб може да не те засяга но аз му давам савет какво ще стане при дадените случаи ,за да си прави сметка с което слагам край на темата защото и двамата прекалихме. :D
 
kikity_94 каза:
С този пример забелязали, че когато се въведе някакъв php код в текстареата и ако той не е м-у ббкод тага пак се оцветява а това също се опитвам да избегна!
Получава се защото пък нямаш htmlspecialchars което оставя текста в непромемено съдържание, затова казах във функцията че е добре само там да се ползва htmlspecialchars_decode() при което ще се получи желания от теб ефект :)
 
PHP:
function highlightphp($code) {
global $bbcode;
$bbcode = preg_replace("/\[php\](.+?)\[\/php\]/is", "$1", $code);
$bbcode = highlight_string('$bbcode', true);   
return $bbcode ;                   
}       
if(isSet($_POST['tex']))
{
$bbcode=  highlightphp($_POST['tex']);
}
if(isset($bbcode))
{
$bbcode = htmlspecialchars($bbcode);
echo '$bbcode';
}
//Офф пиша глупости вече ...

PHP:
function highlightphp($code) {
$bbcode = htmlspecialchars_decode($code[1]);
$bbcode = highlight_string('$bbcode', true);   
return $bbcode ;                   
}   
if(isSet($_POST['tex']))
{
$bbcode=  htmlspecialchars($_POST['tex']);
$bbcode= preg_replace_callback("/\[php\](.+?)\[\/php\]/is","highlightphp",$bbcode);
echo '$bbcode';
}
ЕДИТНАТО //
 
PHP:
function highlight($string){
	
	if(preg_match("#\[php\](.*?)\[\/php\]#", $string)){
		$string = preg_replace("#\[php\](.*?)\[\/php\]#is", "$1", $string);
		highlight_string($string);
	}
	else{
		$string = "<xmp>" . $string . "</xmp>";
	}
	
	echo $string;
}

if(isset($_POST['submit'])){
	highlight($_POST['php']);
}  
?>
<form action="" method="post">
<textarea name="php" style="width: 500px; height: 200px;"></textarea>
<input type="submit" name="submit" value="Send" />
</form>

Но това не е истинското решение, което трябва да е. В момента ме мързи за оптимизации.
 
Така методите на Try ми помогнаха до някаде, но имам още 1 въпрос.
Погледнете как си направих кода
PHP:
		<?php   
			function highlightphp($code) {
				if(preg_match("/\[php\](.+?)\[\/php\]/is", $code)){
					$code = htmlspecialchars_decode($code);
					$code = preg_replace("/\[php\](.+?)\[\/php\]/is", "$1", $code);
					$code = highlight_string($code);
				} else {
					$code = "<xmp>". $code ."</xmp>";
				}			
				echo $code;
			}
		
			if(isset($_POST['submit'])) {	
				highlightphp(htmlspecialchars($_POST['php']));
			}		
		?>

Когато въведа php код в текстареата той се извежда така <?php съответно него оцветява и когато въведа код между таговете се оцветява, точно както исках, но забелязах ми излиза под кода някакво число (1). Просто под кода има някаква единица и нз от каде идва. И това е само когато има [*php][*/php]
 
highlight_string не трябва да се присвоява или извежда чрез echo. Остави highlight_string самостоятелно, както аз съм направил. И в моя случай, както е кода, не е нужно да добавяш htmlspecialchars и след това да декодваш. Излишно е. Няма да ти вкарат XSS, спокойно.
 
Не това беше проблема ами трябваше да добавя и втoрият аргумент на highlight_string съответно true. И минавам полето през htmlspecialchars първо и после декодвам защото ако няма [*php][*/php] тогава може да се правят други мизерии без значение какви и затова декодвам само там където има [*php][*/php] Точно това което се опита да ти обесни @dakata.
 
kikity_94 каза:
Не това беше проблема ами трябваше да добавя и втoрият аргумент на highlight_string съответно true. И минавам полето през htmlspecialchars първо и после декодвам защото ако няма [*php][*/php] тогава може да се правят други мизерии без значение какви и затова декодвам само там където има [*php][*/php] Точно това което се опита да ти обесни @dakata.


За този случай съм съгласен, защото ти искаш само между [*php] таговете да си highlight. Иначе преди това не можеше да се говори за тези функции.
 
Добре сега искам да попитам друго има ли някаква възможност да преброя редовете които са highlight-нати. Ето какво опитвам, но не мога да наредя бройката на редовете срещу всеки ред

//EDIT:

Направих го с foreach и стана, но може ли да ми кажете как мога да направя така, че да не брои и това [*php][*/php]

PHP:
		<?php   
			function highlightphp($code) {
				if(preg_match("/\[php\](.+?)\[\/php\]/is", $code)){
					$code = htmlspecialchars_decode($code);					
					$code = preg_replace("/\[php\](.+?)\[\/php\]/is", "$1", $code);
					$code = highlight_string($code, true);	
					$codeE = explode("<br />", $code);
					$count = 1;
					foreach($codeE as $line => $code) {
						if($count < 10) {
							echo "<font color='black'>0".$count."</font>".$code."<br />";
						} else {
							echo "<font color='black'>".$count."</font>".$code."<br />";
						}
						$count++;
					}
				} else {
					$code = "<xmp>". $code ."</xmp>";
					echo $code;
				}			
			}
		
			if(isset($_POST['submit'])) {	
				highlightphp(htmlspecialchars($_POST['php']));
			}		
		?>

Защото сега когато въведа примерно код от 5 реда да кажем показва от 1 до 7 редове, като 1 и 7 ми ред пред тях няма нищо и стоят празни.
 
А 100% ли е сигурно, че примерно няма да въведеш:

[*php]...[*/php] - да са на един ред имам предвид ? Иначе преспокойно можеш да си махнеш първия и последния елемент.

PHP:
unset($elements[0]);
unset($elements[count($elements) - 1]);

или използвай array_shift() за изкарване на първия елемент, и array_pop() да изкараш последния елемент.
 
kikity_94 каза:
Да но нещо не мога да разбера къде да ги ръгна тези unset-и :S

След $codeE = explode("<br />", $code);


PHP:
$codeE = explode("<br />", $code);

unset($codE[0]); #трием първият елемент
unset($codE[count($codE) - 1]); #трием последният елемент

А не мога да разбера този $count какво ти брои ?
 
http://web-tourist.net/forum/viewtopic.php?t=119594&postdays=0&postorder=asc&highlight=ol+li&start=0

Прочети тази тема точно по въпросите ти е ! Вътре доста хора са отговорили пооо много интересни начини на въпросите ми преди време, ноо да ти кажа се оказаха прави че това ти е напълно ненужно усложнение :)
<OL>
<li></li>
</OL>
Това ти е възможно най-точното решение -

somebody каза:
PHP:
$text = "[code]sdsadsadsa<br />
asdads<br />
dsaasd
[/code]";
function br2nl($matches)
   {        
      $text = preg_replace('/<br \/>/','',$matches[1]); 
	  preg_match_all('/.+[\r\n]?/', $text, $match);
	  $text = '<ol>';
	  foreach($match[0] as $value) {
		$text.='<li>'.$value.'</li>';
	  }
	  $text.='</ol>';
      return '<table><tr><td width="15px"></td><td><pre class="prettyprint">'.$text.'</pre></td></tr></table>';
   }
   //Викане на функцията br2nl.
   echo $text = preg_replace_callback('/\[code](.*?)\[\/code]/is','br2nl',$text);
 

Back
Горе