AZ's Blog » PHP https://azapps.de Einmal mit Profis arbeiten… Sat, 28 Jun 2014 13:46:52 +0000 de-DE hourly 1 http://wordpress.org/?v=4.2.4 Spaß mit Chrome https://azapps.de/blog/2012/10/19/spas-mit-chrome/ https://azapps.de/blog/2012/10/19/spas-mit-chrome/#comments Fri, 19 Oct 2012 14:01:44 +0000 https://azapps.de/?p=145 Chrome macht einige Sachen anders als die „Anderen“. Wenn man im Firefox entwickelt und sich dann die Sachen im Chrome anschaut kann es passieren, dass da gar nichts funktioniert.

Es liegt wohl eher daran, dass Chrome die Sachen „richtiger“ macht als die anderen, aber wenn man nicht daran denkt, kann man ziemlich lange den Fehler suchen. Hier die Sachen, die mir aufgefallen sind:

(Es geht übrigens um JavaScript und PHP 😉 )

Objekte

Angenommen, du willst eine Sortierte Key–Value– Liste an den Browser per JSON schicken und JavaScript soll die dann anzeigen.

PHP-Code (kann auch ne andere Sprache sein:

<?php
echo json_encode(array(
  'foo'=>'bar',
  'bla'=>'blubb'
));
?>

Dann dürfte beim Browser ungefähr folgendes ankommen:

{'foo':'bar','bla':'blubb'}

Soweit so klar. Bei einem Firefox, IE, etc… kann man mit JavaScript auf dieses Objekt in der „richtigen“ Reihenfolge zugreifen. Chrome sortiert das Objekt aber so, wie es will. Das ist laut JS-Spezifikation auch vollkommen ok, nur sollte man einfach darauf achten.

So macht man es richtig: (und besser)

<?php
echo json_encode(array(
  array('foo'=>'bar'),
  array('bla'=>'blubb')
));
?>

Das erzeugt folgenden JSON-Code:

[
  {'foo':'bar'},
  {'bla':'blubb'}
]

Man muss dazu natürlich auch den JavaScript-Code umschreiben, das ist dann aber Standartkomform und funktioniert in allen Browsern.

[edit]

Die Alternativvariante wäre noch Folgende:

<?php
echo json_encode(array(
  array('key'=>'foo','val'=>'bar'),
  array('key'=>'bla','val'=>'blubb')
));
?>

[/edit]

Variablendeklarationen

Es sei folgender JS-Code gegeben:

function foo(blubb) {
  if(typeof(blubb)!='Object'){
    return
  }
  var blaaa=blubb.foo;
}

Beim FF & Co macht dieser Code keine Probleme. Wenn die Funktion im Chrome aber mit einem Nicht-Objekt aufgerufen wird, schmeißt dieser einen Fehler. Warum?

Dies liegt daran, dass Chrome alle Variablendeklarationen, die mit var … anfangen stets an den Anfang der Funktion schieben. Man kann nun entweder die Variablen am Anfang der Funktion ohne Wert deklarieren oder man lagert die Variablen in einen else-Zweig aus.

Dateiupload

Das Chrome Uploads anders behandelt, als man es gewöhnt ist, habe ich bereits hier beschrieben.

]]>
https://azapps.de/blog/2012/10/19/spas-mit-chrome/feed/ 0
PHP – Probleme mit dem Datei-Upload in Google Chrome https://azapps.de/blog/2012/10/03/php-probleme-mit-dem-datei-upload-in-google-chrome/ https://azapps.de/blog/2012/10/03/php-probleme-mit-dem-datei-upload-in-google-chrome/#comments Wed, 03 Oct 2012 12:36:57 +0000 https://azapps.de/?p=135 Google Chrome tanzt beim Datei-Upload aus der Reihe. Mein Formular funktioniert in allen Browsern (sogar IE) außer dem Chrome.

Das Problem ist, dass Chrome numerische Werte im $_FILES-Array benötigt.

Die Lösung ist dementsprechend einfach. Statt

