webForumDet fria alternativet

Räcker detta som skydd mot databasinjektioner?

PHP

7 svar · 736 visningar · startad av vic

Medlem sedan apr. 2006244 inlägg
Frågan#1

Som rubriken lyder, fungerar detta:

function db_escape($post)
	{
	if(is_string($post))
   		{
		if(get_magic_quotes_gpc()) 
	 		{
			$post = stripslashes($post);
			}
     
	 	return mysql_real_escape_string($post);
   		}

	foreach($post as $key => $val) {$post[$key] = db_escape($val);}
	return $post;
	}

/// PREVENT INJECTIONS
if(isset($_POST))
	{
	$_POST = db_escape($_POST);
	}

Bör jag ha med något mer?

Medlem sedan juni 200454 inlägg
#2

Det där bör räcka finfint!

Medlem sedan juni 20008 205 inlägg
#3

Det känns en aning suboptimalt att eskejpa alla värden i _POST, både prestandamässigt (mindre problem) och principiellt (större problem) - det är att angripa problemet från fel håll.

För det första ändrar du på all indata vilket kan ställa till det på andra ställen.

För det andra pajar det lokaliteten i koden - när du tittar på de rader som faktiskt interagerar med databasen kan du inte garantera att frågorna är säkra, utan måste kolla någon annanstans att du verkligen kört alla värden genom db_escape.

För det tredje är det inte nödvändigtvis säkert. http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html

Kort sagt, prepared statements är det enda rätta. Funkar dock ej i PHP 4 för MySQL, vilket är nära nog kriminellt dåligt.

Medlem sedan juni 20014 421 inlägg
#4

det ska ju vara fixat enligt mysqls hemsida:
http://dev.mysql.com/doc/refman/5.0/en/news-5-0-22.html

Medlem sedan juni 20008 205 inlägg
#5

Det är dock fortfarande sämre att eskejpa själv än att använda prepared statements :)

Medlem sedan apr. 2006244 inlägg
#6

förstår dock inte vad du menar med prepared statements? Alla formulär interagerar med databasen, därför escapar jag alla $_POST

Medlem sedan juni 20008 205 inlägg
#7

vic skrev:

förstår dock inte vad du menar med prepared statements?

Prepared statements, parametriserade frågor, går ut på att man inte stoppar in värdena direkt i SQL-frågan. Har diskuterats livligt i ASP-forumet men mindre här. Det är, i princip, det enda sättet att hundraprocentigt skydda sig mot SQL-injektion. Dessutom ger det portablare kod och är enklare att använda.
http://www.php.net/manual/sv/function.mysqli-prepare.php

vic skrev:

Alla formulär interagerar med databasen, därför escapar jag alla $_POST

Ja, men det har inget med saken att göra. Det är inget som garanterar att det kommer vara så i framtiden, och det kräver fortfarande att du kommer ihåg att göra det.

Medlem sedan apr. 2006244 inlägg
#8

spango skrev:

Prepared statements, parametriserade frågor, går ut på att man inte stoppar in värdena direkt i SQL-frågan. Har diskuterats livligt i ASP-forumet men mindre här. Det är, i princip, det enda sättet att hundraprocentigt skydda sig mot SQL-injektion. Dessutom ger det portablare kod och är enklare att använda.
http://www.php.net/manual/sv/function.mysqli-prepare.php

Ok, får ta mig tid och titta igenom det...

spango skrev:

Ja, men det har inget med saken att göra. Det är inget som garanterar att det kommer vara så i framtiden, och det kräver fortfarande att du kommer ihåg att göra det.

hehe, nä jag kan inte veta med säkerhet att det kommer vara så för all framtid på denna webbplats men jag vet att det kommer vara så under en viss tid (då vi ansvarar för det hela), om projektet sen anses hållbart, kommer nog mycket av systemet att göras om, det råder tidsbrist i nuläget!

252 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
115 ms — ändringar (db)