Hallo Christian ... Christian Boltz schrieb:
Es können also auch "überraschend" andere Sonderzeichen auftreten? Dann hast Du kurz gesagt ein Sicherheitsproblem... Probier mal, was passiert, wenn als Subject reingelegt \'; DROP * FROM tabelle auftaucht. Achtung, könnte ins Auge gehen!
Ich würde für sowas die Verwendung von Perl _dringend_ empfehlen.
Ich habe da als erstes an PHP gedacht wusste aber leider nicht wie ich mit PHP die Email bearbeiten soll. Also wie ich den Betreff usw. raus filtern soll. Da fiel mir halt nur die bash ein. Aber du hast recht ... ich sollte es mal mit Perl Probieren. Kennst du da mal vielleicht paar Online Quellen wo ich mir paar Beispiele bezüglich Perl und myslq nachlesen kann.
Vorteil: Du kannst über $dbh->prepare() die Abfrage mit Platzhaltern vorbereiten ("SELECT * FROM tabelle WHERE name=?"). Anschließend rufst Du $dbh->execute("Fritz Muster") auf - dabei wird das Fragezeichen in der Abfrage durch den Parameter ersetzt und sämtliche Sonderzeichen automatisch entschärft.
Hört sich vielleicht umständlich an, aber Probleme mit Sonderzeichen aller Art kannst Du zu 100% ausschließen, wenn die Werte erst beim ->execute mit angegeben werden.
Falls Du den Rest des Scripts weiterhin in der Bash erledigen willst, nutze wenigstens das folgende kleine Perl-Script. Das war gerade eine 10-Minuten-Entwicklung von mir und sollte MySQL-Befehle mit variabler Parameteranzahl ermöglichen.
#!/usr/bin/perl -w use strict; use warnings; use DBI; use DBD::mysql;
my $dbh; my $sth;
my $mysqlquery = $ARGV[0]; shift @ARGV;
$dbh = DBI->connect("DBI:mysql:database=dbname;host=localhost", "username", "password" ) || die "Cannot connect to database";
$sth = $dbh->prepare($mysqlquery);
$sth->execute(@ARGV);
# Falls Du Daten (Ergebnis von SELECT) ausgeben willst, brauchst Du noch # etwas in der Art von while($row_hash = $sth->fetchrow_hashref) { print "$row_hash->{name}\n"; } # Das darfst Du aber selbst als Parameter verpacken oder als Schleife # einrichten (foreach $feld in $row_hash oder so ;-)
Das speicherst Du als mysql-simple-perl ab und machst es ausführbar.
Der Aufruf erfolgt dann mit mysql-simple-perl \ "INSERT INTO table (name,ort) values(?,?)" \ "Fritz Muster" \ "Testhausen" oder allgemein ausgedrückt mysql-simple-perl "MySQL-Query" [ Param1 [ Param2 [ Param3 [...] ] ] ]
Und schon bist Du die Sicherheitsprobleme bei Sonderzeichen in den SQL-Werten los.
In diesem Fall eher an der Bash - der INSERT-Befehl selbst ist OK ;-)
Ja, der INSERT Befehl ist auch ok ... hast recht...
Diverse Lösungen mit sed hast Du ja schon gesehen. Trotzdem würde ich für sowas definitiv nicht die Bash verwenden.
So siehst aus!
ABSENDER=`cat /root/Suse_Mails/msg.4Ge | grep -o 'From:[^^]*' | sed s/"<"// | sed s/">"// | sed s/From://`
Darf ich Dir noch ein paar Awards hinterherwerfen? Da wären - der useless-use-of-cat-Award - der useless-use-of-grep-Award - sowie der useless-use-of-multiple-sed-Award ;-)
Darum bitte ich doch. :) Ich weiss selbst das es blödsinnig ist aber was soll ich machen wenn ich mich mit den anderen ausdrücken nicht auskenne. Was bleibt mir da übrig!
Noch da? Dann guck mal, wie das besser geht: ABSENDER=`sed -n '/From:/ s/\(From:\|<\|>\)//p' /root/Suse_Mails/msg.4Ge`
Das ersetzt das cat (sed kann selber lesen ;-)), das grep (siehe /From:/ [1]) sowie die drei sed-Befehle am Stück.
Das ist natürlich die bessere Lösung ... danke .. Da hätte ich da noch ein paar Fragen. Wie kann ich an Perl aus der Bash Variablen übergeben? Kennt da jemand paar Informative Links damit ich es nach lesen kann? gruss tomek