Datensatz wird nicht vollständig überliefert

07/26/2015 18:45 Bently.#1
Wie er Titel besagt wird kein Datensatz eingefügt.

Ich habe 3 Datensätze einnmal die ID Primary + Auto increment. Die zweite ist der Username auch Primary + varchar(25) , passsword varchar(25) ,, id wird immer um 1 Hochgezählt genau wie ich es wollte aber wenn ich Username und Password eingebe sind die in der Datenbank leer.

07/26/2015 19:03 .StarSplash#2
Wie hast du denn die Primärschlüssel gesetzt?

Der Name sagt eigentlich schon, dass es davon nur einen geben kann, du kannst allerdings einen aus mehreren Spalten zusammensetzen, das macht nur in deinem Kontext absolut keinen Sinn. Belass es bei der ID als Primärschlüssel und mach den Nutzernamen unique. Mir ist allerdings ein bisschen schleierhaft, wie du das überhaupt so erzeugen konntest, das müsste jedes halbwegs intelligente Programm verbieten.

Wenn du in einem String eine Variable einfügen willst, musst du zwischen vorläufigem String-Ende und der Variable einen Punkt setzen. Ebenso natürlich andersrum am Ende der Variable. So wie du das handhabst würde allenfalls "$username" und "$password" in deiner Datenbank landen, dass das nicht passiert liegt daran, dass sich SQL an dem einzelnen $-Symbol stört.

PS: Benutz doch prepared-statements!
07/26/2015 21:21 Daifoku#3
Grundsätzlich ist das mit dem PrimaryKey kein Problem, man müsste dann nur einiges beachten. Die gängigste Lösung ist folgende Tabelle:

