Sicherheitscheck bei Variablen in SQL-Abfrage

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2454
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Sicherheitscheck bei Variablen in SQL-Abfrage

Beitrag 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!
Benutzeravatar
larsneo
Mitglied
Beiträge: 2622
Registriert: 07.03.2002 15:23
Wohnort: schwäbisch gmünd
Kontaktdaten:

Beitrag 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...
gruesse aus dem wilden sueden
larsneo
..::[krapohl.net]::..
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2454
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag 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ß!
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag 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 = ...
KB:knigge
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2454
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag 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...
Antworten

Zurück zu „Coding & Technik“