Bug bei Authentifizierung in curl
curl hat in der aktuell verwendeten Version im stabilen Ubuntu 13.10 einen Bug, der sich auch rein bis in die PHP-Scripte auswirkt.
Wenn man bei der Nutzung von curl die Authentifizierung nutzt und im Passwort ein Semikolon enthalten ist (was gute Passwörter ja so an sich haben), dann wird dieses Passwort abgeschnitten. Folgender Beispielcode:
$curlSettings[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC; $curlSettings[CURLOPT_USERPWD] = '1testuser' . ':' . 'pass;word'; $curl = curl_init('https://www.phpgangsta.de/download/curl_auth_test.php'); // content: echo 'Password: '.$_SERVER['PHP_AUTH_PW']; curl_setopt_array($curl, $curlSettings); curl_exec($curl); // should output: Password: pass;word // wrong output: Password: pass
Es wird mittels des curl-Parameters CURLOPT_USERPWD der Username und das Passwort übertragen, und wie man an der Antwort des Servers sieht kommt nur das Passwort bis zum Semikolon beim Server an, es wird abgeschnitten.
Nach ein paar Tests auf unterschiedlichen Systemen stand fest: es liegt nicht an PHP, sondern an der verwendeten curl-Library:
not affected: 5.4.14 (curl 7.19.7) affected: 5.5.3-1ubuntu2.1 (curl 7.32.0) not affected: 5.5.3 (curl 7.22.0) affected: 5.5.9 (curl 7.32.0) not affected: 5.5.9 (curl 7.22.0) not affected: 5.6-alpha2 (curl 7.22.0)
Dann habe ich mir das Changelog angeschaut von curl, um zu sehen ob es bereits in 7.35.0 behoben ist. Folgender Eintrag in Version 7.34.0 behebt den Fehler:
login options: remove the ;options support from CURLOPT_USERPWD http://sourceforge.net/p/curl/bugs/1311/
Zur Sicherheit habe ich es noch selbst getestet, curl in Version 7.35.0 herunterladen, kompiliert und getestet:
wget http://curl.haxx.se/download/curl-7.35.0.tar.gz tar -xzvf curl-7.35.0.tar.gz cd curl-7.35.0 ./configure make src/curl --basic --user "1testuser:pass;word" https://www.phpgangsta.de/download/curl_auth_test.php
7.35.0 ist fehlerfrei.
7.34.0 ist fehlerfrei.
7.33.0 ist fehlerhaft.
Leider gibt es noch kein Update für Ubuntu 13.10.
Der Workaround:
Seit curl 7.19.1 kann man Username und Passwort einzeln übergeben, und PHP beherrscht das seit Version 5.5.0 auch. Statt
$curlSettings[CURLOPT_USERPWD] = '1testuser' . ':' . 'pass;word';
sollte man nun also
$curlSettings[CURLOPT_USERNAME] = '1testuser'; $curlSettings[CURLOPT_PASSWORD] = 'pass;word';
nutzen, da tritt das beschriebene Problem nicht auf, auch mit den fehlerhaften Versionen von curl nicht.