• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Dropdown in DB-Abrage durch Checkbox ergänzen

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #21
Bei dem von dir vorgeschlagenem Code sagt mir phpMyAdmin:


Oder war da was nicht vollständig? Dein Beitrag sieht ja etwas abgehakt aus.


Okay, aber lassen wir das mal Nebensache sein. Ich versuche jetzt den Code vom Eingangspost entsprechend anzupassen. Wenn ich

[src=mysql]SELECT
`Modelljahr`,
...
`Mehrausstattung`
FROM `haupt`, `mehrausstattung`[/src]

ausführe, bekomme ich ja 2 Spalten zurückgegeben. Ich hätte es gerne so, dass wenn einer der Mehrausstattungscodes in der Spalte verfügbar ist, nur eine Spalte zurückgegeben wird, aber auch alle anderen Codes anzeigt werden, sprich so wie hier mit Paint erstellt:



Was wäre denn da das Stichwort, wie ich da vorgehen muss? Oder sollte man es dennoch alles abfragen und das zusammenführen erst danach in PHP durchführen?

Liebe Grüße
HanZ
 
Zuletzt bearbeitet:

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.728
Ort
in der Zukunft
In der Tat kannst du das machen wie es dir besser passt.
Bisher habe ich das meistens in der Anwendung umgesetzt.

Du kannst aber auch so etwas machen wie [src=mysql]SELECT
`Modelljahr`,
...
, Group_Concat(Mehrausstattung order by Mehrausstattung SEPERATOR ', ')
FROM `haupt`, `mehrausstattung` group by haupttabelle.id[/src]

(Ich hoffe mysql versteht haupttabelle.id, ich springe regelmäßig von mssql zu mysql - bzw. aktuell fast nur MSSQL und der Syntax ist nur "ähnlich".. was sie Sache nicht gerade einfacher macht ;) )

zu der Sache mit dem Primary-key:
Eigentlich war das schon vollständig. Es gibt auch irgendwo im phpmyadmin ein Menü zum ändern des Primary-Key - z.B. bei Editieren der Tabellenstruktur? (Habe leider gerade keinen zum testen griffbereit).
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.504
@BurnerR: Wäre schon fürs Internet. Wieso würdest du das nicht machen?
Du solltest zumindest auf OWASP gehen und das Ergebnis in Bezug auf die Häufigsten Angriffsarten checken, insbesondere SQL-Injections.
Gleichzeitig Datenbank/SQL/... lernen und dann das Ergebnis gleich ins Internet stellen ist nicht unbedingt ein guter Weg.
Wenn du auf OWASP warst kannst du das Ergebnis sicher hier auch mal zeigen und dir Feedback einholen.
 

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #24
@drfuture: Perfekt, GROUP_CONCAT war das, was ich gesucht habe. Bis jetzt funktioniert es schonmal größtenteils mit der Ausgabe.
Ein Manko gibt es noch: Wenn ich dann eine Mehrausstattung ausgewählt habe, wird im Ergebnis natürlich auch nur diese angezeigt und nicht die anderen. Gibt es da auch eine elegante Lösung?

Fühl mich fast bisschen schlecht, Fragen über Fragen :( Aber danke schonmal für die bisherige sehr gute Hilfe!



@BurnerR: Danke für den Hinweis. Bevor wir da irgendwas öffentlich machen, werde ich da nochmal alle Kriterien durchlesen und mich informieren. So richtig "ins Internet gestellt" wird das auch gar nicht; das ist vor allem für die Szene und wird nur wenige stark interessieren. Da sich VW aber bis heute weigert Informationen jeglicher Art da für die Community bereitzustellen, wollen wir das jetzt mal selbst machen.
Mir ist aber natürlich auch klar dass es in dem Bezug kein "nur so halb ins Internet gestellt" gibt und wenige Nutzer kein Kriterium für Sicherheit sind :)
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.728
Ort
in der Zukunft
hm - das mit der Auswahl verstehe ich nun gerade nicht ...

edit:
mach nen .htaccess mit einem mind 12 Zeichen langen Benutzer + Passwort, Groß,Klein,Zahl,Sonderzeichen davor (Kann ja jeder Benutzer aus ner Textdatei kopieren bis auf weiteres)
dann ist es sicher ;)
 

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #26
@drfuture: Also ich habe ja einen Eintrag x, und der hat dann z.B. 10 Mehrausstattungen. Wenn ich jetzt danach filter, wer die Mehrausstattung "014" hat, dann soll der Eintrag x erscheinen, aber eben mit ALLEN Mehrausstattungen die Eintrag x besitzt. Mit der Lösung oben wird nur die "014" ausgegeben von SQL.

Das mit der .htaccess meinst du jetzt vorgeschalten auf der Webseite bis ich alles mit SQL-Injection überprüft habe?
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.728
Ort
in der Zukunft
hmmm die Gruppierung sollte eigentlich nach dem Select mit Eingrenzung (Where) stattfinden.
Hast du einen Beispiel-SQL Dump und eine Abfrage die du gemacht hast damit man das mal ausprobieren kann?
 

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #28
Hey zusammen,

