Truncate
13-07-2006, 20:45
Jetzt hat gerade eine fremde PHP-Seite diesen Code ausgegeben:
Could not obtain matched posts list
DEBUG MODE
SQL Error : 1053 Server shutdown in progress
SELECT m.post_id FROM z2phpbb_search_wordlist w, z2phpbb_search_wordmatch m WHERE w.word_text LIKE 'mp3' AND m.word_id = w.word_id AND w.word_common <> 1
Line : 512
File : search.php
Ist das nicht bischen sicherheitsgefährdend, wenn hier der komplette Query ausgegeben wird?
Da hat man es als Angreifer ja relativ leicht oder?
und wieso? erkläre mal! Außerdem phpbb verwendet immer die gleichen DB-Struktur, da muss man noch nicht mal die Query sehen :)
ghostgambler
13-07-2006, 21:44
Sollte die Website zu dumm sein mit addslashes/mysql_real_escape_string richtig umzugehen und du findest raus, dass der Query deshalb fehl schlägt, weil ein ' drin ist, dann kann man daraus definitiv was basteln ... ansonsten eher nicht.
Allerdings ist auf der Produktion so eine Ausgabe auch nicht gerade was feines, wenn möglich sollte man das schon lassen ^^,
criscrasp
14-07-2006, 17:38
Denke schon, dass das für die Sicherheit nicht sonderlich förderlich ist. Auch wenn bei OpenSource sowieso jeder nach Angriffspunkten suchen kann, ist es sicher nicht gut, noch die Tabellenstruktur & Query offen zu legen. Ganz abgesehen von dem ästhetischen Gesichtspunkt in der Produktion.
Lösung:
#ERROR HANDLING
// umdefinieren der Konstanten - nur in PHP 4
define("FATAL", E_USER_ERROR);
define("ERROR", E_USER_WARNING);
define("WARNING", E_USER_NOTICE);
// die Stufe für dieses Skript einstellen
error_reporting(FATAL | ERROR | WARNING);
function user_error_handler($severity, $msg, $filename, $linenum)
{
$query = "INSERT INTO error_log
(severity, message, filename, linenum, timestamp, querystring)
VALUES('%s','%s','%s','%s', %d, '%s')";
switch($severity) {
case WARNING:
mysql_query(sprintf($query, 'NOTICE', $msg, $filename, $linenum, time(), $_SERVER['QUERY_STRING']));
break;
case ERROR:
mysql_query(sprintf($query, 'WARNING', $msg, $filename, $linenum, time(), $_SERVER['QUERY_STRING']));
break;
case FATAL:
mysql_query(sprintf($query, 'FATAL', $msg, $filename, $linenum, time(), $_SERVER['QUERY_STRING']));
print("FATAL error.");
break;
default:
mysql_query(sprintf($query, 'UNKNOWN', $msg, $filename, $linenum, time(), $_SERVER['QUERY_STRING']));
break;
}
}
set_error_handler("user_error_handler");
So landen solche Fehler schön in einer Log-Tabelle und können später analysiert werden. Natürlich sollte man den Schnippsel oben noch mit einer Funktion ergänzen, die die Query sauber macht und natürlich braucht es noch eine Ergänzung, um den genauen MySQL Fehler abzufangen.