Zitatandere nicht getestet
Warum nicht?
Poste mal den Code, der die Funktion sound() aufruft.
Zitatandere nicht getestet
Warum nicht?
Poste mal den Code, der die Funktion sound() aufruft.
Du hast sehr viel Code geposted und irgendwo dazwischen das Problem beschrieben.
Das ist nicht gut für Dich, denn man hat oft nicht die Zeit so viel durch zu sehen.
=)
Zur Fehlermeldung.
ZitatColumn not found: 1054 Unknown column 'rere' in 'where
clause'' in
Du hattest in der SQL-Query wohl eine Spalte "rere" stehen.
Wenn ich mir den Code ansehe, sehe ich davon allerdings nichts.
Wenn Der Fehler immernoch auftritt, dann poste mal
die erstellte Query und den Inhalt der Variablen die darin genutzt werden.
in etwa so:
// hier ist die zeile 38, in der der fehler auftrat:
$statement = $pdo->prepare("SELECT hashid FROM Registrierdaten WHERE benutzername = ".$user." ");
// testausgabe:
var_dump(
"SELECT hashid FROM Registrierdaten WHERE benutzername = ".$user." "
);
exit; // ende um nur die query zu sehen/prüfen
Was hier allerdings noch schief läuft ist, dass Du variablen (und dann noch user input) in die SQL-Query einbaust, ohne Platzhalter zu verwenden.
Momentane Query und das gefähriche daran:
$statement = $pdo->prepare("SELECT hashid FROM Registrierdaten WHERE benutzername = ".$user." ");
// angenommen user enthält
// 0 OR benutzername = 'admin' OR benutzername != NULL LIMIT 1; -- .
// dann führst du diese query aus:
// "SELECT hashid FROM Registrierdaten WHERE benutzername = 0 OR benutzername = 'admin' OR benutzername != NULL LIMIT 1; -- . "
// wodurch ich bei dem momentanen script wohl als erster benutzer in der db eingeloggt wäre.
// der erste bist sicherlich du =)
// das verhinderst du mit platzhaltern:
$statement = $pdo->prepare("SELECT hashid FROM Registrierdaten WHERE benutzername = :benutzername;");
$statement->execute(
array(
':benutzername' => $user // hier wird der wert für den platzhalter :benutzername übergeben
// INFO - 'benutzername' ohne doppelpunkt funktioniert auch
)
);
// und jetzt kannst du das ergebnis ziehen - zB
// siehe http://php.net/manual/de/pdostatement.fetch.php
$result = $statement->fetch(PDO::FETCH_ASSOC);
// oder, wenn Du mehrere erwartest fetchAll
Alles anzeigen
Siehe PDO::prepare Bsp: http://php.net/manual/de/pdo.…repare-examples
Zeile 25 bis ... in Register-Seite
//Password
$password = $_POST['password'];
$password_wiederholung = $_POST['password_wiederholung'];
$password_gehahst = password_hash($password_gehahst, PASSWORD_DEFAULT);
Du erstellst hier einen PW hash aus einem (nicht vorhandenen) PW hash.
Das soll sicherlich das passwort oder passwort-wiederholung sein:
//Password
$password = $_POST['password'];
$password_wiederholung = $_POST['password_wiederholung'];
$password_gehahst = password_hash($password /*<<<< ----*/, PASSWORD_DEFAULT);
HTML - vars maskieren - auch in Email HTML
$nachricht = '
<html>
...
<body>
<p>Sehr geehrte/r ' . htmlspecialchars($vorname) .' ' . htmlspecialchars($nachname) . ' ,<br>
Sie haben sich bei uns neu regestriert. Bitte bestätigen sie ihre Registration mit dem Link den sie unten sehen:
</p>
<a href="'.htmlspecialchars($bestaetigungslink).'">'.htmlspecialchars($bestaetigungslink).'</a>
...
</body>
</html>
';
Alles anzeigen
Siehe auch all den anderen HTML Code in dem Du vars verwendest.
Email Injection
Siehe: Feedback für meine Website und Fragen zur Sicherheit, PHP uvm.
Tipps:
Erstelle den Hash erst, wenn Du alle Fehler ausschließen konstest.
Sonst erstellst Du jedes mal einen Hash, den Du nicht nutzt/weiter verwendest.
Also erst in:
if(count($fehler) === 0 ){
// jetzt erst hashen, den das kosten resourcen
$password_gehahst = password_hash($password, PASSWORD_DEFAULT);
}
empty($benutzername)
Prüfe besser auf mindest Länge. Du willst sicher keine Benutzer mit den Namen "a" oder "b" ... haben =)
Also besser
Das Gleiche mit allen anderen Feldern. Es gibt immer minest Länge, und oft maximal Länge.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
Wenn Du das verwendest, dann solltest Du bei jeder Aktion ($pdo->prepare..., $stmt->execute....) einen try/catch Block verwenden!
Was machst Du hier? :
oO?
Was steckt in $check?
Zum Login: Du solltest Dir das hier ansehen: Loginpasswort richtig hashen - password_hash() & password_verify()
Beim Login mit passwort_verify(...) den hash des Users aus der db mit dem eingegebenen PW vergleichen.
Normalerweise reicht schon sowas:
Oder das hier: http://stackoverflow.com/a/876154/3411766
Du könntest auch password_hash() nutzen:
Das wäre dann ein unique hash, der allerdings etwas zu lang werden kann.
Außerem verbrät password_hash() einiges an resourcen - also bissl ungünstig.
Es muss einzigartig sein.
Und selbst wenn jemand den PHP-Code kennt, mit dem Du den hash erstellst,
muss es sehr schwer bis nicht möglich sein den hash selbst zu erstellen.
in Zeile 58 definierst Du erst den $bestaetigungslink.
Demnach gibt es für Zeile 22 keinen Wert.
Also die Var muss vor Zeile 22 definiert worden sein.
BTW: wenn Du den Hash zur Aktivierung so erstellst, dann kann sich (theoretisch) jeder selbst einen erstellen.
Besser ist es, einen wirklich zufälligen hash zuu erstellen und den in der db abzulegen.
Zeile 10
Wenn ! (NICHT) filter_var(...) === false
Doppelte Verneinung ![]()
Würde aber empfehlen:
Du könntest die nav (foreach) außerhalb des HTML-Teils erstellen.
Und ein htmlspecialchars auf$nav_item.
Sonst wüsste ich nix. Evtl bissl einrücken.
<?php
$nav_items = array(
'about' => 'About',
'kontakt' => 'Kontakt',
'home' => 'Home',
);
$nav = '';
foreach($nav_items as $link => $nav_item){
$nav .= '
<li>
<a href="?page='.htmlspecialchars($link, ENT_QUOTES, 'UTF-8').'">'.htmlspecialchars($nav_item).'</a>
</li>
';
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
</head>
<body>
<header>
<ul class="topnav">
<?php echo $nav ?>
</ul>
</header>
</body>
</html>
Alles anzeigen
Das ganze Netz ist voll mit dem Zeug ![]()
Im Ernst - hier im Forum, oder über google findest Du relativ schnell frei nutzbaren Code.
Dabei musst Du eigtl nur wissen, WAS Du brauchst/suchst,
und Du musst es einigermaßen verstehen, um es in Deine Seite einbauen zu können.
Zu den Projektseiten:
nimm doch die Navi und kopier sie. (Oder ich hab dich fasch verstanden)
Tipps geben ist jetzt hier schwierig, da Du ja nicht direkt fragst, was Du brauchst.
Wenn Du zB nach einer Navi fragst, oder nach nem Footer, dann sollte das alles kein Problem sein.
Guck Dir das Bsp nochmal an. Da fehlt das Semikolon =)
Und das ist der Punkt bei diesem Bsp.
Was ich damit zeigen wollte ist, dass ein Passwort (oder andere sensible Daten) in einer Var gut aufgehoben sind.
Aber man muss aufpassen, was man mit der Var im Script macht.
So ein Fehler sollte sehr selten vorkommen. Wichtig ist nur, dass man sowas kennt/schon mal gesehen hat/wüsste was passiert/... .
=)
Den Username kannst Du anzeigen lassen, wo Du willst.
Opps, hatte ich den Link vergessen ![]()
Wenn Du im Script das Passwort in Variablen steckst, dann kann im Normalfall nichts passieren.
Der Wert - hier das Passwort - wird ja beim setzen einer Var im Normalfall nicht irgendwo hin gespeichert (außer im Speicher (RAM)).
Es gibt aber Situationen, in denen "etwas schief gehen kann". Dann kann es sein, dass der Wert einer Var an die "Öffentlichkeit" gelangen kann.
Bsp:
Simples Bsp für Verkettungsfehler:
/* simuliere eingehende formdaten: */
$_POST['username'] = 'cottton';
$_POST['password'] = 'mySecr3tP455w0rD';
/* * * * * * * * * * * * * * * * * * * * */
$username = trim($_POST['username']);
$string = 'Hallo ' . htmlspecialchars($username) . '!' .
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_DEFAULT);
$password = null;
$string .= '... something to tell ...';
echo $string;
Alles anzeigen
Ausgabe:
Was passierte hier?
(Siehe Comments)
/* simuliere eingehende formdaten: */
$_POST['username'] = 'cottton';
$_POST['password'] = 'mySecr3tP455w0rD';
/* * * * * * * * * * * * * * * * * * * * */
$username = trim($_POST['username']); // nix besonderes - trim username
// hier wollen wir dem user etwas mitteilen
// und verketten einen string
// aber OH OH -
$string = 'Hallo ' . htmlspecialchars($username) . '!' . // HIER hat jemand was vergessen!
// sowas passiert, wenn man dort eigtl noch was schreiben/anhängen wollte,
// das dann aber vergessen hat.
// (sowas also gleich gar nicht angewöhnen =)
// hier gehts normal weiter im script - ABER
// für PHP war das statement (die obere stringverkettung) noch nicht abgeschlossen!
// und dadurch wird hier der inhalt on $password an den string angehangen!
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_DEFAULT);
$password = null;
$string .= '... something to tell ...';
echo $string;
Alles anzeigen
In kurz:
// ...
$string = 'Hallo ' . htmlspecialchars($username) . '!' .
$password = $_POST['password'];
// ...
// entspricht:
// inhalt von (
// inhalt von $_POST['password'] nach $password zuweisen
//) and string anhängen
Alles anzeigen
Anderes Bsp: Exceptions
(Vorraussetzung hier, dass Fatal Errors angezeigt werden. Aber auch in den Logs kann das pw auftauchen!)
/* simuliere eingehende formdaten: */
$_POST['username'] = 'cottton';
$_POST['password'] = 'mySecr3tP455w0rD';
/* * * * * * * * * * * * * * * * * * * * */
class User{
protected $password;
public function setPassword($password)
{
$this->password = (string)$password;
// ...
// aus irgend einem grund wird eine exception geworfen:
throw new Exception('OOooops!', 13);
}
}
$user = new User();
$user->setPassword($_POST['password']);
Alles anzeigen
Ausgabe (weil Exception nicht aufgefangen)
Fatal error: Uncaught exception 'Exception' with message 'OOooops!' in [...]: User->setPassword('mySecr3tP455w0r...') #1 {main} thrown in [...]
Die PHP Fehlermeldung gibt einen Fatal Error aus, mit der Angabe WO das passiert ist.
Dabei zeigt uns die Meldung blöderweise, dass die Funktion ::setPassword() aufgerufen wurde und der Wert "mySecr3tP455w0r..." als Parameter übergeben wurde.
Dieser Fehler - also das ausgeben von Fatal Errors - passiert wohl öfter mal beim Verbinden zu einer db. Man sollte das also kennen und try/catch nutzen, um genau das zu vermeiden
Erstmal: sehr schön, dass Du PHP password_hash() nutzen möchtest.
ZitatWelche Hash-Algorythmen würdet ihr mir empfehlen von denen : ?
Keinen. Lass das die PHP Funktion password_hash() machen,
wie Du es schon richtig gemacht hast:
Der Parameter 2 $algo in password_hash()
gibt den verwendeten Algorithmus an.
PASSWORD_DEFAULT legt dabei fest, dass nach PHP Standard immer der best mögliche Algo verwendet wird.
Siehe: http://php.net/manual/en/password.constants.php
ZitatWenn ich zuerst die eingabe vom password feld im paddword speichere ist
das password ja nicht geschützt oder ?
Verstehe ich nicht ganz. Aber wenn Du meinst, dass zB $_POST['password'] unsicher ist,
oder es unsicher ist, das Klartextpasswort irgendwo abzuspeichern (db, file, session(was auch ein file ist)),
dann - JA, Klartextpasswörter dürfen nie irgendwo gespeichert werden.
Es wird ein Hash vom Klartextpasswort gespeichert (zB db),
und später mit dem Hash des zu verifizierenden Passwortes (zB Login) gegengeprüft.
Dafür nutzt Du dann aber password_verify()
ZitatIch würde dann das gehahschte Password in der Datenbank speichern falls alle eingaben stimmen und noch nicht besetzt sind.
Erst, wenn alle benötigten Felder ausgefüllt wurden - erst dann fängst Du an zu "arbeiten".
Soll heißen: Sind alle required Fields ausgefüllt - Ja - Dann erstelle (erst) jetzt den Passworthash.
Warum:
Jedes hashen kosten Ressourcen. Bei password-hash() kannst Du eine "cost" mitgeben. (mehr zu "cost" auf php.net oder im oben genannten Link).
Und Du möchtest ja nicht erst den aufwendigen Hash erstellen lassen, um in dann wieder fallen zu lassen, weil zB der Benutzername zukutz ist.
ZitatWas haltet ihr von meiner Vorgangsweise? Wie würdet ihr es machen ? Mache ich es so richtig ?
Ich sehe da nicht ganz durch.
Das erste was ich sehe (un MIR nicht gefällt) ist:
Der User wollte evtl am Anfang oder Ende ein Leerzeichen im PW. Du veränderst hier seine Eingabe.
Das macht noch Sinn, wenn es um Namen geht (Username).
Aber beim Passwort ist meine Meinung: Benutzers Passwort ist des Benutzers Passwort und wird nicht angerührt.
Ich nenne es immer gern wieder: Sparkasse kürzt EINGEGEBENE Passwörter auf 5 order 6 zeichen, OHNE den Benutzer zu informieren. (Bei Vergabe und Login!)
Es ist zwar viel, aber ich denke wir hatten damals im Thread "passwort richtig hashen" (Link oben) so ziemlich alles abgearbeitet.
Einfach mal ansehen. Bei Fragen wie immer fragen.
(Beachte auch password_verify() und password_needs_rehash())
Spam emails sind valid auch emails ![]()
Das sieht richtig aus. Was steckt denn in $data['html'] nach der Schleife?
(var_dump($data['html']))
was Basi sagt und
1. Modulus http://php.net/manual/de/language.operators.arithmetic.php
ZitatRest von $a geteilt durch $b
Ich finde $unteilbar und $i $k sind schlecht gewählt.
Siehe Comments:
// !($a % $b)
//
// 2 % 2 === 0
// ! "dreht das ergebnis um"
// also:
// !(0) egibt true
//
// var_dump(!(0)); // bool(true)
//
// in anderer schreibweise:
// $rest = $a % $b;
// if(!$rest) // wenn NICHT $rest
// andere schreibweise:
for ($a = 1; $a <= 100; $a++) { // für alle zu prüfende zahlen 1 - 100
$istPrimzahl = true;
for ($b = 2; $b < $a; $b++) {
$rest = $a % $b; // zB 6 / 3 ergibt rest 0
if ($rest === 0) { // zB 6 / 3 ergab 0, also nicht nur durch 1 und sich selbst teilbar
$istPrimzahl = false;
break; // unterbreche/beende die momentane schleife (2te for(...)),
// denn wir haben festgestellt, dass es keine primzahl ist.
}
}
if ($istPrimzahl) {
echo "Primzahl ist: " . $a . "<br>";
}
}
Alles anzeigen
Hatte mich schon gewundert. Was is passiert? Stromausfall? HDD verabschiedet?
Das nicht Empfehlen bezog sich auf die echos in der function.
Es ist einfacher nachzuvollziehen (auch später für Dich selbst), wenn functions Werte zurückgeben,
aber nicht ausgeben.
Soll heißen: anstatt in der function echos zu nutzen, würde ich dort drin einen String erstellen und diesen zurückgeben.
In etwa so:
die function:
function myFunctionToGetSomething($x, $y, $z){
$string = $x . ' something ' . $y . $z;
return $string;
}
das eigentliche script:
<!-- html code ... -->
<?php
$something = myFunctionToGetSomething($x, $y, $z);
echo $something;
?>
<!-- html code ... -->
Wenn Du nun in 2 Jahren Deinen Code durchgehst, weil Du etwas umbauen musst,
dann würdest Du davon ausgehen, dass myFunctionToGetSomething Dir einen String zurückgibt.
Den String gibst Du dann außerhalb der function aus.
Das hier ist das Problem:
Du weist $pruefung['pr_nr'] etwas zu, und echo-st es aber in der gleiche Zeile.
Mach das nicht.
Wenn Du das Ergebnis der Funktion noch brauchst, dann:
// leg erst das ergebnis in die var ...
$pruefung['pr_nr'] = pr_nr(clearstring($_SESSION['st_bn_nr']));
// und jetzt nutze die var:
echo $pruefung['pr_nr'];
Wobei Du hier wohl den Rückgabewert ($pr) gar nicht ausgeben willst.
Also nur:
... denn in der Funktion machst Du ja schon echo (was ich nicht empfehle).
Du solltest das trennen - eine Function um zu prüfen, und eine um die Augabe zu generieren.
Weiß grad nicht ganz genau, was passieren soll.
Du brauchst glaub ich einen edito, der Dir Fehler markiert.
Sieh Dir mal das Bild an:html-seminar.de/woltlab/attachment/969/
Das hier könnte funzen:
// nicht sicher, ob ich $inhalt richtig verstehe
function pr_bennr($inhalt)
{
if ($inhalt === "") {
$inhalt = "<td><img src="../standard/icon/gelbes_ausruf.png"></td>";
$pruefung = 'falsch';
} else {
$ausdruck = "/[[0-9]{5}[^(a-zA-ZäöüÄÖÜ<>#!*+")]*/";
if (preg_match($ausdruck, $inhalt) == false) {
$inhalt = "<td><img src="../standard/icon/rotes_kreuz.png"></td></tr>";
$inhalt .= "<tr><td></td><td class="red">- 5-stellig</br>- nur Zahlen</td>";
$pruefung = 'falsch';
} else {
$inhalt = "<td><img src="../standard/icon/gruener_haken.png"></td>";
$pr = 'richtig';
}
}
return array($inhalt, $pruefung);
}
Alles anzeigen
PS: evtl kann das Forum den Code wegen der Fehler nicht richtig darstellen.
HTML-Seminar.de - mit Videos zum schnellen Lernen, wie man eine Website selbst erstellt.