PHP Code:
CREATE TABLE IF NOT EXISTS `cms_user` (
  `
idint(11NOT NULL AUTO_INCREMENT,
  `
namevarchar(50NOT NULL,
  `
passwordvarchar(50NOT NULL,
  
PRIMARY KEY (`id`),
  
UNIQUE KEY `name` (`name`)
); 
Primary Key liegt auf der ID
Bei der Indizierung wird kein Benutzername mehr benötigt.
Mit diesem Konzept kann der Benutzername - sofern erwünscht - nachträglich ohne weiteres geändert werden.
Doppelte Nutzernamen sind nicht möglich.


Ein weiteres Problem was mir direkt auffällt ist deine Art zu programmieren. Du solltest bei einem Stil bleiben und nicht wechseln. Entweder prozeduraler oder Objekt-orientierter Stil. Am besten eignest du dir die OOP Variante von mysqli an, das ist einfach sinnvoller.
Wenn du mysqli verwendest, solltest du auch direkt deren Prepared statements nutzen, dann fällt das escapen weg und du lernst nochmal n gutes Stück guten Programmierstil dazu.

Weiterhin ist es sinnvoll, dass du deine Datenanbindung abkapselst und in eine externe PHP Datei legst. MVC sagt dir das was ? Wenn du was lernen willst, probiere dich daran ;-) google wird dir zu MVC php schon was sagen können :) Hier auch ein schöner Link dazu : [Only registered and activated users can see links. Click Here To Register...]


An meinen Vorredner:
"musst du zwischen vorläufigem String-Ende und der Variable einen Punkt setzen"

Die Aussage ist falsch, mit normalen Anführungszeichen muss man das nicht. Beispielswiese ist folgender Code völlig ok:

PHP Code:
$name "Peter";
echo 
"Hallo $name"
Allerdings sollte man der Übersicht halber Variablen in Klammern setzen:

PHP Code:
echo "Hallo {$name}"
07/27/2015 01:04 .StarSplash#4
Quote:
Originally Posted by Daifoku View Post
An meinen Vorredner:
"musst du zwischen vorläufigem String-Ende und der Variable einen Punkt setzen"

Die Aussage ist falsch, mit normalen Anführungszeichen muss man das nicht. Beispielswiese ist folgender Code völlig ok:

PHP Code:
$name "Peter";
echo 
"Hallo $name"
Allerdings sollte man der Übersicht halber Variablen in Klammern setzen:

PHP Code:
echo "Hallo {$name}"
In der Tat, ja, ich habe mich irgendwie nur an dem einfachen Hochkomma direkt daneben orientiert, dass das ganze überhaupt nicht konsistent ist, ist mir nicht aufgefallen :o

Ich würde aus Gründen der universellen Verständlichkeit trotzdem immer mit dem Punkt arbeiten, komplexe Ausdrücke die Klammern erfordern ausgenommen. Und ja, mir ist bewusst, dass das Konkatenieren mit dem Punkt für jeden Teil neu ausgeführt wird und somit langsamer ist, aber das halte ich in den meisten Fällen für verkraftbar.
07/27/2015 03:53 Bently.#5
Erstmal danke euch , werde aufjedenfall dies lernen.

Nur Problem besteht immer noch. Habe von Daifoku die Tabelle erstellt und es mit diesem Code probiert.

[SPOILER][/
PHP Code:
<form Action="<?php $_SERVER['SCRIPT_NAME'?>" method="POST">
<input type="text" name="username" required="required">
<input type="password" name="password" required="required">
<button type="submit">Anmelden</button>
<?php
if ("POST" == $_SERVER["REQUEST_METHOD"]) {

include 
"verbindung.php";

$anzeige = isset($_POST["anzeige"]) ? 0;


$insert $verbindung->prepare("INSERT INTO `cms_user`
                SET
                `name` = :username,
                `password` = :password"
);
    
$insert->bindValue(':username'$_POST["username"]);
$insert->bindValue(':password'$_POST["password"]);
$insert->bindValue(':anzeige'$anzeige);

if (
$insert->execute()) {
echo 
'<p>Die Naricht wurde eingetragen</p>';
}
else {
print_r($insert->errorInfo());
}
}
?>
SPOILER]

Fehlermeldung: Array ( [0] => HY093 [1] => [2] => )
07/27/2015 10:39 Daifoku#6
Das sieht doch schonmal gut aus :)

PHP Code:
$insert->bindValue(':anzeige'$anzeige); 
verursacht einen Fehler. Du darfst nur Variablen binden die du auch wirklich verwendest ;-)
Zudem sollte das Passwort mindestens mit md5 gehasht werden ;-)

PHP Code:
$password md5($_POST['password']);
$insert->bindValue(':password'$password); 
07/27/2015 11:59 PixelTree#7
Quote:
Originally Posted by Daifoku View Post
Zudem sollte das Passwort mindestens mit md5 gehasht werden ;-)
Bitte nicht, wenn du ihm schon sagst, dass er seine Passwörter hashen soll, dann wenigstens nicht mit md5.

PHP Code:
$password password_hash($_POST['password'], PASSWORD_DEFAULT);
$insert->bindValue(':password'$password); 
md5 ist extra schnell und effizient, was keinesfalls wünschenswert ist bei Passwörtern, denn diese kann man mit guter Hardware schnell brute forcen. Dieses Problem versuchen Algorithmen wie bycrypt zu lösen.
07/27/2015 13:21 Daifoku#8
Ich sagte "mindestens", md5 ist immerhin besser als plain..


Bei Verwendung von password_hash muss die MySQL Tabelle geändert werden.

PHP Code:
CREATE TABLE IF NOT EXISTS `cms_user` ( 
  `
idint(11NOT NULL AUTO_INCREMENT
  `
namevarchar(50NOT NULL
  `
passwordvarchar(255NOT NULL
  
PRIMARY KEY (`id`), 
  
UNIQUE KEY `name` (`name`) 
); 
password_hash ist auf keine Länge begrenzt, die momentane Länge liegt bei ca 60 Zeichen, wird in Zukunft aber länger werden ...
password_hash gibt es erst seit PHP 5.5, daher ist hier auf die Kompatibilität des Servers zu achten.
07/27/2015 13:35 Devsome#9
Quote:
Originally Posted by Bently. View Post
Erstmal danke euch , werde aufjedenfall dies lernen.

Nur Problem besteht immer noch. Habe von Daifoku die Tabelle erstellt und es mit diesem Code probiert.
[...]
Fehlermeldung: Array ( [0] => HY093 [1] => [2] => )
Wieso willst du "anzeige" binden wenn dieser Wert nicht in deinem prepare Statement vorkommt ?

PHP Code:
<form Action="<?php $_SERVER['SCRIPT_NAME'?>" method="POST">
<input type="text" name="username" required="required">
<input type="password" name="password" required="required">
<button type="submit">Anmelden</button>
<?php
if ("POST" == $_SERVER["REQUEST_METHOD"]) {

include 
"verbindung.php";

$anzeige = isset($_POST["anzeige"]) ? 0;


$insert $verbindung->prepare("INSERT INTO cms_user (name, password) VALUES (?, ?)");
    
$insert->bindValue(1$_POST["username"]);
$insert->bindValue(2md5($_POST["password"]));

if (
$insert->execute()) {
echo 
'<p>Die Naricht wurde eingetragen</p>';
}
else {
print_r($insert->errorInfo());
}
}
?>
ggf kannst du die ? auch mit
Code:
:name
:password
belegen.

PHP Code:
$insert $verbindung->prepare("INSERT INTO cms_user (name, password) VALUES (:name, :password)"); 
PHP Code:
$insert->bindValue(":name"$_POST["username"]);
$insert->bindValue(":password"md5($_POST["password"])); 
07/27/2015 16:20 Bently.#10
Danke für die Hilfe! Hat geklappt. Doch ist es so sicher?

Und die zweite Sache von Pixel das mit dem Passwort Hash , es gibt keine Fehlermeldung aus doch es erscheint auch kein Eintrag wenn ich das anwende mit dem Password Hash:

[SPOILER][/
PHP Code:
if ("POST" == $_SERVER["REQUEST_METHOD"]) {

include 
"verbindung.php";

$insert $verbindung->prepare("INSERT INTO user_data_acc (username,password) VALUES (?, ?)");

$password password_hash($_POST["password"], PASSWORD_DEFAULT);
$insert->bindValue(1$_POST["username"]);
$insert->bindValue(2$password);

if(
$insert->execute()) {
echo 
'<p>Die Naricht wurde eingetragen</p>';
}
else {
print_r($insert->errorInfo());
}

SPOILER]
07/27/2015 16:22 .StarSplash#11
Quote:
Originally Posted by Bently. View Post
Danke für die Hilfe! Doch ist es so sicher?
MD5 ist nicht sicher, es macht es nur minimal schwerer das Passwort zu bekommen.
Benutz nen anständigen Algorithmus dafür.
07/27/2015 16:25 Devsome#12
Quote:
Originally Posted by .StarSplash View Post
MD5 ist nicht sicher, es macht es nur minimal schwerer das Passwort zu bekommen.
Benutz nen anständigen Algorithmus dafür.
Würde vielleicht sogar noch ein Captcha empfehlen, damit die Datenbank nicht zugemüllt wird.
[Only registered and activated users can see links. Click Here To Register...] und dann [Only registered and activated users can see links. Click Here To Register...] sollte doch reichen, oder ?
07/27/2015 16:30 Bently.#13
Sicherheit ist halt das wichtigste für mich. Ein Projekt mit Lücken kann ich gleich an den Nagel hängen.

Deswegen frage ich hier zur Sicherheit rum und nerve ein bisschen :P

Also wie sollte ich nun das Script erweitern mit einem sicheren Password und Captcha (Das mit dem Captcha könnte ich auch googlen)
07/27/2015 16:35 PixelTree#14
Quote:
Originally Posted by Devsome View Post
Würde vielleicht sogar noch ein Captcha empfehlen, damit die Datenbank nicht zugemüllt wird.
[Only registered and activated users can see links. Click Here To Register...] und dann [Only registered and activated users can see links. Click Here To Register...] sollte doch reichen, oder ?
Quote:
Warum sind verbreitete Hashfunktionen wie md5() und sha1() nicht für die Speicherung von Passwörtern geeignet?
Hashalgorithmen wie MD5, SHA1 und SHA256 sind auf Geschwindigkeit und Effizienz optimiert. Mit modernen Techniken und leistungsstarker Hardware ist es aber trivial geworden diese Hashalgorithmen mit "brute force" Attacken anzugreifen.

Weil moderne Computer diese Hashalgorithmen leicht brechen können, werden diese von Sicherheitsspezialisten nicht für die Speicherung von Passwörtern empfohlen.
[Only registered and activated users can see links. Click Here To Register...]

Nein reicht nicht, vorallem nicht ohne einen Salt.

Quote:
password_hash ist auf keine Länge begrenzt, die momentane Länge liegt bei ca 60 Zeichen, wird in Zukunft aber länger werden ...
password_hash gibt es erst seit PHP 5.5, daher ist hier auf die Kompatibilität des Servers zu achten.
Ich denke die Datenbankstruktur so früh zu ändern sollte kein Problem darstellen.
Falls es wirklich an der Version scheitern soll, kann man immernoch [Only registered and activated users can see links. Click Here To Register...] verwenden und dort den Blowfish Algorithmus .
07/27/2015 17:01 Bently.#15
@Pixeltree , Du hast mir schon ein Beispiel gegeben mit dem Password_Hash jedoch hat es keine Wirkung.