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

kikity_94

Registered
Здравейте хора
Вече не знам сигурно 2ри ден тъпча на едно и също място и не мога д аразбера как би могло да стане. Започнах да се ядосвам да ме боли главата и кви ли още не батаци :X
Значи проблема е следният. Написах си едно малко кодче което ми оцветява php кода, но проблема е, че не мога да д го съчетая със ббкода така когато има във теьтареата [*php] [/*php] Да оцветява кода само между таговете.
Ето го и кодът

PHP:
		<?php   			
			if(isset($_POST['submit'])) {
				$code = $_POST['php'];	
				$code = highlight_string($code, true);
				$code = explode("<br />", $code);
				$i = "1";
					foreach($code as $line => $value) {				
						if($i < 10) {
							echo "<font color='black'>0$i</font> $value <br />";
						} else {
							echo "<font color='black'>$i</font> $value <br />";
						}
						$i++;
					}
				$code = preg_replace("/\[php\](.+?)\[\/php\]/s", "$1", $code);
			}			
		?>

искам ето този preg_replace който е най-отдоло да се съчетае някак си това което се извежда в цикъла foreach. Опитах да присвоя в цикъла данните на променлива и по някакъв начин да ги въведа директно в ббкода, но пък ми даваше тогава други проблеми :S
 
Ти си го сложил, след като изкарваш информацията в браузъра на потребителбя.

Просто го сложи в цикъла ето така

PHP:
$value = preg_replace("/\[php\](.*?)\[\/php\]/s", "$1", $value);

Точно преди if-a. Не можеш да работиш в регекса с $code, защото вече не е стринг а низ, след като си го explod-нал. Може също да сложиш

PHP:
$code = preg_replace("/\[php\](.*?)\[\/php\]/s", "$1", $code);

Но преди explode-то ;)
 
Radko каза:
Ти си го сложил, след като изкарваш информацията в браузъра на потребителбя.

Просто го сложи в цикъла ето така

PHP:
$value = preg_replace("/\[php\](.*?)\[\/php\]/s", "$1", $value);

Точно преди if-a. Не можеш да работиш в регекса с $code, защото вече не е стринг а низ, след като си го explod-нал. Може също да сложиш

PHP:
$code = preg_replace("/\[php\](.*?)\[\/php\]/s", "$1", $code);

Но преди explode-то ;)

И каква е разликата между думата string и думата низ ? Защото аз мисля, че са едно и също нещо.
explode() ти връща масив от низове, а не прав низ.
 
Масив имах предвид, раното ставане си казва думата.

Важното е, че идеята е същата. След като го explod-не единствения вариант да махне
PHP:
 от масива е да обходи всеки елемент по отделно, но няма смисъл от това, като може да го направи или при изкарването, или преди explode.
 
Да ама не става ...
Проблема е там, че не искам да извеждам данните в цикъла защотот ще има и доста други неща тъй като това е малка част от системата която правя и искам някаде след цикъла да се извежда всичко
 
Обясни подробно кое не става. Пробва ли както ти казах, да сложиш регекса преди експлоде?
 
Остайте това ся изникна нещо друго :D
Направих кода малко по друг начин
PHP:
		<?php   

			function highlightphp($code) {
				$pattern[0] = "/\[php\](.+?)\[\/php\]/is";	
				$replace[0] = "".highlight_string("$1", true)."";
				$bbcode = preg_replace($pattern, $replace, $code);
				echo $bbcode;
			}
	
			if(isset($_POST['submit'])) {
				$code = $_POST['php'];					
				highlightphp($code);
			}		
		?>

Проблема е там, че в момента когато въведа някаф текст си излиза, когато въведа [*php]asdasdasd[*/php] примерно излиза само текста между таговете, но когато въведа php код между такогвете не излиза, но забележете! Когато погледна изходния код на страницата виждам php кодът който съм въвел между таговете... хммм това как може да се реши :D
 
Ето така ще се реши :
Вместо
$code = $_POST['php'];
го направи така

$code =addslashes(htmlspecialchars( $_POST['php']));
Така филтрираш входните данни :)

http://php.net/manual/en/function.highlight-string.php