<form action="index.php" method="post" enctype="multipart/form-data">
<label for="file">Datei:</label><br />
<input type="file" name="file" id="file"/><br />
<input type="submit" value="Upload" />
</form>

Muss man das Formular zu

<form action="index.php" method="post" enctype="multipart/form-data">
<label for="file">Datei:</label><br />
<input type="file" name="file[]" id="file"/><br />
<input type="submit" value="Upload" />
</form>

abändern und im PHP-Code noch statt auf

$_FILES['file']['tmp_name']

auf

$_FILES['file']['tmp_name'][0]

zugreifen.

]]>
https://azapps.de/blog/2012/10/03/php-probleme-mit-dem-datei-upload-in-google-chrome/feed/ 1
msmtp für E-Mailversand (auch für PHP) https://azapps.de/blog/2012/08/07/msmtp/ https://azapps.de/blog/2012/08/07/msmtp/#comments Tue, 07 Aug 2012 09:30:54 +0000 https://azapps.de/?p=52 Wenn man keinen eigenen Mailserver laufen hat und trotzdem E-Mails vom Server aus verschicken möchte, kann man einfach einen vorhandenen SMTP-Server nutzen und den E-Mail-Versand darüber abwickeln. Dafür eignet sich das Paket MSMTP hervorragend. Es ist einfach zu konfigurieren und sehr flexibel.

Bis vor kurzem habe ich SSMTP benutzt, doch dieses Paket wird laut ArchWiki seit 2009 nicht mehr weiterentwickelt. Außerdem ist MSMTP wesentlich flexibler, da man viele unterschiedliche Accounts nutzen kann.

Installation und Einstellungen

Die Installation geht wie immer ganz einfach über deinen Paketmanager:

sudo aptitude install msmtp

Wenn du zentrale Accounts nutzen willst, von denen aus jeder auf deinem Server E-Mails verschicken kann, dann erstelle die Datei /etc/msmtprc mit folgendem Inhalt:

defaults
tls on
tls_starttls off
tls_trust_file /etc/ssl/certs/smtprelaypool.cer

account default
host smtprelaypool.ispgateway.de
port 465
user foo@example.com
password geheim
auth plain
from foo@example.com
logfile /var/log/msmtp.log

Das sind die Einstellungen, die du brauchst, wenn du E-Mails über einen Provider verschickst, der den ispgateway.de nutzt. Bei GMail musst du darauf achten, den Port auf 587 zu setzen. Bei einigen Servern solltest du auch statt »auth plain« »auth on« benutzen. Ansonsten ist die Datei selbsterklärend. Bei dem Zertifikat lohnt es sich erst zu schauen, ob es nicht schon hier vorhanden ist: /etc/ssl/certs/ca-certificates.crt. Ansonsten gibt es das aktuelle Zertifikat bei deinem Provider.

Das tolle an MSMTP ist, dass du mehrere Accounts anlegen kannst: Erstelle einfach einen neuen Abschnitt in der gleichen Datei, der mit account ACCOUNTNAMEanfängt, den Rest kannst du von oben abschauen. Außerdem kann jeder Nutzer eine unter ~/.msmtprc seine eigenen Accounts anlegen.

Testen

Um zu testen, ob der Versand funktioniert kannst du einfach folgenden Befehl nutzen:

echo -e "Subject: Test Mail\r\n\r\nDas ist eine Test-Mail" |msmtp --debug --from=foo@example.com -t bar@example.com

Bei –from trägst du bitte die E-Mail die in der Konfiguration bei from steht ein. und -t ist die Empfängeradresse. Wenn es nicht klappt, dann musst du schauen, was du in der Konfigurationsdatei falsch gemacht hast. Du kannst relativ einfach aus den Log-Meldungen ablesen, was den Fehler verursacht hat.

PHP Konfigurieren

Damit PHP die E-Mails über diesen Account E-Mails verschickt, musst du nur eine Zeile in der PHP.ini ändern (/etc/php5/apache2/php.ini):

