mikrocontroller.net

Forum: PC-Programmierung PHP Seite um in MySQL zu schreiben


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Fluke (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,
ich suche eine simple und gute Methode um per CodeSys von einer Berghof 
SPS aus in eine MySQL Datenbank zu schreiben.

Mein Ansatz wäre eine PHP Seite in deren URL Parameter mit gegeben 
werden die dann von PHP in die Datenbank schreibt.

Meine Linux Kenntnisse sind gering.
Meine aber mich zu erinnern das es mit ´dem Befehl Wget möglich ist eine 
URL aufzurufen.

Was meint ihr zu meiner Idee?

Danke für Eure Meinung.

PS wäre dieser Weg Sicher oder sehr gefährlich?

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Bewertung
0 lesenswert
nicht lesenswert
Gefährlich ist das nicht, wenn Du die Datenübertragung authentifizierst 
und verschlüsselst (vor allem die Authentifizierung). Dabei müssen die 
Daten auch von evtl. schädlichem Inhalt (MySQL-Injection) befreit 
werden. Dann ist das eine der einfachsten Möglichkeiten, im Internet 
Daten eine ein MySQL-Datenbank zu bekommen.

von diensthabender quotendepp (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Fluke schrieb:
> ich suche eine simple und gute Methode um per CodeSys von einer Berghof
> SPS aus in eine MySQL Datenbank zu schreiben.
>
> Mein Ansatz wäre eine PHP Seite in deren URL Parameter mit gegeben
> werden die dann von PHP in die Datenbank schreibt.

was befindet sich denn zwischen der sps und dem db-server? läuft die 
kommunikation "nur" über ein internes netzwerk, haben die zwei kisten 
sogar ein eigenes, abgeschottetes netz, oder läuft die übertragung über 
das internet?

von Fluke (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ben B. schrieb:
> schädlichem Inhalt (MySQL-Injection) befreit

Was heißt das konkret?

diensthabender quotendepp schrieb:
> was befindet sich denn zwischen der sps und dem db-server? läuft die
> kommunikation "nur" über ein internes netzwerk, haben die zwei kisten
> sogar ein eigenes, abgeschottetes netz, oder läuft die übertragung über
> das internet?

Das Ganze würde über einen VPN Tunnel passieren

Wie ist das mit Wget?

Danke für Eure Hilfe.

von Andi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Fluke schrieb:
> Ben B. schrieb:
>> schädlichem Inhalt (MySQL-Injection) befreit
>
> Was heißt das konkret?

Das ist eigentlich noch die kleinste Hürde.
SQL-Injection bedeutet, dass ein Angreifer über den Weg der 
Parameterübergabe SQL Anweisungen an Deine Datenbank senden kann.

Nehmen wir mal an, du würdest auf einfachste Weise eine Variable in eine 
Datenbank schreiben, z.B.

mysql_query("UPDATE tabelle SET spalte = $VARIABLE");

Und wenn $VARIABLE einfach nur den Übergabeparameter Deines Requests 
enthalten würde, dann wäre es ein leichtes, SQL zu injezieren... z.B. 
wenn der requestparameter so aussieht:

$VARIABLE = "Neuer Wert\"; truncate tabelle;"

... denn dann wäre Deine Tabelle anschließend leer.

Aber wie gesagt, dafür bietet PHP bereits ausreichend Methoden.


Ob ein VPN allein ausreichend Schutz bietet, kommt auf Deine Umgebung 
an.

Aber auch da gibt es Möglichkeiten.
Z.B. könntest Du den Webserver so konfigurieren, dass er einen Request 
nur von einem bestimmten Client zulässt.
Oder man verwendet ein Zertifikat zur Authentifizierung.
Eine HTTP-Authentifizierung bringt auch Sicherheit.

Aber grundsätzlich geht das schon, so wie Du es vor hast.

[SPS]----> <wget --post-data "parameter=wert" URL> ---(VPN-Tunnel) ---> 
Webserver ----> <PHP Skript> ----> Datenbank

von Fluke (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Andi schrieb:
> SPS]----> <wget --post-data "parameter=wert" URL> ---(VPN-Tunnel) --->
> Webserver ----> <PHP Skript> ----> Datenbank

Danke für die Ausführliche Antwort.
Das VPN ist mit Zertifikat zur Authentifizierung.

Wie ist es mit wget? Wird da immer die Seite downloadet?

Wie muss ich den Wget Befehl schreiben?

von Andi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Fluke schrieb:
> Wie ist es mit wget? Wird da immer die Seite downloadet?

"Die Seite"?

Also sinnvollerweise gibt Dein PHP Skript am anderen mindestens einen 
HTTP Statuscode zurück, da mit wget clientseitig auch mit einem 
Erfolgstatus beendet wird.

Wie der Aufruf erfolgt suchst Du Dir am besten hier zusammen:

https://www.gnu.org/software/wget/manual/html_node/index.html

Das kann Dir hier niemand sagen, weil keiner Deine Umgebung kennt...

von Weinbauer (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
$_GET
mysqli_realescape_string
$_SERVER

von Fluke (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Weinbauer schrieb:
> $_GET
> mysqli_realescape_string
> $_SERVER

was meinst du damit?

von Daniel F. (df311)


Bewertung
-1 lesenswert
nicht lesenswert
Fluke schrieb:
> Weinbauer schrieb:
>> $_GET
>> mysqli_realescape_string
>> $_SERVER
>
> was meinst du damit?

das sind stichworte, um die suchmaschine des geringsten misstrauens 
damit zu füttern. oder einfach php.net, das liefert die gleichen 
informationen.

von Fluke (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Daniel F. schrieb:
> das sind stichworte, um die suchmaschine des geringsten misstrauens
> damit zu füttern. oder einfach php.net, das liefert die gleichen
> informationen.

Lach "misstrauens"
Danke

von DPA (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Fluke schrieb:
> mysqli_realescape_string

O gott nein, lasst den Blödsinn! Nehmt lieber prepared statements, statt 
da selbst was zusammenzubasteln.
https://www.php.net/manual/en/mysqli.prepare.php

Wobei, von mysqli würde ich auch abraten, nehmt PDO, dann kann man 
später einfacher auf andere DBs wechseln.
https://www.php.net/manual/en/book.pdo.php

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Bewertung
0 lesenswert
nicht lesenswert
Jetzt fängt der Formatkrieg wieder an... wir sind alle verloren!

von Sheeva P. (sheevaplug)


Bewertung
1 lesenswert
nicht lesenswert
Fluke schrieb:
> ich suche eine simple und gute Methode um per CodeSys von einer Berghof
> SPS aus in eine MySQL Datenbank zu schreiben.
>
> Mein Ansatz wäre eine PHP Seite in deren URL Parameter mit gegeben
> werden die dann von PHP in die Datenbank schreibt.
>
> Meine Linux Kenntnisse sind gering.
> Meine aber mich zu erinnern das es mit ´dem Befehl Wget möglich ist eine
> URL aufzurufen.

Im Prinzip kannst Du mit jeder Skriptsprache in die meisten Datenbanken 
schreiben. Meine persönliche Wahl wären zwar Elasticsearch und curl, 
aber da geht es primär um Geschmack und Erfahrung -- außer beim 
Elasticsearch, das hätte nämlich womöglich ein paar grandiose Vorzüge. 
Einer davon ist, daß Elasticsearch direkt mit JSON-Daten beschickt 
werden kann und Du dann keine Zeile Code auf der Linuxmaschine schreiben 
müßtest. Ein anderer ist, daß es für Elasticsearch mit Kibana eine sehr 
leistungsfähige Webapp zur Exploration, Analyse und Visualisierung der 
Daten gibt. Wenn Du ohnehin wenig Erfahrung außerhalb von CodeSys hast 
und so wenig eigenen Code wie möglich schreiben willst, ist das IMHO ein 
viel besserer Ansatz. Wenn Du magst, helfe ich Dir gerne bei den ersten 
Schritten... ;-)

> PS wäre dieser Weg Sicher oder sehr gefährlich?

Das ist im Grunde die wesentlich schwierigere Frage -- zumal Du nicht 
sagst, was Du mit "sicher" meinst, denn Sicherheit hat viele Aspekte. 
Der erste ist das, was die meisten Menschen ad hoc unter Sicherheit 
verstehen: können dort vorhandene Daten abgehört, manipuliert, oder 
gelöscht, oder womöglich auch falsche Daten injiziert werden? Fangen wir 
einfach mal mit diesem Aspekt der Datenveränderung an.

Um zu verhindern, daß nur derjenige die Daten schreiben darf, der dazu 
authorisiert ist, braucht es mindestens drei Dinge: die 
Authentifizierung, welche sicherstellt, daß jeder der beiden 
Kommunikationspartner derjenige ist, für den er sich ausgibt -- sowas 
kennen die meisten, wenn sie sich mit Benutzernamen und Paßwort an einer 
Webseite wie diesem Forum anmelden -- sowie einer Autorisierung, die im 
zweiten Schritt sicherstellt, daß der so authentifizierte Benutzer nur 
auf das zugreifen darf, was ihm erlaubt ist. Dritter Schritt wäre dann 
die Plausibilisierung, welche überprüft, ob die eingelieferten Daten die 
erwarteten Datentypen und Wertebereiche haben, um zu verhindern, daß 
eine wildgewordene Datenquelle den Datenbestand mittels unsinniger Daten 
invalidiert.


Ein weiterer Aspekt ist die Verfügbarkeit der Daten, mit Monitoring und 
Backups und solchen Dingen. Das Gesetz vom guten alten Murphy sagt, daß 
alles schiefgeht, was schiefgehen kann -- und aus der Erfahrung kann ich 
Dir sagen: Murphy hat Recht, genau so ist es. Was passiert, wenn Dein 
Server rebootet werden muß und daher für einen gewissen Zeitraum keine 
weiteren Daten entgegennehmen und speichern kann? Was ist, wenn das bei 
Deiner SPS passiert, und sie keine Daten liefern kann? Es gibt da eine 
ziemlich umfangreiche Reihe von Dingen, die man tun kann, angefangen bei 
einer Pufferung der Daten auf der SPS, bis der Server bestätigt hat, daß 
sie korrekt in die Datenbank geschrieben wurden, bis hin zu einer echten 
Hochverfügbarkeitslösung -- das hängt davon ab, wieviel Datenverluste Du 
bei einem desaströsen Problem akzeptieren kannst. (Auch hier könnte ein 
Elasticsearch ein paar Vorteile bieten, weil es bereits eine eingebaute 
verteilte Clusteringlösung mitbringt.)

Je nach Deinen Anforderungen ist womöglich auch ein Monitoring 
notwendig, das die Software selbst (Laufen die Prozesse? Funktioniert 
ein Heartbeat? etc...), die Logdateien und die Daten überwacht und Dich 
alarmiert, wenn irgendwas schiefläuft... und das kratzt nur an der 
Oberfläche, dazu kann man viele Dutzend Seiten lange Abhandlungen und, 
sogar wenn man auf eine etablierte Standardlösung wie Zabbix, Icinga, 
Elasticsearch (ja, wieder, diesmal aber mit kommerziellen 
Erweiterungen), Opsgenie oä. setzt, viele tausend Zeilen Software für 
Agenten, Loganalyse, Heartbeat, Reporting und so weiter schreiben.

Letzten Endes beginnt aber alles mit der Definition Deines 
Anwendungsfalls und einer darauf basierenden Risikoanalyse. Leider sagst 
Du aber gerade dazu nicht sehr viel, insofern es sicherlich hilfreich 
wäre, zu sagen: was für Daten möchtest Du denn sammeln, und wozu sollen 
sie benutzt werden? Sind die Daten im Fehlerfall reproduzierbar? Hast Du 
ein finanzielles oder zeitliches Budget, das einzuhalten ist?

von Sheeva P. (sheevaplug)


Bewertung
0 lesenswert
nicht lesenswert
DPA schrieb:
> Fluke schrieb:
>> mysqli_realescape_string
>
> O gott nein, lasst den Blödsinn! Nehmt lieber prepared statements, statt
> da selbst was zusammenzubasteln.
> https://www.php.net/manual/en/mysqli.prepare.php
>
> Wobei, von mysqli würde ich auch abraten, nehmt PDO

In PHP Doctrine, in Perl Class::DBI, in Python SQLObject oder 
SQLAlchemy... Für alles außer High-Performance ist ein OR-Mapper immer 
die bessere Wahl, und auch aus den genannten Frameworks kann man 
jederzeit den DB-Handle oder eine Connection aus dem Pool bekommen und 
natives Zeug machen. Das ist dann zwar womöglich nicht portabel zu 
anderen Datenbanken, reduziert jedoch die zu ändernden Stellen auf ein 
Minimum.

Ansonsten ist pgFouine immer ganz nett, wenn man wissen will, welche 
Query wie oft und wie lang auf einer PostgreSQL-Datenbank läuft und wo 
man daher sinnvollerweise mit Optimierungen ansetzt -- wenn man sowas 
denn ernsthaft optimieren muß, für überschaubar große und periodisch 
anfallende Meßdaten reicht ja vermutlich sogar SQLite...

von Fluke (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Sheeva P. schrieb:
> von
>
>         Sheeva

Danke für deine Super Erklärung und dein Angebot.
Ich werde mal Prüfen was ich genau brauche.
Werde dann gegebenen Fall auf dein Angebot zurück kommen

Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.