PHP-ORM (MySQL)
-
zip ist relativ universell... und soo groß wird der kompressionsunterschied ja nicht sein
-
http://www.wobzip.org/file/XOjJP
Zitat:
<span style="visibility: hidden"><a href="http://www.xteenporn.net/" title="deutsch porno">deutsch porno</a><span style="visibility: hidden">deutsch porno</span></a><div style="display: none;">
<a href="http://t0fan.blogspot.com" title="özgün blog">özgün blog</a>
</div>
was macht das da ist das bei euch auch oder hat das die seite einfach unverschämter weise angehängt*PAAANIIKKKKK
Ich dachte im ersten Moment du meintest das kahm von meiner Seite *Schweiss abwisch
Denn mein CMS habe ich KOMPLETT in der letzten Woche geschrieben um mein Interface ausserhalb des Abschlussprojektes einzusetzen, und somit auch ein wenig die Fehlerfreiheit zu Prüfen die mir aufgrund der Gesamtsituation in dem Umfang (also im Produktivem Einstaz, Unittest waren natürclich Verbindlich!! )innerhalb der Realisierung des Projektes nicht möglich war/ist.
Und bei meinem ersten CMS hatte ich XSS Attacken aber naja, aus Fehlern und Räder neu Erfinden lernt man halt .
-
was mir total abgeht und umbedingt geändert werden muss, falls ich es nicht übersehen hab, ist das escapen der parameter also z.b. hier und fast an jeder stelle, wo du einen sql string bastelst, wo die werte vom user kommen
DBC.php zeile: 479
$value="'".$value."'"; if($count) $arg_set .=", "; $count++; $arg_set .= "`".$key."`=".$value;
-
umbedingt -> unbedingt
-
Ich dachte es sollte in der Verantwortung des Anwendungsprogrammiers bzw. der Schicht die darüber liegt liegen. Falls du in dem Zusammenhang das Prüfen und ersetzen auf gefährliche Zeichenfolgen meinst.
Wenn ich dich falsch verstanden habe korrigiere mich bzw. werde noch mal genauer.
EDIT:
Achso es wird gepfrüft ob es ein Numerischer Wert ist, ist es eine Zeichenfolge (also ein String) wird dieser in Hochkommas gesetzt damit selbst "gefährliche" Eingaben bzw. Daten als solche und nicht als Statement Interpretiert werden.
mfg. Patrick
(Edit: schnelle Kommunikation m.E. erfordert nicht das vorhandensein einer 100% korrekten Rechtschreibung (im schreibfluss enstehen fehler, eine korrektur ist zeitwaufwendig!), wesentlich ist das man Fähig ist das Wesentliche zu verstehen bzw. rauszufiltern. Musst also so unswesentliche Fehlerchen hier nicht Verbessern, in einer Fach und Dipl. Arbeit sieht das natürlich anders aus das ist mir durchaus Bewusst )
-
Patrick_C64 schrieb:
Kann ich machen. Allerdings dachte ich es sollte in der Verantwortung des Anwendungsprogrammiers bzw. der Schicht die darüber liegt liegen. Falls du in dem Zusammenhang das Prüfen und ersetzen auf gefährliche Zeichenfolgen meinst.
würd es gleich in die dbc klasse einbauen... wenn ich mich richtig erinnere, ist die funktion auch sehr speziell bzw. benötigt eine mysql verbindungs-kennung und dann muss das in die dbc klasse. und den benutzer der 'library' escapen lassen ist keine gute idee, dafür baut man sich doch eine abstraktionsklasse, damit man solche fehler ausschließt
-
Also so wie Ich dich verstanden habe, ist eigtl. alles im Lot was du angesprochen hast ist gegeben!
Da nur numerische Werte "unescaped" in den Query gelangen ;)! Die Prüfung erfolgt auf unterster Ebene im DBC, welches bis auf Constructor, Connect so wie DatabaseSet und Get im Umfang meines Projektes unrelevant sind, und für sich als eigenständiges Interface betrachtet werden kann. Es stellt lediglich der ORMC und ORMO Klasse Funktionen zur direkten unkomplizierten Kommunikation mit dem DBMS zur Verfügung.
Habe auch schon über mein CMS viel probiert um SQL injection zu provozieren, ohne Erfolg. Also m.E. alles gut, wenn es jemand besser weiss ich lasse mich gerne belehren, das dient ja auch der Sache!
mfg. Patrick
-
http://php.net/manual/de/function.mysql-real-escape-string.php des muss einfach iwo rein... ich finds in keiner datei
-
Du verunsicherst mich
Deswegen habe ich es mal direkt geteset!
Das Beispiel auf der 1. Seite ist 1:1 Lauffähig wenn die Verbindung zu einem DBMS gegeben ist!
Ich habe mal folgene Zeilen beim erstellen einer Person benutzt, also den Namen mit potentiell gefährlichem gefühlt, denke ich zumindeset.
Alles sauber, keine Probleme!, Anscheinend doch einen der Wege genommen die nach Rom führen
$newUser = $ormCUser->NewObject(); $newUser->firstname ="Peter %s \x00 ' SELECT * FROM; \n \r "; $newUser->lastname ="Lustig";
Wenn du es schaffst über das Setzen eines Attributwertes eine SQL Injection auszulösen dann werde ich deinen Ratschlag nochmal berücksichtigen.
Ansonsten sehe ich da erstmal keinen Handlungsbedarf, Bedanke mich aber für deinen Konstruktiven Vorschlag und Beitrag, auch wenn mir dieser momentan nicht relevant erscheint!
mfg. Patrick
-
liegt evtl. an value,ENT_QUOTES); in ORMO.php z. 65 aber wie gesagt, sauber ist das nicht und imho auch nicht in der richtigen klasse. das ist aufgabe der dbc!
htmlspecialchars schrieb:
"'" (einfaches Anführungszeichen) wird nur zu ''', wenn ENT_QUOTES gesetzt ist.
damit schreibst du u.a. "'" statt "'" in deine db und damit völlig falsche werte.
-
['] statt [']
-
Gut vernünftig begründet und mit den Sachen aufgeführt die ich so nicht gesehen habe macht das NUN natürlich Sinn ;)!
Nun gut ich werde es berücksichtigen *grins!
Danke für deine Bemühung (und konstruktive hartnäckigkeit!)!
mfg. Patrick
[EDIT:
DONE!, werde ich ggf. heute noch mit einer bearbeiteten Doku (noch nicht Fehlerfrei!) hochladen. nochmal Danköö!
/EDIT]
-
Patrick_C64 schrieb:
DONE!, werde ich ggf. heute noch mit einer bearbeiteten Doku (noch nicht Fehlerfrei!) hochladen. nochmal Danköö!
Ein paar mehr Samples wären cool.
Wie sieht es zB aus wenn die Tabellen schon bestehen? Muss ich trotzdem jedesmal den Klassen-Code angeben?
Wie sieht es mit referenzen aus, wenn zB zu User noch die Tabelle Gruppe gibt nd daraus eine n:m Beziehung wird?eine kleine Demo App wäre für sowas richtig cool...
doctrine ist aktuell der Standard was ORM in PHP betrifft:
http://www.doctrine-project.org/projects/orm.html
Das ist sicher einen Blick Wert. Das löst viele Probleme relativ elegant.
-
Hi Shade of Mine,
Danke fürs Feedback und die Tipps, ich möchte unbefangen bleiben deswegen schau ich mir Doctrine nicht genauer an. Kenne dies aber.
Nichts gegen Doctrine oder andere, aber ich möchte soweit eigene Wege gehen und frei von äußeren Einflüssen bleiben, Anregegungen und Wünschen stehe ich natürlich aufgeschlossen gegenüber!
Sonst könnte ich ja auch Doctrine nehmen wenn ich etwas ähnliches wollte.
Als Metapha! (ich habe weder Auto noch Führerschein, aber als gute Schilderung finde ich folgendes ganz gut)
Wäre dann als wenn man 2 Autos hätte in unterschiedlicher Farbe, aber eigtl. möchte man zwei grundsätzlich unterschiedliche Autos, alle beide können Fahren, aber jedes für sich hat seine eigenen Vorzüge oder Nachteile in jeweiligen Situationen.
Nun kann man über diese Ansicht diskutiren aber das ist nicht Thema dieses Threads!
B2T, habe mich beigemacht und mal ein weiteres Beispiel zusammengebaut.
Deine Frage ob die Klasse immer beschrieben werden muss, lautet im Moment Ja, bin aber dabei Inspiriert durch deine Frage dies zu ändern, so das man anstatt einen CDS den Tabellennamen angibt und den Parameter ReadOnly auf true setzt im Constructor der ORMC Klasse.
Beziehungen können ohne weiteres Realisiert werden, werden aber seitens des ORM nocht nicht als Fremdschlüssel behandelt, dies wird aber auch noch implementiert, war aber nicht im Umfang des Abschlussprojektes. (sitze aber schon dranne !!!)
Glaube Beziehungen über Schlüsselfelder dienen auch nur dem DB Design und der internen optimierungen im DBMS selber, also unerlässlich für eine funktionierende Datenstruktur sind diese nicht wirklich, dennoch möchte ich diese dem Standard enstrechend unterstützen.
<?php /* Kleines Gästebuch PHP-ORM Sample * ------------------------------------------------------------- * * - der erste erstellte benutzer kann alle beiträge löschen * - es kann als gast oder benutzer ein Eintrag verfasst werden * - ein gast kann sich registrieren * - will man einen beitrag als benutzer senden muss name und * passwort angegeben werden * - wird kein name angegeben ist der beittag ein gastbeitrag */ // phporm inkludieren require_once ("phporm/phporm.php"); // databaseconnector erstellen für die verbindung zum // datenbankserver $DBC = new DBC ("localhost","USER","PASSWORT"); // databaseconnector verbinden if(!$DBC->Connect()) { echo ("Database Connection Error"); exit; } // datenbank festlegen $DBC->DatabaseSet ("orm_testdb"); // tabellenprefix festlegen $DBC->PrefixSet("guestbook_"); // OMRC den databaseconnector $DBC übergeben ORMC::SetDBC($DBC); // abstrakte klasse für eine standard identifikation // beschreiben, attribut ID mit datentyp // bigint uhd primary key sowie autoincrement setzen $CDS = " stdID abstract{ID bigint ainc pkey;}"; // $CDS für orm klasse stdID an den ORMC constructor übergeben // referenze wird nicht benötigt da für abstrakte klassen // keine tabelle angelegt wird new ORMC($CDS); // orm klasse benutzer beschreiben // durch die abstrakte klasse stdID erweitern, so das ein // primary key mit der eigenschaft autoincrement // des datentyps bigint zur verfügung steht $CDS = " benutzer extends stdID { name char(255); pass char(255); }"; // die orm klasse benutzer wird aus dem beschriebenen // $CDS generiert und als instanz $CBenutzer der Klasse ORMC zurückgegeben $CBenutzer = new ORMC ($CDS); // orm klasse eintrag beschreiben // durch die abstrakte klasse stdID erweitern, so das ein // primary key mit der eigenschaft autoincrement // des datentyps bigint zur verfügung steht // für die Beziehung // benutzer : eintrag benutzer (1:n) wird über das // feld benutzer realisiert, in einem späterem update // kann der datantyp weggelassen werden oder der name // der assozierten tabelle bzw. klasse angegeben werden $CDS = " eintrag extends stdID { benutzer bigint; title char(255); text char(1023); zeitstempel timestamp; }"; // die orm klasse eintrag wird aus dem beschriebenen // $CDS generiert und als instanz $CEintrag der klasse ORMC zurückgegeben $CEintrag = new ORMC ($CDS); // das waren die vorbereitungen um die benötigten datenstrukuren zu beschreiben // html specifisch, eingabemaske zur interaktion // bedarf keiner weiteren kommentierung echo '<form action="" method="get">'; echo '<input type="input" name="name"></input> Benutzer<br>'; echo '<input type="password" name="pass"></input> Passwort<br>'; echo '<br><input type="input" name="title"></input> Title<br>'; echo '<textarea type="input" name="textbox" value="text"></textarea> Beitrag<br>'; echo '<br><input type="submit" value="beitrag absenden" name="submit"></input>'; echo '<input type="submit" value="registrieren" name="reg"></input> '; echo '<input type="submit" value="entferne alle" name="deleteall"></input> '; echo '<input type="submit" value="entferne eigene" name="deleteown"></input> '; echo '</form><hr>'; // wenn etwas gesendet wurde, hier findet die verarbeitung statt if (isset ($_REQUEST)) { // $benutzer und $eintrag definieren. $benutzer = null; $eintrag = null; // $name und $pass definieren. $name = ""; $pass = ""; // prüfe ob name und password angegeben wurden if (isset($_REQUEST['name']) ) if (trim ($_REQUEST['name']) ) { // request in variable einlesen $name = $_REQUEST['name']; // request in variable einlesen if (isset($_REQUEST['pass'])) $pass = $_REQUEST['pass']; // wenn registrieren angefordert wurde dann erstelle einen neuen // benutzer mit dem namen und dem Password, wenn dieser // noch nicht existiert if(isset($_REQUEST['reg']) && $name && $pass) { // prüfen ob ein benutzer mit dem namen $name bereits vorhanden // ist, wenn nicht wird dieser erstellt if(!$CBenutzer->ExistObject (array("name"=>$name))) { // neues object (datensatz) erstellen $benutzer = $CBenutzer -> NewObject (); // attribute werden gesetzt und automatisch in die datenbank // synchronisiert $benutzer->name = $name; $benutzer->pass = $pass; // status ausgaben echo "Benutzer '".$name."' Erfolgreich Registriert!<br>"; }else echo "Benutzer Existiert bereits!<br>"; }else // name wurde eingegeben aber keine registrierung angefordert // hole benutzer mit name = $name und pass $=pass aus der datenbank // ist dieser nicht vorhanden ist benutzer false! $benutzer = $CBenutzer -> GetObject (array ( "name" => $name, "pass" => $pass )); } // wenn in der textbox text eingegeben wurde dann // erstelle einen neuen beitrag if (isset($_REQUEST['submit'])) if (trim($_REQUEST['textbox'])) if ( ($name && $benutzer) || !$name ) { echo "Ihr neuer Eintrag <br>"; // hier wird der neue Eintrag erstellt $eintrag = $CEintrag->NewObject(); // der text aus der textbox wird per set übergeben // und steht nun auch in der Datenbank $eintrag->text = $_REQUEST['textbox']; $eintrag->title = $_REQUEST['title']; // setze die ID des benutzers auf das attribut benutzer // des objectes $eintrag, damit ist eine Beziehung // zwischen $CEintrag und $CBenutzer hergestellt if ($benutzer)$eintrag->benutzer = $benutzer->ID; }else // statusausgabe echo "Benutzer nicht vorhanden oder Passwort falsch!<br>"; // prüfe ob löschen angefordert wurde // alle löschen, prüfe berechtigung anhand der benutzer'ID' = 1 if (isset($_REQUEST['deleteall'])) { if ($benutzer && $benutzer->ID == 1 ) $CEintrag->DeleteObjects(); else echo "keine brechtigung!<br>"; } // sollen eigene einträge gelöscht werden, prüfe den benutzer // ist dieser vorhanden lösche die einträge dessen // attribut "benutzer" identisch mit dem Attribut ID des // benuztzers identisch ist if (isset($_REQUEST['deleteown'])) { if ($benutzer) $CEintrag->DeleteObjects(array("benutzer"=>$benutzer->ID)); else echo "keine brechtigung!<br>"; } } // alle einträge in ein assoziatives array lesen // nach ID sortiert absteigend. $Liste = $CEintrag->GetObjects(null,array("ID"=>"DESC")); if($Liste) foreach ($Liste as $eintrag) { $name = "GAST"; $benutzer = null; // prüfen ob der eintrag einem Benutzer angehört // und diesen aus der Datenbank lesen um den namen des benutzers // im eintrag anzeigen zu können. if($eintrag->benutzer) $benutzer = $CBenutzer->GetObject(array("ID"=>$eintrag->benutzer) ); // wurde ein benutzer gefunden packe den namen in die variable $name)) if($benutzer) $name=$benutzer->name; // ausgabe des beitrages echo "<u>".$eintrag->title."</u> von ".$name." am ".$eintrag->zeitstempel."<br>".$eintrag->text."</p>"; } ?>
So änderungen am PHP-ORM und an der Doku vorgenommen, alles neu hochgeladen!
-
schau dir doch mal http://www.php.net/manual/de/function.mysql-pconnect.php an
-
triptop schrieb:
schau dir doch mal http://www.php.net/manual/de/function.mysql-pconnect.php an
scheint als gibts damit probleme, bin auch nicht auf dem laufenden. naja, wie auch immer
-
-
Patrick_C64 schrieb:
ich möchte unbefangen bleiben deswegen schau ich mir Doctrine nicht genauer an. Kenne dies aber.
Nichts gegen Doctrine oder andere, aber ich möchte soweit eigene Wege gehen und frei von äußeren Einflüssen bleiben
Das ist die falsch Einstellung, da gibts gar nichts zu diskutieren. Die Basis jeder wissenschaftlichen Arbeit, eines Projekts oder irgendeiner ähnlich gelagerten Arbeit sollte immer der Vergleich mit bereits existierenden Lösungen bilden. Man muss bereits Vorhandenes genau untersuchen, untereinander vergleichen, dann erst die eigene Idee/Lösung vorstellen und zeigen, worin sie sich unterscheidet, oder warum sie für einen bestimmten Zweck besser ist.
Ein ORM ist ja fast ein Paradebeispiel für sowas. Es gibt dutzende ORM Frameworks (nicht nur in PHP, du könntest auch andere Sprachen für den Vergleich hernehmen). Die unterscheiden sich auch durchaus ziemlich stark. Gerade da wäre es interessant zu zeigen, was andere können, wie man sie benutzt, und wie man das selber besser machen will.
Ich finde sowas selbstverständlich und eines der grundlegendsten Sachverhalten, die man in der Ausbildung/Studium gelernt haben sollte.
-
Patrick_C64 schrieb:
Nun kann man über diese Ansicht diskutieren aber das ist nicht Thema dieses Threads!
-
News !!
Shade of mine schrieb:
Wie sieht es zB aus wenn die Tabellen schon bestehen? Muss ich trotzdem jedesmal den Klassen-Code angeben?
DONE ! Version 1.03b
$MyORMC = new ORMC ("Tabellenname") <- So mehr ist für bestehende Tabellen nicht mehr nötig!
Mechanics schrieb:
Zum einen ist es sehr schlecht, wenn ein ORM Framework nur ein DBMS unterstützt
Kein Thema, siehe den MySQLi DBC, ist zwar kein anderes DBMS aber ich brauch nur einen neuen DBC für das jeweilige DBMS schreiben, ist auch schon geplant, könntest das aber auch machen, anstatt hier nur zu nörgeln !
Hmm So sonst ist erstmal nichts weiter, ich möchte mich nochmal ganz ganz Herzlich bei Shade of Mine und vor allem bei triptop Bedanken (bei triptop für seine echt positive Hartnäckigkeit, mit der er mir einen Denkfehler letzlich so dass ich Ihn auch erkennen konnte aufgezeigt hat!). Nochma dickes Danke an Euch beide!
Würde mich wirklich freuen wenn jemand Interesse am Interface hat bzw. es dem ein oder anderem nützlich sein kann. Bugs werde ich soweit ich drauf hingewiesen werde unverzüglich Beheben.
PHP-ORM, zum Download
http://c64.feuerware.com/page/index.php?topics=cmd&cmd=select&id=11Über konstruktive Kritik, und Vorschläge würde ich mich auch sehr freuen!
schönes Wochenende euch allen!
mfg. Patrick