• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Post Index der gesetzt sein sollte ist nicht vorhanden

CGollhardt

Mitglied
Hallo Miteinander,

ich bin gerade ein wenig verwirrt wie ich mit folgenden Problem umgehen soll.

Vereinfachte Darstellung:

HTML:
<form ...>
<input type="hidden" name="send" value="true" />
<input type="email" ... />
</form

PHP:
if (isset ($_POST['send'])) {
$foo = $POST['email']
}
Wirft Serverseitig folgende Exception: PHP Notice: Undefined index: email in...

Wie kann das sein? Also normalerweise funktioniert es so korrekt. Seit dem ich aber einen Dedizierten Server habe und auf den PHP Error Log zugreifen kann, fallen mir solche Fehler immer wieder ins Auge (Also Fehler die ein Besucher zu gesicht bekommt, und ich nicht nachvollziehen kann). Gibt es Browser, die ein leeres Feld nicht mitsenden? Kann jemand versucht haben die Kommunikation zum Server zu manipulieren?

Wie gehe ich damit um? Soll ich jeden Post abfragen, ob er vorhanden ist obwohl ich fachlich weiß, dass dieser vorhanden sein muss? Eigentlich wäre dies für mich ein Fehler der nicht Vorkommen darf und ich will nicht unbedingt tausend If abfragen für erwartete Fehler schreiben.

Vielen Dank für eure Antworten!
 
Werbung:
HTTP-POST-Parameter werden i.d.R. von einem Formular nicht mitgesendet, wenn sie leer sind.

Versuche alternativ zum Input-Type „email“ auch mal „text“. Aus deinem Quellcode geht auch nicht das name-Attribut des Email-Feldes hervor. Ist dieses Attribut tatsächlich „email“?

Eine Überprüfung jedes einzelnen Feldes lässt sich in den meisten Fällen nicht umgehen.
 
Werbung:
Hallo, sorry sollte auch <input type="text" name="email" ... /> heißen, da habe ich mich verschrieben.

Also Im Endeffekt habe ich folgendes Formular:
HTML:
<form action="<?php echo $url['self']; ?>" method="post">
        <div class="content-box-main">
            <h2 class="headline"><img src="/grafiken/design/arrow-white.jpg" alt="»">Login Information</h2>
            <br />
            <table style="width:100%">
                <tr>
                    <td style="width:70px;">Login Name:</td>
                    <td style="width:200px;"><input style="width:150px;" type="text" name="username" maxlength="15" value="<?php echo $_UNSAFE_POST['username']; ?>" <?php echo $ViewModel -> validate -> error_style['username']; ?> /></td>
                    <td style="width:130px;">eMail-Adresse:</td>
                    <td><input style="width:150px;" type="text" name="email" value="<?php echo $_UNSAFE_POST['email']; ?>" <?php echo $ViewModel -> validate -> error_style['email']; ?> /></td>
                </tr>
                <tr>
                    <td>Passwort:</td>
                    <td><input style="width:150px;" type="password" name="password1" value="" <?php echo $ViewModel -> validate -> error_style['password']; ?> /></td>
                    <td>Passwort (wiederholen):</td>
                    <td><input style="width:150px;" type="password" name="password2" value="" <?php echo $ViewModel -> validate -> error_style['password']; ?> /></td>
                </tr>
            </table>
            <div class="clear"></div>
        </div>
        <div class="content-box-main">
            <h2 class="headline"><img src="/grafiken/design/arrow-white.jpg" alt="»">Personenbezogene Daten</h2>
            <br />
            <table style="width:100%">
                <tr>
                    <td style="width:70px;">Vorname:</td>
                    <td style="width:200px;"><input style="width:150px;" type="text" maxlength="25" name="vorname" value="<?php echo $_UNSAFE_POST['vorname']; ?>" <?php echo $ViewModel -> validate -> error_style['vorname']; ?> /></td>
                    <td style="width:130px;">Nachname:</td>
                    <td><input style="width:150px;" type="text" maxlength="25" name="nachname" value="<?php echo $_UNSAFE_POST['nachname']; ?>" <?php echo $ViewModel -> validate -> error_style['nachname']; ?> /></td>
                </tr>
                <tr>
                    <td>Gamertag:</td>
                    <td><input style="width:150px;" type="text" name="gamertag" value="<?php echo $_UNSAFE_POST['gamertag']; ?>" <?php echo $ViewModel -> validate -> error_style['gamertag']; ?> /></td>
                    <td>Geburtsdatum:</td>
                    <td>
                        <select name="day" id="day" <?php echo $ViewModel -> validate -> error_style['day']; ?>>
                            <?php echo $ViewModel -> htmlOptionsDay; ?>
                        </select>.
                        <select name="month" id="month" <?php echo $ViewModel -> validate -> error_style['month']; ?>>  
                            <?php echo $ViewModel -> htmlOptionsMonth; ?>
                        </select>.
                        <select name="year" id="year" <?php echo $ViewModel -> validate -> error_style['year']; ?>>
                            <?php echo $ViewModel -> htmlOptionsYear; ?>
                        </select>
                    </td>
                </tr>
            </table>
            <div class="clear"></div>
        </div>
        <div class="content-box-main">
            <h2 class="headline"><img src="/grafiken/design/arrow-white.jpg" alt="»">Sicherheitsüberprüfung</h2>
            <br />
            <table style="width:100%">
                <tr>
                    <td colspan="3">Um den Registrierungsvorgang abschließen zu können, müssen Sie den Allgemeinen Nutzungsbedingungen zustimmen, und den Sicherheitscode korrekt in das freie Feld übertragen. Der Sicherheitscode dient zum Schutz vor Bots.</td>
                </tr>
                <tr>
                    <td><input type="checkbox" name="anb" <?php echo $ViewModel -> validate -> error_style['anb']; ?> /> Ich habe die <a href="<?php echo $url['impressum']; ?>" target="_blank">ANB`s gelesen</a> und stimme diesen zu.</td>
                    <td style="text-align:center; width:100px;"><img src="<?php echo $url['captcha']; ?>" style="border:1px solid;" /></td>
                    <td style="text-align:right; width:150px;"><input style="width:150px;" type="text" name="captcha" value="" <?php echo $ViewModel -> validate -> error_style['captcha']; ?> /></td>                    
                </tr>
            </table>
            <div style="text-align:center;"><input style="width:200px;" type="submit" name="register" value="Anmelden" /></div>
            <div class="clear"></div>
        </div>
    </form>
PHP:
if (isset ($_POST['register'])) {
	$ViewModel -> validate -> username ($_POST['username']);
	$sqlCommand = '(SELECT id FROM members WHERE username = "' . $_POST['username'] . '") UNION
	(SELECT id FROM confirmation WHERE username = "' . $_POST['username'] . '")';
	if ($db -> count_rows($sqlCommand) > 0) {
		$ViewModel -> validate -> add_error ('username');
	}
	$ViewModel -> validate -> email ($_POST['email']);
Aber $_POST['email'] ist bei vielleicht jeden 2000. Besucher nicht definiert.

Vielen Dank für eure Mühe.
 
Werbung:
Das könnten möglicherweise Angriffsversuche auf deine Seite sein. Kein Wunder, du arbeitest unsauber. Es ist sinnlos, mit isset() nur ein Feld zu überprüfen. Alle Felder, die keine Checkboxen sind sollten ins isset() geworfen werden. Falls es nämlich nicht der Fall ist, wurde das Formular manipuliert - was sehr sehr sehr einfach ist.
 
Okay, danke für deine Antwort.

Also ich überprüfe schon die Werte darauf ob ich sie akzeptieren will, nur nicht ob sie vorhanden sind (da es eigentlich sollte).

Ich setzt mich jetzt mal daran dies bei jedem Formular zu prüfen.

Das ich Benutzer ausschließe, da sie bei einer leeren Textbox nichts mitsenden kann nicht sein? Das ist mir ganz wichtig. Ich kann mir nämlich noch nicht vorstellen, wer versuchen könnte Daten zu manipulieren. Also ich will ausschließen, dass dies Browserfehlverhalten ist.
 
Werbung:
Informiere dich bitte über das Ganze. Das ist sehr wichtig. Ein leeres Feld wird selbstverständlich mitgeschickt. isset() überprüft nur, ob es eine Variable gibt und ob sie nicht NULL ist.
 
Ich kann mir nämlich noch nicht vorstellen, wer versuchen könnte Daten zu manipulieren.

Dieselbe Leute (Bots, Scripts), die immer mein eines Kommentarformular finden und dort Spam reinschreiben, weshalb ich bei zwei echten Kommentaren schon bei der Auto-Increment-ID 2100-nochwas bin. Gerade wieder 16 Spams gelöscht, muss das endlich mal auf „muss freigeschaltet werden“ umbauen. :)

Anders gesagt: Das Web ist voll von Automatismen, die URLs sammeln und nach Formularen durchsuchen, um dort Spam zu veröffentlichen. Die Logik dahinter, ein Feld explizit nicht zu setzen, kann möglicherweise eine Spammer-Kontermaßnahme gegen Honeypots sein.

Du kannst ja mal spaßeshalber mitloggen, was die Leute sonst noch so an Daten mitschicken, wenn das Feld nicht gesetzt ist, falls du wirklich annimmst, dass das echte Anfragen sind.
 
Zurück
Oben