Skip to content
This repository has been archived by the owner on Nov 3, 2023. It is now read-only.

set Methode in Contao\Database\Statement escaped Keys nicht #6909

Closed
xat opened this issue Apr 22, 2014 · 11 comments
Closed

set Methode in Contao\Database\Statement escaped Keys nicht #6909

xat opened this issue Apr 22, 2014 · 11 comments

Comments

@xat
Copy link

xat commented Apr 22, 2014

Mir ist aufgefallen, dass in der set Methode der Contao\Database\Statement Klasse zwar die Values des reingereichten Arrays escaped werden, nicht aber Keys.

Siehe: https://github.com/contao/core/blob/master/system/modules/core/library/Contao/Database/Statement.php#L187

Ist das Escapen der Keys prinzipiell dem Entwickler ueberlassen oder sollte hier im Core auch noch eine Pruefung stattfinden?

@leofeyer
Copy link
Member

Was willst Du denn bei den Keys groß escapen? Das sollten ja immer Feldnamen in der Datenbank sein und da gibt es keine Sonderzeichen.

@xat
Copy link
Author

xat commented Apr 25, 2014

Jo, Feldnamen duerfen halt auf keinen Fall ungeprueft vom Frontend kommen. Z.b. aus einem Formular indem die Namen der Inputs den Spaltennamen entsprechen. Was ja an fuer sich logisch ist. Dennoch dachte ich z.B. (bevor ich mir die Implementierung angeschaut hab) dass mich die set Methode nochmal zusaetzlich schuetzt da sie ja Bestandteil eines prepared Statements ist.

@leofeyer
Copy link
Member

Gibt es einen konkreten Fall, anhand dessen ich das nachvollziehen könnte?

@aschempp
Copy link
Member

Was ist mit ->set() ? Da werden ja alle Keys einfach übernommen?

@xat
Copy link
Author

xat commented Apr 25, 2014

@leofeyer

Ich kann dir keine Stelle nennen wo die Spaltennamen nicht vorab nochmal ueberprueft werden. Allerdings hab ich jetzt auch nicht den kompletten Contao Code einem Audit unterzogen, daher kann ichs auch ned ausschliessen dass es nicht doch irgendwo ne Stelle gibt wo der Key vom User kommt. Und die eine oder andere Extension schwirrt da draussen sicherlich rum die nen ->set($_POST) macht.

Spricht denn generell was dagegen die Keys jeweils nochmal mit einem -Zeichen zu umhuellen und davor die -Zeichen im Key-Namen durch einen Leerstring zu ersetzen?

@leofeyer
Copy link
Member

Ja, die Tatsache, dass wir nirgends Tabellen- oder Feldnamen escapen, weil das MySQL-spezifisch ist und sonst den DBAL zerschießt.

@discordier
Copy link
Contributor

Ehm, das escapen muss auch der Treiber selbst machen.
Schnelle Recherche ergab, dass das Quoten mitnichten MySQL spezifisch ist (ich kannte es auch schon vorher von anderen DBs).

Jedoch variiert es wie folgt:
SQL-92 specification: <delimited identifier> ::= <double quote> <delimited identifier body> <double quote> (sec 5.2) und somit: CREATE TABLE "WHERE" VARCHAR(1);

Nun wird es aber interessant:

  • MSSQL versteht anscheinend "WHERE" und [WHERE] (letzteres war mir bereits bekannt).
  • Oracle versteht den Standard "WHERE"
  • MySQL versteht nur seine backticks solange man nicht SET GLOBAL SQL_MODE=ANSI_QUOTES;aktiviert, ist dies erfolgt versteht auch MySQL den Standard"WHERE"..
  • Postgres versteht den Standard "WHERE".
  • SQLite versteht den Standard "WHERE" und [WHERE]
  • Sybase versteht anscheinend "WHERE" und [WHERE].
  • DB2 versteht den Standard "WHERE"
  • Apache Derby versteht den Standard "WHERE"
  • H2 versteht den Standard "WHERE"
  • HSQLDB versteht den Standard "WHERE"

Somit ist MySQL der EINZIGE (grosse) der den SQL92 Standard in dieser Hinsicht NICHT per default supported sondern nur mit flag.

Man kann also durchaus eine Treibermethode protected function escapeIdentifier() o.ae. implementieren.

Edith Quellennachweis:
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
http://dba.stackexchange.com/questions/29815/is-there-a-major-rdbms-that-doesnt-allow-column-name-quoting-escaping

@xat
Copy link
Author

xat commented Apr 25, 2014

+1 fuer die abstrakte methode escapeIdentifier() die in den jeweiligen DB Subklassen dann entsprechend implementiert wird.

@leofeyer
Copy link
Member

leofeyer commented Jun 1, 2014

@contao/developers Was ist also hier zu tun?

@Toflar
Copy link
Member

Toflar commented Jun 2, 2014

+1 fuer die abstrakte methode escapeIdentifier() die in den jeweiligen DB Subklassen dann entsprechend implementiert wird.

Ich denke das :) Wobei ich jetzt so frech wäre und Simon für einen PR fragen würde :D

@leofeyer leofeyer added this to the 3.4.0 milestone Jun 19, 2014
@leofeyer leofeyer removed the feature label Jun 19, 2014
@leofeyer leofeyer removed this from the 3.4.0 milestone Jun 19, 2014
@leofeyer
Copy link
Member

Wie am 19. Juni auf Mumble besprochen, wollen wir das nicht unterstützen. Weitere Informationen dazu findest Du z. B. hier: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#quoting-reserved-words

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

5 participants