Seite 1 von 1

Sicherheitscheck bei Variablen in SQL-Abfrage

Verfasst: 29.03.2006 22:06
von Gumfuzi
Hallo!

Ich habe im Userprofil ein Feld gemacht, wo man Foren-ID's eingeben kann, die dann als Variable " AND NOT IN (xx, xxx, xxxx)" in die SQL-Abfrage eingefügt werden - um gewisse Foren bei den "Beiträgen seit dem letzten Besuch" je nach Userwünsche auszuschlueßen.

Das funzt soweit auch gut, aber da ja in der Variable theoretisch alles stehen kann, will ich vor dem Einfügen der Variable in das SQLkommando eine Prüfung machen, daß da auch nur Zahlen und "," drin sind bzw. kein böser Code sich einschleichen kann (und daß nicht eine Fehlermeldung kommt, nur weil da flasche Buchstaben oder sonstwas drin steht)

Wie mache ich das am besten / einfachsten?

Danke für eure Tipps!

Verfasst: 29.03.2006 22:42
von larsneo
nachdem imho die einzelbestandteile xx, xxx und xxxx ja wohl nur numerisch sein können, ist 'is_numeric' als prüfung bzw. 'int' als typecasting vielleicht schon einmal ein ansatz...

Verfasst: 29.03.2006 23:56
von Gumfuzi
Danke vielmals!

... also ich habe nun rumprobiert, aber es will einfach nicht:

Code: Alles auswählen

				if ( $userdata['session_logged_in'] )
				{
					if ($userdata['suchfilter'] <> "")
					{
						$sf_error = 0;
						$sf_array = array();
						$sf = $userdata['suchfilter'];
						echo $sf;
						$sf_array = explode(",", $sf);
						$co = 0;
						while ($sf_array[$co] <> "")
						{
							if (!is_numeric($sf_array[$co]))
							{
								$sf_error = 1;
							}
						}
						if ($sf_error == 0)
						{
							$suchfilter = " AND forum_id NOT IN (" . $userdata['suchfilter'] . ")";
						}
					}
					$sql = "SELECT post_id, forum_id 
						FROM " . POSTS_TABLE . " 
						WHERE post_time >= " . $userdata['user_lastvisit'] . $suchfilter;
				}
$sf ist "2,89", das wird auch ausgegeben, aber dann kommt eine Zeitüberschreitung bei der Zeile "if (!is_numeric($sf_array[$co]))"

Wo habe ich hier den Denkfehler? ich komm einfach nicht drauf...

Danke für Deine kurze Hilfe bzw. den kurzen Denkanstoß!

Verfasst: 30.03.2006 00:32
von Pyramide

Code: Alles auswählen

if(!empty($userdata['suchfilter'])) {
  $suchfilter = explode(',', $userdata['suchfilter']);
  for($i=0; $i<count($suchfilter); $i++) {
    $suchfilter[$i] = intval($suchfilter[$i]);
  }
  $suchfilter = $suchfilter = ' AND forum_id NOT IN (' . implode(', '$suchfilter) . ')';
}
$sql = ...

Verfasst: 30.03.2006 16:53
von Gumfuzi
Hi Pyramide,

Danke vielmals!!
Habe noch das fehlende Komma bei implode() hinzugefügt, dann funzte es:

Code: Alles auswählen

if(!empty($userdata['suchfilter']))
{
	$suchfilter = explode(',', $userdata['suchfilter']);
	
	for($i=0; $i<count($suchfilter); $i++)
	{
		$suchfilter[$i] = intval($suchfilter[$i]);
	}
  $suchfilter = ' AND forum_id NOT IN (' . implode(", ", $suchfilter) . ')';
} 
Sehr schön, daß es noch einfacher (mit weniger Code) geht...