Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: XSS tietoturva ja muuta

mika132 [21.07.2010 18:56:11]

#

Eli minulla on tälläinen funktio kutsu ja funktio PHP:llä tehty

<?php
function siivoa_syote($syote){

	$syote = get_magic_quotes_gpc() ? $syote : mysql_real_escape_string($syote);
	$syote = strip_tags($syote);
	$syote = htmlspecialchars($syote);
	$syote = trim($syote);

    return $syote;
}

siivoa_syote($msg);
?>

mutta se ei estä HTML tagien laittamista. Ja se vielä tulostaa ne.

Teuro [21.07.2010 19:17:21]

#

Pelkkä funktiokutsu ei riitä, vaan tulos tulee sijoittaa johonkin muuttujaan ennen käsittelyä. strip_tags funktio on ehkä tarpeeton.

Metabolix [21.07.2010 19:22:10]

#

Lisäksi teet kaksi aivan eri asiaa samalla kertaa. Escapetus (mysql_real_escape_string) pitää tehdä ennen tietokantaan tallentamista ja htmlspecialchars vasta ennen tulostamista sivulle. Toki nämä on mahdollista tehdä samallakin kertaa, mutta yleensä on tyhmää tallentaa tietokantaan valmiiksi käsiteltyä dataa, jos on pienikin mahdollisuus, että sitä haluttaisiin muokata vielä myöhemmin.

mika132 [21.07.2010 19:54:02]

#

Juu, mut jos teen noin ni se ei mee yksiin mun BBC koodi enginen kans. :o

<?php
function siivoa_syote($msg){
	$msg = str_replace("\n", "<br>", $msg);
	$msg = str_replace("[B]", "<b>", $msg);
	$msg = str_replace("[/B]", "</b>", $msg);
	$msg = str_replace("[I]", "<i>", $msg);
	$msg = str_replace("[/I]", "</i>", $msg);
	$msg = str_replace("[U]", "<u>", $msg);
	$msg = str_replace("[/U]", "</u>", $msg);
	$msg = str_replace("[b]", "<b>", $msg);
	$msg = str_replace("[/b]", "</b>", $msg);
	$msg = str_replace("[i]", "<i>", $msg);
	$msg = str_replace("[/i]", "</i>", $msg);
	$msg = str_replace("[u]", "<u>", $msg);
	$msg = str_replace("[/u]", "</u>", $msg);
	$msg = str_replace("[CENTER]", "<center>", $msg);
	$msg = str_replace("[/CENTER]", "</center>", $msg);
	$msg = str_replace("[center]", "<center>", $msg);
	$msg = str_replace("[/center]", "</center>", $msg);
	$msg = str_replace("[/url]", "</a>", $msg);
	$msg = str_replace("[url=", '<a href="', $msg);
	$msg = str_replace("[/URL]", '<a href="', $msg);
	$msg = str_replace("[URL=", '<a href="', $msg);
	$msg = str_replace("]", '">', $msg);
	$msg = get_magic_quotes_gpc() ? $msg : mysql_real_escape_string($msg);
	$msg = strip_tags($msg);
	$msg = htmlspecialchars($msg);
	$msg = trim($msg);

	return $msg;
}



?>

Ei näy vahvennuksia yms. Syy on tietysti se, että tuo loppu järjestelmä estää sen, mutta mikä neuvoksi.

trilog [21.07.2010 20:22:11]

#

mika132 kirjoitti:

Syy on tietysti se, että tuo loppu järjestelmä estää sen, mutta mikä neuvoksi.

Mieti, mitä koodi tekee. Katso vaikka PHP.netistä, mitä mikäkin funktio tekee. Missä vaiheessa korvaukset pitää tehdä?

https://www.php.net/strip_tags
(https://www.php.net/htmlspecialchars)

Teuro [21.07.2010 23:43:27]

#

Eihän BBcodea ajeta käyttäjän syötteen siivouksen aikana? Sehän tulisi ajaa vasta kun halutaan tulostaa kamaa näytölle. Jos katsos ensin muunnat käyttäjän tekemätä muotoilut html-tageiksi ja sitten poistat ne, niin olisiko jossakin kohdassa hiukan korjaamista. Sanoin jo yllä, että strip_tags funktio on turha tuossa, kun kerran ajat htmlspecialchars funktion.

Metabolix [22.07.2010 13:21:20]

#

mika132 kirjoitti:

Juu, mut jos teen noin ni se ei mee yksiin mun BBC koodi enginen kans. :o

Silloinhan se nimenomaan menee, kunhan ajat myös BBCode-jutut vasta tulostusvaiheessa. (Edelleen sama perustelu: eihän viestiä voi muokata, jos sen BBCode-tagit on jo muutettu HTML:ksi!)

Ja ota nyt järki käteen tuon funktioiden järjestämisen kanssa, kuten jo trilog sanoikin. Inspiraatiota ongelman korjaamiseen voit hakea seuraavasta yksinkertaistetusta versiosta:

<?php
$x = 1;
$x = 2;
echo $x; /* Miksei tämä tulosta 1? */

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta