[php] FPDF compression error

FPDF error: This document (document.pdf) probably uses a compression technique which is not supported by the free parser shipped with FPDI.

Technique rapide pour reconvertir le fichier PDF:

apt-get install imagemagick

# Doc: http://www.imagemagick.org/script/command-line-options.php#density
convert -density 120 -compress zip document.pdf document.pdf

Rewriting – Afficher une image différente en fonction du langage

Pour cet exemple, je voudrais que sur mon site mon logo soit différent en fonction du langage du visiteur.

Toutefois, l’adresse de l’image doit rester la même, c’est à dire: http://monsite/images/logo.png

1/ Dans mon dossier /images/ je créé 2 dossiers “fr” et “en”, je place à l’intérieur mes deux logos différents mais avec le même nom de fichier et extension.

directories

2/ Toujours dans /images/, je créé un fichier .htaccess, qui va me permettre de rediriger toute les demandes vers un script PHP:

RewriteEngine On
RewriteRule ^(.*\.(png|jpg|gif))$ images.php [L]

3/ Enfin, je créé le script PHP pour afficher l’image que je veux:

<?php

if( isset( $_SERVER['REQUEST_URI'] ) ) {

    // l'image demandé
    $image =  rtrim($_SERVER['REQUEST_URI'], '/');
    $image = substr($image, strripos($image, '/') + 1);

    // on récupère la langue
    $lang = get_language(); // à vous de la déterminer

    // le dossier où ce trouve l'image
    $path = __DIR__ . '/' . $lang . '/' . $image;

    if( file_exists($path) ) { // le fichier existe

        // le header
        header('Content-Type: image/png');

        // le contenu
        readfile( $path );
        exit();
    }
}

// L'image demandé n'existe pas ?>
<h1>Not Found</h1>

Nb: rajouter une regex pour sécuriser le nom du fichier.

Une piste pour détecter le langage du navigateur: http://stackoverflow.com/questions/1352130/php-language-detection

Les informations collectables sur les visiteurs de votre site

Un récapitulatif sur les informations qu’il est possible de récupérer sur les visiteurs de votre site internet, mais également sur les infos que vous êtes susceptible de laisser lorsque vous naviguer sur internet.

Premièrement, directement du serveur web avec les infos à notre disposition, puis en approfondissant un peu plus, en allant chercher sur d’autres outils.

En PHP, côté serveur

Toutes les informations sur le client sont disponible dans la variable $_SERVER

// Toutes les infos
print_r($_SERVER);

// en-têtes HTTP
print_r(getallheaders());

L’adresse IP

    [HTTP_HOST] => 66.249.75.72

L’adresse IP est l’information la plus fiable car difficilement falsifiable lorsque l’on fait une simple requête HTTP avec son navigateur.

A partir de celle-ci uniquement, il est possible d’obtenir:

avec un Whois: http://whois.domaintools.com/66.249.75.72

  1. Le hostname. avec lequel l’on peut très souvent possible de déterminer le fournisseur d’accès internet (http://en.wikipedia.org/wiki/Hostname)

    Exemple: “Proxad / Free SAS” pour Free (http://whois.domaintools.com/88.165.149.254)

    Voir même la localisation chez les clients Orange, exemple: http://whois.domaintools.com/83.192.84.254

  2. La localisation approximative par Pays ou Continents: France, US, Asie
  3. A qui appartient le block IP: votre FAI, le nom de l’entreprise ou autre
  4. D’autre infos, si c’est une entreprise et avec un peu de chance, un Nom et prénom (celui du boss ou du responsable), une adresse, un mail, un téléphone, etc…

avec un Reserve DNS http://www.domaintools.com/research/reverse-ip/?hostname=66.249.75.72, les noms de domaines associés à l’adresse IP.

avec un Ports scan http://www.t1shopper.com/tools/port-scan/ ou avec nmap: Les services installés sur la machine (ports en écoute et ouvert).

D’autres infos fiables

  1. $hostname = gethostname($_SERVER['HTTP_HOST']);

    Le hostname est aussi récupérable avec la fonction gethostname()

    D’autres fonctions utiles: http://www.php.net/manual/fr/ref.network.php

  2. [REQUEST_URI] => /index.php

    La page demandée par le client

  3. Plus, évidemment, la date et l’heure

Les informations envoyées par le navigateur

Elles sont contenues dans l’en-tête HTTP, elles sont facilement modifiable donc moins fiable (ex. dans Firefox avec le plugin https://addons.mozilla.org/fr/firefox/addon/modify-headers/). Mais elles restent exploitables lorsque c’est jugé “correctement rempli”. Qui s’amuse à changer les en-têtes HTTP, personne… 🙂

  1. [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0

    Le nom du navigateur, sa version, l’OS, le nom du device ou de la rom pour les smarphone Androids/iPhone

    voir même un peu plus pour IE: plugins (flash, silverlight, etc..)

    Voir http://fr.wikipedia.org/wiki/User-Agent

  2. [Accept-Language] => fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3

    Le language, rien d’exceptionnel

  3. [HTTP_REFERER] => 'http://www.google.fr/search?q=php'

    // ou le referer d'un webmail par exemple (plus valable avec du SSL)
    [HTTP_REFERER] => 'http://mail.google.com/inbox'

    Le referer, d’ou vous venez: d’une recherche google par exemple

    En l’analysant un peu l’on peut retrouver le mot clé que vous avez recherché (php dans cet exemple)

En javascript, côté client

Rapidement, les infos supplémentaires

  1. Firefox 18.0 with plugins pdf, flash, java, director, quicktime, windowsmedia, silverlight enabled

    Les plugins installés

  2. Windows 7, 1920x1080 (wide)

    La résolution de l’écran

Exploiter ces informations

N’importe quel outils d’analyse tel que Piwik ou Google analytics sait sortir des statistiques avec ces informations: nombre de visiteurs par jour, les pages les plus visitées, etc..

Exemple avec la démo de Piwik: http://demo.piwik.org

Script PHP pour télécharger les videos sur Youtube

Ce script vous permet de trouver les urls des videos pour pouvoir les télécharger directement, il reste encore à améliorer pour pouvoir l’utiliser réellement en “production”.

Mon but était de voir comment Youtube se protégé contre le téléchargement et visiblement c’est facile à casser: seulement un token à rajouter en bout de chaîne

Le seul point qui me reste à voir c’est s’il y a une détection et un filtrage au niveau de la bande passante si on bourrine le truc, en bouclant sur le téléchargement par exemple :D, Etant donné de l’on passe outre le player, qui lui télécharge la vidéo au fur et à mesure du visionnement.

// On récupère le contenu html de la page
$html = file_get_contents('http://www.youtube.com/watch?v=9bZkp7q19f0');

// On récupère la chaine playerConfig qui nous intéresse
preg_match("/playerConfig = (.*?);/", $html, $playerConfig);

$playerConfig = json_decode( $playerConfig[1] );
// print_r($playerConfig); exit();

// On récupère titre (sa peut servir)
$title = $playerConfig->args->title;

// On récupère la chaine encodé avec les urls
$fsm = $playerConfig->args->url_encoded_fmt_stream_map;
$fsm = urldecode($fsm);
// print_r($fsm); exit();

// On récupère les urls des videos (dans tout les formats)
preg_match_all("/url=(.*?)\,/", $fsm, $urls);
$urls = $urls[1];

// On récupère les signatures
preg_match_all("/sig=(.*?)\&/", $fsm, $signatures);
$signatures = $signatures[1];

print_r($urls);
print_r($signatures);


if( count($urls) !=  count($signatures) ) {
    // On peut avoir des soucis dans ce cas là :)
}

foreach( $urls as $i => &$url ) {

    // On enlève ce qui nous intéresse pas
    if( $pos = stripos($url, ';') )
        $url = substr( $url, 0, $pos );

    // On ajoute la signature
    if( isset($signatures[$i]) )
                $url .= '&signature=' . $signatures[$i];
}

// et voila nos (belles) urls
print_r($urls); exit();

Si quelqu’un a des meilleurs regex je suis preneur, un meilleur algo même 😀

Debian/PHP Connect to MS SQL Server

Se connecter à un serveur MSSQL avec PDO, ODBC et FreeTDS

Sur votre debian installer:

apt-get install freetds-bin freetds-common tdsodbc odbcinst php5-odbc unixodbc

cp /usr/share/doc/freetds-common/examples/odbcinst.ini /etc/odbcinst.ini

Exemple de script PHP:

<?php

try {
    $db = new PDO('odbc:Driver=FreeTDS; Server=192.168.1.2; Port=1433; Database=test; UID=root; PWD=toor;');
}
catch(PDOException $e) {

    die("Unable to open database.<br>Error message:<br><br>$e.");
}

echo '<h1>Successfully connected!</h1>';

$query = 'SELECT * FROM user;';
$statement = $db->prepare($query);
$statement->execute();
$result = $statement->fetchAll(PDO::FETCH_NUM);

print_r( $result );

Source: secure.kitserve.org.uk