sendmail_path = /usr/bin/msmtp -t

Danach noch schnell den Apache neu starten und fertig.

Mit diesem PHP-Skript kannst du ganz einfach testen, ob alles geklappt hat:

if ( mail ( 'foo@example.com', 'Test mail', 'Es funktioniert.' ) );
echo 'Mail wurde gesendet';
else
echo 'Fehler';

Quellen

http://www.absolutelytech.com/2010/07/17/howto-configure-msmtp-to-work-with-gmail-on-linux/

]]>
https://azapps.de/blog/2012/08/07/msmtp/feed/ 2
ZeroBin https://azapps.de/blog/2012/08/06/zerobin/ https://azapps.de/blog/2012/08/06/zerobin/#comments Mon, 06 Aug 2012 21:10:48 +0000 https://azapps.de/?p=39 Es kommt öfter mal vor, dass man mal längere Textausschnitte (z.B. Log-Meldungen oder Programmcode) posten möchte, aber man es nicht unbedingt per E-Mail senden, oder in einem Forum eintragen will.

Dafür gibt es seit langer Zeit das tolle Tool PasteBin. Einziges Manko: Die Sachen werden unverschlüsselt gespeichert. Vor einiger Zeit hat Sébastien Sauvage das tolle Tool ZeroBin veröffentlicht, welches Einträge per JavaScript verschlüsselt. So sieht der Server nie, was eigentlich geschrieben wurde.

Ich habe nun einen eigenen ZeroBin-Server laufen, und zwar hier: zero.azapps.de.

Noch ein paar  technische Informationen und Tipps zur Installation:

Technische Informationen

URL

Die URL eines Eintrags ist folgendermaßen aufgebaut:

http://zero.azapps.de/?4c31c4883b6dd29f#A5rWM2NAkRD8QMbaADmDT2fHMaXSwwz2rs09JQVO9Nk=

Der Interessante Teil ist logischerweise der nach dem »?« .

Als erstes steht dort die ID des Eintrags (4c31c4883b6dd29f). Dies ist einfach eine JSON-Datei auf dem Server, die sich PHP holt und an den Browser schickt. Soweit so gut, aber der Interessante Teil ist der nach der Raute. Das ist der Schlüssel zum Ent– und Verschlüsseln. Dieser wird vom Browser nicht an den Server geschickt, also kann der Server selber die Daten nicht entschlüsseln, und außerdem kann man auch über einen unsicheren Kanal mit dem Server kommunizieren, ohne dass ein Angreifer mitlesen kann. Es ist natürlich klar, dass, sobald der Key dem Angreifer bekannt ist, er alles mitlesen kann.

Verschlüsselung

Das eigentlich interessante an ZeroBin ist die Verschlüsselung und Entschlüsselung. Diese funktioniert nämlich im Browser und basiert auf AES-256. Das ist zum heutigen Zeitpunkt ein ziemlich guter Verschlüsselungsalgorithmus. Da dieser Symmetrisch ist, kann man sogar Konversationen mit einem einzigen Schlüssel führen.

Die JavaScript-Implementierung des Algorithmus stammt von der Stanford–Universität: Stanford Javascript Crypto Library.

Installation

Lade dir das aktuelle Script hier herunter, oder noch besser, klone es dir aus dem Git-Repo:

git clone git://github.com/sebsauvage/ZeroBin.git

Dann lege noch folgende Ordner an:

mkdir data
mkdir tmp

Der data-Ordner ist für die Text(JSON)-Dateien (ZeroBin braucht keine Datenbank) und der tmp-Ordner ist für das Template (RainTPL) da. Logischerweise müssen beide Ordner für PHP beschreibbar sein:

chmod 777 -R tmp/ data/

Das wars auch schon. Viel Spaß mit ZeroBin.

Ich werde vielleicht noch versuchen einen Syntax-Highlighter und einen Datei-Upload (Unverschlüsselt :( ) für ZeroBin zu basteln.

]]>
https://azapps.de/blog/2012/08/06/zerobin/feed/ 0