mit etwas Hilfe per PN ist es jetzt fast so wie ich es haben wollte. Nur noch kleine Anpassungen und etwas schöneren Code, aber ansonsten funktioniert es grundlegend schonmal. Danke für die ganze Hilfe bis hierher. Wenn ich mich dann mit SQL-Injections beschäftige, melde ich mich hier nochmal.

LG
HanZ
 

braegler

Aktiver NGBler

Registriert
14 Juli 2013
Beiträge
897
Du kannst auch einen entsprechenden MySQL Wrapper verwenden, dann brauchst Du Dich nicht um die SQL Injections kümmern. Mein Favorit ist da MeekroDB.
Sehr einfach einzusetzen und gut abgehangen.
 

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #30
Mal so grundsätzlich gefragt, ich weiß das sollte keine Praxis sein und ist es auch nicht, aber wenn der User der sich mit der Datenbank verbindet nur SELECT-Rechte hat und auch nur für diese Datenbank, dann sind SQL-Injections doch nicht möglich oder?
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.560
@HanZ: Doch auch da.

SQL Injections laufen ja so ab, dass man etwas übergibt, zum Beispiel einen SQL-Befehl, der wenn nicht richtig "escaped" (abgefangen) wurde ausgeführt wird.

Im Grunde ist sowas immer möglich. Häufige Fehler ist zum Beispiel "Blind" einen SQL Querystring zu bilden:
Böse wäre daher:
[kw]"SELECT * FROM table WHERE id=" + id[/kw]

Was hier schief läuft, das "id" wird nicht behandelt sonder blind angehängt. Mit etwas "Voodoo" könnte es passieren das "id" keine Nummer enthält, sondern einen bösartig gestalten Befehl der dann von SQL verarbeitet und ausgeführt wird.

Generell gilt, wenn man zum Beispiel HTML bekommt, [kw]htmlspecialchars[/kw], siehe hier https://www.php.net/manual/en/function.htmlspecialchars.php oder ähnliche Befehle anzuwenden. Und immer daran denken, "User Input ist böse!" ;)

Was auch helfen kann: https://www.php.net/manual/en/function.addslashes.php

Und das Beste: [kw]mysql_escape_string[/kw] https://www.php.net/manual/en/function.mysql-escape-string !
 

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #32
Was könnte denn der SQL-Befehl da dann bewirken? Er hat ja nur Rechte für SELECT. Passwörter ändern oder andere böse Sachen sind da dann ja nicht möglich?
(Mir gehts nur ums Verständnis, ich werde natürlich beachten dass da keine SQL-Injections möglich sind)
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.560
@HanZ: Hm, zum Beispiel könnte "id" so aussehen:

[kw]SELECT * FROM table WHERE id=" + id[/kw]

Zum Beispiel dann einen Subquery: https://www.mysqltutorial.org/mysql-subquery/

Also sowas hier
[kw]1 AND officeCode IN (SELECT officeCode FROM offices WHERE country = 'USA';)[/kw]

Die 1 ist deine ID, soweit ja in Ordnung, aber das was dann als "AND" Code kommt, kann Daten publizieren die du nicht herausgeben wolltest. Im schlimmsten Fall.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.560
@HanZ: Ja.

Wobei:
[src=php]
$placeholder = [":p1", ":p2", ":p3", ":p4", ":p5"];
$filter = [];
$conditions = [];
$nr = 0;

// .... cutout

if ($_POST["Farbe"] != 'Alle') {
$filter[] = $_POST["Farbe"];
$conditions[] = "`Farbe` = " . $placeholder[$nr];
$nr++;
}[/src]

Die Abfrage läuft ja über "$nr" aus den Platzhaltern, das heißt der Nutzer kann theoretisch nur eine Nummer vorgeben und der korrekte Code Part wird dann aus den "$placeholder" herausgesucht. Von daher ist das ziemlich safe. Trotz des Verkettens mit [kw] $conditions[] = "`Farbe` = " . $placeholder[$nr];[/kw].

Aber das Bindvalue tut auch sein übriges. Wenn du es noch verbessern willst, kannst du einen Typen bzw. Einheit für einen Wert mitgeben:
Siehe hier: https://www.php.net/manual/en/pdostatement.bindvalue

Und auch das Implode hier, auch wenn es über Post übergeben wird:
[src=php]f (count($conditions)) {
$query .= " WHERE " . implode(" AND ", $conditions);
}
$query .= " ORDER BY `Preis` DESC";

$select = $db->prepare($query);
foreach ($filter as $nr => $f) {
$select->bindValue($placeholder[$nr], $f);
}[/src]
 
Zuletzt bearbeitet:

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.504
So zu programmieren wird letztendlich zwangsläufig zu SQL-Injections führen. Du solltest direkt umsteigen auf mysql wrapper wie von braegler erwähnt oder prepared statements ausschließlich nutzen. Niemals jemals wieder so ein Muster
Code:
$part_of_my_query = "..." . $var
verwenden.
 
Oben