Замени и този ред така във функцията :)
$replace[0] = "".highlight_string('$1', true)."";
 
работи в момента но не мога да разбера защо самият код не се оцветява ами стои целият в черно :S
 
Погледни ето тези два урока ще са ти от полза :)

http://web-tourist.net/login/login/view.php?st=2357

http://web-tourist.net/login/login/view.php?st=2396
Предполагам не си поставил тези неща :

PHP:
ini_set ('highlight.string', '#FF0000'); //red всички стрингове ще са в червено 
ini_set ('highlight.comment', '#FF9933'); //orange всички коментари ще са в оранжево 
ini_set ('highlight.keyword', '#009966'); //green всички запазени думи ще са в зелено 
ini_set ('highlight.bg', '#EEEEEE'); // gray бекграунда ще е сив 
ini_set ('highlight.default', '#6699CC'); //blue всички променливи и функции ще са в синьо 
ini_set ('highlight.html', '#000000'); //black всичко което е HTML код ще е в черно
 
kikity_94 каза:
работи в момента но не мога да разбера защо самият код не се оцветява ами стои целият в черно :S

Ако си послушал колегата от предния пост, не работи закото го минаваш през htmlspeacilchars. Не трябва да се минава през тази функия, защото фактически маха таговете и няма какво да оцвети.
 
Radko каза:
kikity_94 каза:
работи в момента но не мога да разбера защо самият код не се оцветява ами стои целият в черно :S

Ако си послушал колегата от предния пост, не работи закото го минаваш през htmlspeacilchars. Не трябва да се минава през тази функия, защото фактически маха таговете и няма какво да оцвети.
Да така е но става открит от към XSS ! За да се защити ще му трябва регулярен израз който филтрира всички опасли знаци и ги минава в htmlspecialchars, но да прави изключение на таговете <?php ?> или нещо подобно, защото това което прави е много опасно ако не бъде защитено :)
 
dakata__92 каза:
Radko каза:
kikity_94 каза:
работи в момента но не мога да разбера защо самият код не се оцветява ами стои целият в черно :S

Ако си послушал колегата от предния пост, не работи закото го минаваш през htmlspeacilchars. Не трябва да се минава през тази функия, защото фактически маха таговете и няма какво да оцвети.
Да така е но става открит от към XSS ! За да се защити ще му трябва регулярен израз който филтрира всички опасли знаци и ги минава в htmlspecialchars, но да прави изключение на таговете <?php ?> или нещо подобно, защото това което прави е много опасно ако не бъде защитено :)

Защитите ги остави знам как да си защитя скриптовете в момента се опитвам само да го накрам да работи както трябва, но просто не иска и не иска.
Така написан кода работи, но когато има php код между таговете просто него оцветява
PHP:
		<?php   

			function highlightphp($code) {
				$pattern[0] = "/\[php\](.+?)\[\/php\]/is";	
				$replace[0] = "".highlight_string('$1', true)."";
				$bbcode = preg_replace($pattern, $replace, $code);
				echo $bbcode;				
			}		
			if(isset($_POST['submit'])) {
				$code = nl2br(htmlspecialchars($_POST['php']));					
				highlightphp($code);
			}		
		?>
 
if(isset($_POST['submit'])) {
$code = nl2br(htmlspecialchars($_POST['php']));
highlightphp($code);
}
Това в червено то премахни и пробвай !
заменя тези тагове <> с техните еквиваленти < изключих как беха и вместо в HTML кода да се покаже <?php //nesho ?> и да се изпълни, се показва така <?php //nesho ?&ld; като така кода не се изпълнява, но се визуализира в браузера.
Защо ползваш и масив за $replace[0], $pattern[0] като можеш директно да си ги подадеш $replace,$pattern . При функцията ползвай return ако ползваш надолу променливата :

PHP:
function highlightphp($code) {
$bbcode = preg_replace("/\[php\](.+?)\[\/php\]/is", "$1", $code);
$bbcode = highlight_string('$bbcode', true);	
return $bbcode // или както ти си го направил echo $bbcode;			
}	

echo $bbcode;// ako polzvash return
 
Е, ако ми кажете как през highlight_string ще се направи XSS атака ви признавам. Нали всичко се превръща в plain text. Не е изпълним за браузъра код. Няма как да набуташ XSS.
 
TryMe каза:
Е, ако ми кажете как през highlight_string ще се направи XSS атака ви признавам. Нали всичко се превръща в plain text. Не е изпълним за браузъра код. Няма как да набуташ XSS.
Ти глобално ли мислиш за текста или само за фукцията ? В случая при него до колкото виждам трябва да премахнe за подаването на текста htmlspecialcharts, заради казаното от теб, но щом трябва да бъде премахнато текста извън таговете тук[\php][\php\]тук ще стане уязвим ! Цаката е че може да използва във функцията htmlspecialchars_decode() преди да подаде променливата за оцветяване, тоест ще декодне текста между таговете само, което като се замисля е добар вариант :) С тези bbcod-ове съм изчел и пробвал толкова много вариянти, че защитата трябва да е на невероятно ниво за да не се опариш :) Примерно за да проработи в момента при него ако се махне htmlspecialcharts ще върне таговете така от формата <> при което ще може да оцвети текста и да го изведе без проблеми, но предполагам не става дума само за този bbcode и за това трябва да помисли доста как да си подреди нещата ! Дори с тази функция htmlspecialchars в bbcode може да с е вкара XSS, ако не си си поиграл с регуляпните изрази :) Често срещан проблем при вкарване на линкове към сайт или изображения и много други :) По-сигорен вариянт е да използва Jquery за да оцветява :)
 
Вмесо highlight_string('<?php phpinfo(); ?>'); да изведе нещо от сорта на

<code><font color="#000000">
<font color="#0000BB"><?php phpinfo</font><font color="#007700">(); </font><font color="#0000BB">?&gt;</font>
</font>
</code>

се получава така :

highlight_string('<?php phpinfo(); ?>');
eдвали ще изкара :

<code><font color="#000000">
<font color="#0000BB">&ltlt;?php phpinfo</font><font color="#007700">(); </font><font color="#0000BB">?&gtgt;</font>
</font>
</code>
 
Не можах да разбера какъв е проблема?

PHP:
<?php   

function highlight($string){
	
	if(preg_match("#\[php\](.*?)\[\/php\]#is", $string, $out)){
		highlight_string($out[1]);
	}
	return;
}

if(isset($_POST['submit'])){
	highlight($_POST['php']);
}  
?>
<form action="" method="post">
<input type="text" name="php" />
<input type="submit" name="submit" value="Send" />
</form>

Ако обичаш дай ми успешна XSS атака.
 
Ти прочете ли какво съм написал ?

Ако така ще въвеждаш в базата незнам нооо нищо не ми пречи да направя така :

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

Eto link
PHP:
<?php // hhehee ?>

Таговете функцията ти ги променя не съм казал, че не го прави точно обратното, въпроса е че не трябва да вкарвам код между кода, че да го филтрира функцията за оцветяване ако е така няма да проработи :

[*php]<?php <a href='blablalink'>Eto link</a> // hhehee ?>[*/php]
 
dakata__92 каза:
Ти прочете ли какво съм написал ?

Ако така ще въвеждаш в базата незнам нооо нищо не ми пречи да направя така :

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

Eto link
PHP:
<?php // hhehee ?>


Добре, дай ми успешна атака на моя код. Слагай в MySQL, както съм го дал и да видим теорията ти. Аз ти давам практически пример, ти тествай и ми дай успешна XSS атака.


Хубаво обърни внимание на кода ми и си направи извода дали въобще това "<a href....>" ще остане на мястото си.

А вече въпроса "какво иска той точно" си остава в минало време. Да покаже какво и как ще се въвеждат данните и ще се коригира кода, както той иска и пак ще го дам без използването на htmlspecialchars.



ЕДИТ: А ето и код, който ще му позволи да си ползва така "текст текст [*php]<?php echo "asd"; ?>[*/php] текст текст текст"

PHP:
<?php   

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

if(isset($_POST['submit'])){
	highlight($_POST['php']);
}  
?>
<form action="" method="post">
<input type="text" name="php" />
<input type="submit" name="submit" value="Send" />
</form>
 

Back
Горе