Matthiasnet
Well-known member
- 14 August 2006
- 271
- 7
Hallo,
beschäftige mich in letzter Zeit intensiv mit OOP für PHP5 und Versuche Routinearbeiten in Klassen unterzubringen.
Zum einem habe ich eine MySql-Klasse erstellt und eine Sicherheitsklasse, die mich hoffentlich vor "den meisten" (alle kann man ja leider nie sagen) Hackerangriffe schützt....
Da ich mein Projekt und auch zukünftieg um diese Klasse erweitern möchte, würde ich mich sehr freuen,wenn sich jemand die Zeit nehmen könnte und mal drüberschauen könnte, ob diese so sinnvoll geschrieben ist.
Desweiteren würde ich mich auch über ein Statement freuen, ob ich mit der Sicherheitsklasse mehr oder weniger "sicher" programmieren kann.
Wie gesagt freue ich mich über jede Anwtort, ob Kritik/Verbesserungsvorschläg etc.
Hier ein Online-Besipiel, dass ich erstellt habe: https://www.lachenundspass.de/labor/sicherheitstest.php
Aktualisiert:
config.php
mysql.class.php
sicherheitstest.php
Grüße
Matthiasnet
beschäftige mich in letzter Zeit intensiv mit OOP für PHP5 und Versuche Routinearbeiten in Klassen unterzubringen.
Zum einem habe ich eine MySql-Klasse erstellt und eine Sicherheitsklasse, die mich hoffentlich vor "den meisten" (alle kann man ja leider nie sagen) Hackerangriffe schützt....
Da ich mein Projekt und auch zukünftieg um diese Klasse erweitern möchte, würde ich mich sehr freuen,wenn sich jemand die Zeit nehmen könnte und mal drüberschauen könnte, ob diese so sinnvoll geschrieben ist.
Desweiteren würde ich mich auch über ein Statement freuen, ob ich mit der Sicherheitsklasse mehr oder weniger "sicher" programmieren kann.
Wie gesagt freue ich mich über jede Anwtort, ob Kritik/Verbesserungsvorschläg etc.
Hier ein Online-Besipiel, dass ich erstellt habe: https://www.lachenundspass.de/labor/sicherheitstest.php
Aktualisiert:
config.php
PHP:
<?
define("HOST","localhost");
define("USERNAME","x");
define("DBPW","x");
define("DBNAME","x");
define("ERROR_CODE","2");
// 1 = show errors
// 2 = log errors
?>
mysql.class.php
PHP:
<?
class ExcMySql_critical_error extends Exception
{
public function __construct($Message) {
parent::__construct($Message);
}
}
class ExcMySql_non_critical_error extends Exception
{
public function __construct($Message) {
parent::__construct($Message);
}
}
class mysql
{
public $sql;
public function __construct() {
if (!$this->db = mysql_connect (HOST, USERNAME, DBPW))
throw new ExcMySql_critical_error("DB-Verbindung konnte nicht aufgebaut werden!");
if (!mysql_select_db(DBNAME, $this->db))
throw new ExcMySql_critical_error("DB konnte nicht ausgewählt werden!");
}
public function select($column,$table,$where=false,$order=false,$limit=false) {
// $column wird in string umgewandelt und jedes Element in `` eingeschlossen
$column = mysql::converting($column,1);
$sqlab = "
SELECT $column
FROM `$table`";
if ($where != false) {$sqlab.=" WHERE $where";};
if ($order != false) {$sqlab.= " ORDER BY $order";};
if ($limit != false) {$sqlab.= " LIMIT $limit";};
if (!$sql = mysql_query($sqlab)) {
throw new ExcMySql_critical_error("MySql-Abfrage konnte nicht verarbeitet werden!");
}
else {
//Letzte SQL-Abfrage wird gespeichert
$this->sql = $sql;
}
if (mysql_num_rows($sql) == 0)
throw new ExcMySql_non_critical_error("Die Ergebnissmenge der MySql-Abfrage ist 0!");
return $sql;
}
public function insert($table,$column,$values) {
$sqlab = "
INSERT INTO `$table`
($column)
VALUES
($values)";
if (!mysql_query($sqlab))
throw new ExcMySql_critical_error("Bei der Eintragung der Daten in die Mysql-DB ist ein Fehler aufgetreten!");
if (mysql_affected_rows($this->db) == 0)
throw new ExcMySql_non_critical_error("Es wurde kein Datensatz in die Mysql-DB hinzugefügt!");
}
public function update($table,$values,$where=false) {
$sqlab = "UPDATE `$table` SET $values";
if ($where != false) {$sqlab.=" WHERE $where";};
if (!mysql_query($sqlab))
throw new ExcMySql_critical_error("Datensatz konnte nicht geändert werden!");
if (mysql_affected_rows($this->db) == 0)
throw new ExcMySql_non_critical_error("Es wurde kein Datensatz in der Mysql-DB verändert!");
}
public function delete($table, $where) {
$sqlab = "DELETE FROM `$table` WHERE $where";
if (!mysql_query($sqlab))
throw new ExcMySql_critical_error("Datensatz konnte in der Mysql-DB nicht gelöscht werden!");
if (mysql_affected_rows($this->db) == 0)
throw new ExcMySql_non_critical_error("Es wurde kein Datensatz in der Mysql-DB gelöscht!");
}
private function converting($column,$type) {
//Überprüfung ob $column = string
if (is_string($column)) {
//Aus String wird Array erstellt und trim wird angewand
$column = array_map('trim', explode(',', $column));
}
if ($type == 1){
//Arrayelemente werden um `` ergänzt
for ($i=0;$i < count($column); $i++) {
$column[$i]="`".$column[$i]."`";
}
//Array wird in String umgewandelt
$column=implode(",",$column);
}
return $column;
}
public function fetch_object($column,$table,$where=false,$order=false,$limit=false) {
//Select-Anweißung durchführen
$sql = mysql::select($column,$table,$where,$order,$limit);
//$column wird in Array umgewandelt
$column = mysql::converting($column,2);
//Anzahl der Felder
$numfields = mysql_num_fields($sql);
//Die Namen der Felder werden im Array gespeichert
for($i=0;$i < $numfields;$i++){
$fieldname[$i] = mysql_field_name($sql, $i);
}
//Überprüfung ob Datensätze ausgewählt wurden
if (mysql_num_rows($sql) > 0) { //Wäre es an dieser Stelle möglich mit der evt. geworfenen Exception der select Methode zu arbeiten?
//Arrayelemente werden mit Inhalt aus der DB belegt
while ($row = mysql_fetch_object($sql)) {
for($i=0;$i < $numfields;$i++){
$array[$fieldname[$i]]=$row->$fieldname[$i];
}
}
}
//Arrayelemente werden initialisiert wenn mysql_num_rows($sql) == 0
else {
for($i=0;$i < $numfields;$i++){
$array[$fieldname[$i]]=false;
}
}
return $array;
}
public function fetch_array($column,$table,$where=false,$order=false,$limit=false) {
//Select-Anweißung durchführen
$sql = mysql::select ($column,$table,$where,$order,$limit);
//$column wird in Array umgewandelt
$column = mysql::converting($column,2);
//Anzahl der Felder
$numfields = mysql_num_fields($sql);
//Die Namen der Felder werden im Array gespeichert
for($i=0;$i < $numfields;$i++){
$fieldname[$i] = mysql_field_name($sql, $i);
}
//Überprüfung ob Datensätze ausgewählt wurden
if (mysql_num_rows($sql) > 0) { //gleiches wie oben?
//Arrays werden mit Inhalt aus der DB belegt
while($row = mysql_fetch_array($sql)) {
for ($i=0; $i < $numfields;$i++){
$array[$fieldname[$i]][]=$row[$fieldname[$i]];
}
}
}
//Arrays werden initialisiert wenn mysql_num_rows($sql) == 0
else {
for ($i=0; $i < $numfields;$i++){
$array[$fieldname[$i]][]=$row[$fieldname[$i]];
}
}
return $array;
}
public function __destruct() {
//Schließen der Mysql-Verbindung
if (!mysql_close($this->db))
throw new ExcMySql("MySql-Verbindung konnte nicht geschlossen werden!");
}
}
class security
{
public function secure_text($string) {
$string = trim($string);
$string = htmlentities($string, ENT_QUOTES);
return($string);
}
public function mysql_secure($string,$type=1) {
$string = security::secure_text($string);
if ($type==1) {
if(get_magic_quotes_gpc()) {
$string = stripslashes($string);
}
}
if (!$string = mysql_real_escape_string($string))
throw new ExcMySql_critical_error("Daten konnten nicht für die MySql-DB validiert werden");
return $string;
}
public function output($string) {
html_entity_decode($string);
return $string;
}
}
//Objekt erzeugen
$security=new security;
function user_meldung()
{
echo "HI; Leider ist nen Fehler aufgetretetn";
}
function formular()
{
echo "<br><br>hier da fehler eingeben";
}
function error($typ, $meldung, $datei, $zeile, $kontext)
{
//Array, um Fehlernummern im Klartext darstellen zu koennen
$klartext=array(1=>"Error",2=>"Warning",8=>"Notice",
256=>"User Error",512=>"User Warning",
1024=>"User Notice");
ini_set("track_errors",1); // Tracking einschalten
// enthaelt alle Variablen/Arrays, die spaeter
// nicht ausgegeben werden sollen
$exclude=array("HTTP_POST_VARS","_POST","_GET",
"HTTP_COOKIE_VARS","_COOKIE","HTTP_SERVER_VARS",
"_SERVER","HTTP_ENV_VARS","_ENV","HTTP_POST_FILES",
"HTTP_GET_VARS","_FILES","_REQUEST");
// Alle Variablen abarbeiten
foreach ($exclude as $key) {
// Variable loeschen
unset ($kontext[$key]);
}
ob_start();
print_r($kontext);
$kontext_inhalte=ob_get_contents();
ob_end_clean();
$beschr = "<table style = \"border:2px solid #FF3300\" border=\"1px\" width=\"700px\">
<tr>
<td width=\"100px\"><b>Datum:</b> </td>
<td>". date("d-m-Y H:i:s") ."</td>
</tr>
<tr>
<td><b>Fehlertyp:</b> </td>
<td>$klartext[$typ] </td>
</tr>
<tr>
<td valign=\"top\"><b>Meldung:</b> </td>
<td>$meldung</td>
</tr>
<tr>
<td><b>Datei:</b> </td>
<td>$datei</td>
</tr>
<tr>
<td><b>Zeile:</b> </td>
<td>$zeile</td>
</tr>
<tr>
<td valign=\"top\"><b>Variablen:</b> </td>
<td><pre>$kontext_inhalte </pre></td>
</tr>
</table>";
if (ERROR_CODE == 1) {
echo "$beschr<br><br>";
}
else {
@$fp=fopen("errorsd.php","r");
if ($fp == true) {
fputs($fp,$beschr);
}
else {
try {
if (!$db = mysql_connect (HOST, USERNAME, DBPW))
throw new ExcMySql_critical_error("DB-Verbindung konnte nicht aufgebaut werden!");
if (!mysql_select_db(DBNAME, $db))
throw new ExcMySql_critical_error("DB konnte nicht ausgewählt werden!");
$sqlab = "INSERT INTO `error_log`
(error)
VALUES
('$beschr')";
if (!mysql_query($sqlab))
throw new ExcMySql_critical_error("Bei der Eintragung der Daten in die Mysql-DB ist ein Fehler aufgetreten!");
if (mysql_affected_rows($db) == 0)
throw new ExcMySql_critical_error("Es wurde kein Datensatz in die Mysql-DB hinzugefügt!");
}
catch(ExcMySql_critical_error $fehler) {
echo $fehler->getMessage();
$empf="mgora@online.de";
$subject="Fehler auf xxx.tld";
$subject=urlencode($subject);
$subject=str_replace("%","=",$subject);
$subject=str_replace("+"," ",$subject);
$subject="=?ISO-8859?1?Q?$subject?=";
$body="<html>
<head></head>
<body>
Hallo,<br><br>
da ein aufgetredener Fehler weder in der log-Datei noch in der DB gespeichert werden konnte, wird Ihnen dieser nun per Mail zugesant:<br><br>
$beschr
</body>
</html>";
$hdrs="From: Fehlermanagement xx.tld <webmaster@prov.tld>\n";
$hdrs.="MIME-Version: 1.0\n";
$hdrs.="Content-Type: text/html; charset=\"iso-8859?1\"\n";
$hdrs.="Content-Transfer-Encoding: 8bit\n";
$hdrs.="X-Priority: 1\n";
$hdrs.="Priority: Urgent\n";
$hdrs.="Importance: High\n";
$hdrs.="X-MSMail-Priority: High";
//$hdrs.= "$body\r\n";
if (mail($empf,$subject,$body,$hdrs) == false) {
$formular=true;
}
}
}
switch ($typ) {
case E_WARNING:
case E_USER_WARNING:
case E_USER_ERROR:
user_meldung();
if ($formular === true) {
formular();
}
die;
}
}
}
?>
sicherheitstest.php
PHP:
<?
error_reporting(E_ALL);
include("config.php");
if (ERROR_CODE == 1){
ini_set('display_errors', 1);
ini_set("log_errors",0);
}
else {
ini_set('display_errors', 0);
ini_set("log_errors",1);
ini_set("error_log","(/www/htdocs/w0074849/labor/error.php");
}
include("mysql.class.php");
set_error_handler("error");
function exception_handler($fehler) {
trigger_error($fehler->getMessage());
}
set_exception_handler('exception_handler');
try {
$mysql=new mysql;
$eingabe2=false;
$sql=false;
if (isset($_POST['eingabe1'])): $eingabe1 = $security->mysql_secure($_POST['eingabe1']); else: $eingabe1=false; endif;
if (isset($_POST['eingabe2'])): $eingabe2 = $security->mysql_secure($_POST['eingabe2']); else: $eingabe2=false; endif;
if (isset($_POST['senden'])): $senden=true; else: $senden=false; endif;
if ($senden === true && !empty($eingabe1) && !empty($eingabe2)) {
try {
$mysql->insert("test","ein1, ein2","'$eingabe1' ,'$eingabe2'");
}
catch(ExcMySql_non_critical_error $fehler) {
echo $fehler->getMessage();
}
try {
$ausgabe = $mysql->fetch_object("ein1, ein2","test",false,"'id' Desc");
}
catch (ExcMySql_non_critical_error $fehler) {
echo $fehler->getMessage();
}
echo 'Ausgabe der Eingaben aus der DB:<br>1:'.$security->output($ausgabe['ein1']).'<br>2:'.$security->output($ausgabe['ein2']);
mysql_free_result($mysql->sql);
}
?>
<form action="" enctype="multipart/form-data" method="POST">
Eingabe1: <input name="eingabe1" size="30" value="<? echo stripslashes($eingabe1); ?>"><br>
Eingabe2: <input name="eingabe2" size="30" value="<? echo stripslashes ($eingabe2); ?>"><br><br>
<input name="senden" type="submit" value="Abschicken">
</form>
<br><br>
Ausgabe aller daten:
<table style="width:400px;" border="1px" cellspacing="0" bordercolorlight="#000000" bordercolor="#000000" bordercolordark="#000000">
<?
try {
$ausgabe_alle = $mysql->fetch_array("ein1, ein2","test",false,"`id` DESC");
}
catch (ExcMySql_non_critical_error $fehler) {
echo $fehler->getMessage();
}
echo count($ausgabe_alle['ein1']);
for($i=0;$i < count($ausgabe_alle['ein1']); $i++) {
echo "
<tr>
<td valign=\"top\">".wordwrap($ausgabe_alle['ein1'][$i], 20, "\n", 1)."</td>
<td valign=\"top\">".wordwrap($ausgabe_alle['ein2'][$i], 20, "\n", 1)."</td>
</tr>
";
}
mysql_free_result($mysql->sql);
}
catch(ExcMySql_critical_error $fehler) {
trigger_error($fehler->getMessage(), E_USER_WARNING);
}
?>
</table>
Grüße
Matthiasnet
Zuletzt bearbeitet: