PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Bug bei Authentifizierung in curl

without comments

CURLcurl 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('http://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" http://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.

Written by Michael Kliewe

Februar 20th, 2014 at 1:11 pm

Posted in PHP

Tagged with , , ,

Leave a Reply

You can add images to your comment by clicking here.