Thema: Ein einfaches "System"
-
27.02.2012, 21:31 #1
Ein einfaches "System"
Hier eine kleine Übungsarbeit in PHP von mir,
der Code ist nicht wirklich sauber und nicht gegen Injections abgesichert.
Die Variablen werden per GET übergeben, weil ich vor hatte die Scripte aus einem Programm heraus aufzurufen und dort bevorzuge ich die GET-Methode.
Das System ist noch lange nicht ausgereift.
Documentation.txt
PHP-Code:# Documentation of system #
user: root
_____________
password:
____________________
database: system
_________________________
tables: userdata, log
_____________________
columns:
________
userdata:
id
username
password
ip
date
____________
log:
logtext
ip
date
_____________________
files:
________________
log.php
query.php
insert.php
login.php
connection.php
settings.php
archive.php
How to use:
___________
[1] settings.php editieren
[2] system.sql importieren
[3] alle dateien hochladen
_______________________
Erklärung zu query.php:
_______________________
query.php?a=all : Alle Benutzernamen in der Datenbank werden ausgegeben.
query.php?a=details&user=USERNAME : Alle Details zu dem Benutzer USERNAME werden ausgegeben.
query.php?a=log : Der komplette Log wird ausgegeben.
_________________________________________
(C) Copyright 2012 http://schmitz-dev.net
_________________________________________
PHP-Code:<?php
include('connection.php');
include('settings.php');
$abfrage = "SELECT version,link,datum FROM archive";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
echo "Version: $row->version ; Datum: $row->datum ; Downloadlink: $row->link <br>";
}
?>
PHP-Code:<?php
include 'settings.php';
$verbindung = mysql_connect ("$host",
"$database_user", "$database_password")
or die ("keine Verbindung möglich.
Benutzername oder Passwort sind falsch");
mysql_select_db("$database")
or die ("Die Datenbank existiert nicht.");
?>
PHP-Code:<?php
include 'settings.php';
include 'connection.php';
include 'log.php';
$security_key = "123456789";
$k = $_GET["k"];
$username = $_GET["username"];
$password = $_GET["password"];
$salt = "ds89dj89jf789sdzfs8d7f6s8df";
$md5_password = md5("".$password."".$salt."");
$ip = $_SERVER["REMOTE_ADDR"];
$timestamp = time();
$date = date("d.m.Y - H:i", $timestamp);
if ($k == $security_key)
{
$eintrag = "INSERT INTO userdata
(username, password, ip, date)
VALUES
('$username', '$md5_password', '$ip', '$date')";
$eintragen = mysql_query($eintrag);
if($eintragen == true)
{
echo "Eintrag war erfolgreich";
# Log #
logging_on_reg($username, $ip, $date);
}
else
{
echo "Fehler beim Speichern <br>".mysql_error();
}
}
else
{
echo "Der Key ist falsch.";
}
?>
PHP-Code:<?php
include 'settings.php';
include 'connection.php';
function logging_on_reg($username, $date, $ip)
{
$logtext = "Der Benutzer ".$username." hat sich registriert.";
$eintrag = "INSERT INTO log
(logtext, ip, date)
VALUES
('$logtext', '$ip', '$date')";
$eintragen = mysql_query($eintrag);
}
function logging_on_login($username, $date, $ip)
{
$logtext = "Der Benutzer ".$username." hat sich eingeloggt.";
$eintrag = "INSERT INTO log
(logtext, ip, date)
VALUES
('$logtext', '$ip', '$date')";
$eintragen = mysql_query($eintrag);
}
function logging_on_fail_login($username, $date, $ip)
{
$logtext = "Der Benutzer ".$username." hat versucht sich einzuloggen, aber das falsche Passwort eingegeben.";
$eintrag = "INSERT INTO log
(logtext, ip, date)
VALUES
('$logtext', '$ip', '$date')";
$eintragen = mysql_query($eintrag);
}
?>
PHP-Code:<?php
include 'settings.php';
include 'connection.php';
include 'log.php';
$username = $_GET["username"];
$password = $_GET["password"];
$ip = $_SERVER["REMOTE_ADDR"];
$timestamp = time();
$date = date("d.m.Y - H:i", $timestamp);
$abfrage = "SELECT username, password FROM userdata WHERE username LIKE '$username'";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
$pass = "$row->password";
if ($pass == $password)
{
echo "Das Passwort ist richtig.";
logging_on_login($username, $date, $ip);
}
else
{
echo "Das Passwort ist falsch.";
logging_on_fail_login($username, $date, $ip);
}
}
?>
PHP-Code:<?php
include 'settings.php';
include 'connection.php';
include 'log.php';
$action = $_GET["a"];
if ($action == "all")
{
# Alle Benutzer werden ausgegeben. #
$abfrage = "SELECT username FROM userdata";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
echo "$row->username <br>";
}
}
else if ($action == "details")
{
# Nur ein bestimmter Benutzer wird mit allen Angaben ausgegeben. #
$user = $_GET["user"];
$abfrage = "SELECT username, password, ip, date, id FROM userdata";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
echo "ID: $row->id ; Benutzername: $row->username ; Passwort $row->password ; IP: $row->ip ; Datum: $row->date";
}
}
else if ($action == "log")
{
# Der komplette Log wird ausgegeben. #
$abfrage = "SELECT logtext, date, ip FROM log";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
echo "Datum: $row->date Log: $row->logtext von IP: $row->ip <br>";
}
}
else
{
# Keine action wird angegeben, gebe Liste der Befehle aus. #
}
?>
PHP-Code:<?php
$host = "localhost";
$database_user = "root";
$database_password = "";
$database = "system";
?>
PHP-Code:-- phpMyAdmin SQL Dump
-- version 3.4.5
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Erstellungszeit: 23. Feb 2012 um 13:22
-- Server Version: 5.5.16
-- PHP-Version: 5.3.8
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Datenbank: `system`
--
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `archive`
--
CREATE TABLE IF NOT EXISTS `archive` (
`version` varchar(20) NOT NULL,
`link` text NOT NULL,
`datum` varchar(12) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Daten für Tabelle `archive`
--
INSERT INTO `archive` (`version`, `link`, `datum`) VALUES
('0.0.2', 'http://localhost/system/system-build-0.0.2.rar', '23.02.2012');
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `log`
--
CREATE TABLE IF NOT EXISTS `log` (
`logtext` text NOT NULL,
`ip` varchar(20) NOT NULL,
`date` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Daten für Tabelle `log`
--
INSERT INTO `log` (`logtext`, `ip`, `date`) VALUES
('Der Benutzer test_user hat sich registriert.', '::1', '22.02.2012 - 18:25'),
('Der Benutzer test_user hat sich eingeloggt.', '::1', '22.02.2012 - 18:39'),
('Der Benutzer test_user hat sich eingeloggt.', '::1', '22.02.2012 - 18:39'),
('Der Benutzer test_user hat sich eingeloggt.', '::1', '22.02.2012 - 18:40'),
('Der Benutzer test_user hat versucht sich einzuloggen, aber das falsche Passwort eingegeben.', '::1', '22.02.2012 - 18:40'),
('Der Benutzer test_user hat sich eingeloggt.', '::1', '22.02.2012 - 18:42'),
('Der Benutzer test_user hat versucht sich einzuloggen, aber das falsche Passwort eingegeben.', '::1', '22.02.2012 - 18:42'),
('Der Benutzer test_user hat sich eingeloggt.', '::1', '22.02.2012 - 18:43');
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `userdata`
--
CREATE TABLE IF NOT EXISTS `userdata` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(24) NOT NULL,
`password` varchar(24) NOT NULL,
`ip` varchar(20) NOT NULL,
`date` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
--
-- Daten für Tabelle `userdata`
--
INSERT INTO `userdata` (`id`, `username`, `password`, `ip`, `date`) VALUES
(1, 'test_user', '1927df6e309b3d5ae30e0318', '::1', '22.02.2012 - 18:02');
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
LG
-
27.02.2012, 23:08 #2
Ein einfaches "System"
Hübsch gemacht, leider ist das Schnee von Gestern, es gibt mittlerweile MySQLi (das i steht NICHT für Injection), was man unter PHP5 auch verwenden sollte, weil damit Objektrelationale Zugriffe auf die Datenbank gemacht werden können.
Ein gutes Tutorial (was ich auch durchgearbeitet habe) ist das hier:
Einführung in die MySQLi-Erweiterung von PHP 5 - MySQL vs MySQLi
Desweiteren nennt man das was du da programmiert hast ein 'UMS' = User-Managment-System und nicht einfach nur 'System' (is keine Kritik, vielleicht wusstest du das ja nicht, man kann ja nicht Alles wissen).
Ein Gratis-Beispiel mit Code zum nachschauen und Studieren findest du hier:
Admidio - Die kostenlose Online-Mitgliederverwaltung für Vereine, Gruppen und Organisationen
Die gravierendste Sache ist allerdings, dass dein System da total unsicher ist, jeder Anfänger kann sich die Datenbank unter den Nagel reißen, du hast Injections ohne Ende drin. Ich würde mich an deiner Stelle auch nochmal mit dem Thema MySQL+PHP+Sicherheit auseinandersetzen, bevor du Dinge releast, die extrem unsicher sind.
Ich rate hiermit auch Jedem ab, dieses Projekt irgendwo in einer Produktivumgebung einzusetzen wo fremde Personen Zugriff drauf haben, es sei denn ihr wollt euren Server sowieso verschenken.
Ansonsten möchte ich noch hinzufügen, dass du mehr objektorientiert programmieren solltest, mit Klassen, die du später wiederverwenden kannst, ist das Leben nämlich viel einfacher. Nur Funktionen zu verwenden halte ich nicht für sehr schlau. Ausserdem lässt das noch zusätzlichen Spielraum für Programmierfehler und damit Sicherheitslücken.
Gutes Projekt, Gute Idee, bisher ganz gut umgesetzt (bis auf die obigen Kritikpunkte natürlich), weiter so.
Java:
Spoiler:
Lustige Quotes:
Spoiler:
-
28.02.2012, 13:48 #3
Ein einfaches "System"
Danke Tobi, ich werde mir die Quellen mal ansehen und schauen was ich verbessern kann bzw. anders machen kann.
Das Projekt ist unsicher, das ist mir auch klar, aber das habe ich auch extra am Anfang gesagt
Mit Klassen wollte ich mich in der nächsten Zeit auseinandersetzen. Im Sommer fange ich eine Ausbildung zum FiA in einer Firma an, die Shopsoftware mit einem Warenwirtschaftssystem entwickelt, da werde ich bestimmt auch noch einiges lernen
LG
/e kleines Update:
Ich benutze eine neue Tabelle: tab_ums
ID ist der Primärschlüssel. Einen Sekundärschlüssel gibt es momentan nicht, da ich noch keine weitere Tabelle benutze und so auch keine Beziehung erstellen muss/kann.
Die Tabelle sieht so aus:
ums.sql:
PHP-Code:-- phpMyAdmin SQL Dump
-- version 3.4.5
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Erstellungszeit: 28. Feb 2012 um 15:52
-- Server Version: 5.5.16
-- PHP-Version: 5.3.8
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Datenbank: `ums`
--
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `tab_ums`
--
CREATE TABLE IF NOT EXISTS `tab_ums` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` text NOT NULL,
`password` text NOT NULL,
`rank` text NOT NULL,
`logins` int(11) NOT NULL,
`lastip` text NOT NULL,
`regip` text NOT NULL,
`regdate` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
PHP-Code:<?php
include('connection.php');
// Es werden keine Fehlermeldungen angezeigt.
//error_reporting(0);
// Der Sicherheitskey, damit das Script nicht von einem Unbefugten benutzt werden kann.
$key = '8s9dj8jfds789fzasd98fzd68sfhasdf890j';
// Der Key muss eingegeben werden, damit das Script benutzt werden kann
$k = mysql_real_escape_string($_GET["k"]);
// Der Benutzername, der erstellt werden soll.
$username = mysql_real_escape_string($_GET["username"]);
// Das Passwort wird im Klartext übergeben, allerdings als MD5 gespeichert.
$password = mysql_real_escape_string($_GET["password"]);
$md5_password = md5($password);
// Der Userrang
$rank = mysql_real_escape_string($_GET["rank"]);
// Die IP-Adresse, von der das Script aufgerufen wird
$ip = $_SERVER["REMOTE_ADDR"];
// Timestamp, daraus wird die Uhrzeit und das Datum erstellt.
$timestamp = time();
$datum = date("d.m.Y - H:i", $timestamp);
// Überprüfung ob der eingegebene Key richtig ist
If ($k == $key)
// Falls ja:
{
// Key ist richtig.
// Eintrag erstellen
$eintrag = "INSERT INTO tab_ums
(username, password, rank, regip, regdate)
VALUES
('$username', '$md5_password', '$rank', '$ip', '$datum')";
// und eintragen
$eintragen = mysql_query ($eintrag);
If ($eintragen == true)
// Wenn der Eintrag erfolgreich war:
{
echo 'Eintrag erfolgreich.';
}
else
// und wenn nicht:
{
echo 'Es ist ein Fehler aufgetreten. <br>'.mysql_error;
exit(0);
}
}
else
// Falls nein:
{
// Key ist nicht richtig.
echo 'Der Key ist nicht richtig.';
exit(0);
}
?>
PHP-Code:http://localhost/ums/reg.php?k=8s9dj8jfds789fzasd98fzd68sfhasdf890j&username=Nico&password=hallo&rank=Admin
Beim nächsten Update werde ich versuchen MySQLi zu verwenden.
LG
Ähnliche Themen
-
Unterschied zwischen "ChicaPC-Shield" und "Malwarebytes Anti-Malware"?
Von Accountuser im Forum WindowsAntworten: 1Letzter Beitrag: 29.12.2013, 14:31 -
[Vorschlag] "Erledigt" und "Gelöst"-Status für Frage-Threads
Von Sky.NET im Forum FeedbackAntworten: 1Letzter Beitrag: 16.04.2013, 16:44 -
"Wer ist online" & "Forum-Mitarbeiter" stimmen nicht überein
Von Devon im Forum SupportAntworten: 2Letzter Beitrag: 29.09.2012, 15:24
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.