Wie sicher ist is_numeric?

alex130

Erfahrenes Mitglied
Hi
Ich habe eine Frage und zwar, wie sicher ist folgender Code:
PHP:
if(!is_numeric($_GET['id']))
{
echo "Keine gültige ID!";
}
gegen SQL Injections?
danke
 
Dass kann ich so nicht sagen, aber wenn du dir nicht sicher bist, kannst du ja noch mit mysql_real_escape_string(), preg_match und den anderen vielen Möglichkeiten die es gibt hinterherrennen und prüfen, ob nur Zahlen drin sind.
 
Ja das hab ich eh zusätzlich auch noch, aber gibts sonst noch eine Möglichkeit für eine SQL Injection? Also ohne id= .....?
lg
 
Du könntest es auch is_int benutzen, weil dort werden nur Ganzzahlen akzeptiert, also SQL Injection können durch $_GET Variablen sowie auch von $_POST Variablen, deswegen würde ich einfach alle Variablen die du in ein mysql_query schreibst maskieren.
 
Vorsicht: is_int() prüft auf einen Datentyp der Sprache PHP (Integer/Ganzzahl) während is_numeric() eine Datendomäne prüft, nämlich die Datendomäne der Zahlendarstellungen, also Zahlendarstellungen jeglichen Formats (oktale, dezimale, hexadezimale und exponentielle Schreibweise) und Datentyps (Ganzzahl, Realzahl, Zeichenkette).
Hier ein Beispiel zur Verdeutlichung:
PHP:
$data = array(
	1,      // Integer 1
	0,      // Integer 0
	-1,     // Integer -1
	01,     // Integer 1 (octal)
	0x1,    // Integer 1 (hex)
	0.0,    // Double 0
	1.0,    // Double 1
	0e0,    // Double 0
	1e-0,   // Double 1
	1e123,  // Double 1.0E+123
	'1',    // String '1'
	'0',    // String '0'
	'-1',   // String '-1'
	'01',   // String '01'
	' 1',   // String ' 1'
	'0.0',  // String '0.0'
	'1e123',// String '1e123'
	"\x31", // String '1'
);
echo '<table><tr><th>Wert</th><th>Datentyp</th><th><code>is_int()</code></th><th><code>is_numeric()</code></th></tr>';
foreach( $data as $val ) {
	echo '<tr>';
	echo '<td><code>'.var_export($val, true).'</code></td>';
	echo '<td>'.gettype($val).'</td>';
	echo '<td>'.(is_int($val) ? 'true' : 'false').'</td>';
	echo '<td>'.(is_numeric($val) ? 'true' : 'false').'</td>';
	echo '</tr>';
}
echo '</table>';
 
Zurück