welbox, ну во-первых при проверке юзернэйма проще проверить на допустимые символы (типа [0-9a-z_]) тогда эта строка
$login = htmlspecialchars(stripslashes($login)); отпадает за ненадобностью.
Во-вторых эта строка
$password = htmlspecialchars(stripslashes($password)); тоже не нужна, так как пароль будет загоняться в хэш. Следовательно и валидация пароля по символам (
preg_match("/[\||\'|\<|\>|\"|\!|\?|\$|\|\/|\\\|\&\~\*\+]/",$password)) тоже не нужна.
В-третьих
md5(md5($_POST['password'])) не поможет лучше защитить пароль.
Почитай что дал
twin.
В-четвертых: где проверка на НЕзаполненность логина и/или пароля?
В-пятых - передавать сообщение об ошибки через GET тем более вместе с HTMLом, как минимум не корректно, как максимум не безопасно.