PHP skript pro zákaz surfování během pracovní doby

Jako PHP programátor na volné noze často řeším problém s kolísající koncentrací na práci během dne. Znáte to, chcete si na chvilku odpočinout od programování, tak se podívate na Facebook, mrknete, co nového na Twitteru, přečtete si aktuální zprávy...minuty pomalu letí a než se nadějete, zjistíte, že jste prosurfovali dvě hodiny. Abych se tohoto pokušení vyvaroval, napsal jsem si jednoduchý PHP skript, který mě v pracovní době brouzdat po webu jednoduše nenechá.

Princip je jednoduchý - skript se jednou za čas automaticky spustí, zkontroluje aktuální čas a podle toho upraví soubor /etc/hosts, který mapuje domény na IP adresy. Například tak, že veškeré "rušivé" domény přesměruje na localhost (127.0.0.1).

Nejprve je potřeba vytvořit používané varianty souboru /etc/hosts - pro pracovní dobu a pro zbytek dne. Moje varianta pro pracovní dobu /etc/hosts_workinghours vypadá zhruba následovně:

127.0.0.1 localhost
 
127.0.0.1 aktualne.centrum.cz
127.0.0.1 cs.facebook.com
127.0.0.1 ihned.cz
127.0.0.1 idnes.cz
127.0.0.1 lidovky.cz
127.0.0.1 novinky.cz
127.0.0.1 reflex.cz
127.0.0.1 tyden.cz
127.0.0.1 twitter.cz
127.0.0.1 www.facebook.com
 
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

K nastavení pro zbytek dne stačí jako root zkopírovat aktuálně používaný /etc/hosts.

cp /etc/hosts /etc/hosts_original

Další činností na řadě je samotné napsaní obslužného skriptu, který se postará o přepis souboru /etc/hosts a tím i o blokování nežádoucích domén v definované pracovní době. Ten je skutečně jednoduchý:

#!/usr/bin/php
 
<?php
 
$worktime = array('9:00', '18:00');
 
$current_time = time();
$day = date('w');
$is_working_day = $day >= 1 && $day <= 5;
 
list($hour, $min) = explode(':', $worktime[0]);
$worktime_from = mktime($hour, $min);
 
list($hour, $min) = explode(':', $worktime[1]);
$worktime_to = mktime($hour, $min);
 
if ($is_working_day && $current_time > $worktime_from && $current_time < $worktime_to) {
    exec('cp -f /etc/hosts_workinghours /etc/hosts');
} else {
    exec('cp -f /etc/hosts_original /etc/hosts');
}
 
?>

Dále je potřeba vyřešit otázku přístupových práv - protože k modifkaci souboru /etc/hosts nemá běžný uživatel oprávnění, chceme, aby se skript spouštěl pod privilegovaným účtem. Proto nastavíme jako vlastníka souboru uživatele root

chown root:root /cesta/ke/skriptu
a nastavíme mu přístupová práva včetně tzv. SUID bitu, který systému říká, že má skript spouštět s identifikátorem uživatele, který jej vlastní.
chmod 4755 /cesta/ke/skriptu

Nakonec skript přidáme do cronu pro automatické spouštění v určenou dobu- jako root spustíme
crontab -e
a uložíme do něj informaci, jako často chceme skript spouštět. V mém případě stačí, aby se spouštěl jednou za hodinu, vložím tedy nový řádek
0 * * * * /cesta/ke/skriptu

Tím je vše hotovo a práce na aktuálních projektech je zase o něco radostnější (-:

Čistším (a komplikovanějším) řešením by bylo zprovoznit si na počítači lokální proxy server a nastavit pravidla přístupu (např. Squid + Squidguard). Pro běžně použití ale výše uvedený postup bohatě stačí.

UPDATE: V původní verzi článku byla kontrola přístupu zajištěna pomocí sudo, toto řešení ale vyvolávalo potencionální bezpečnostní riziko.

Re: PHP skript pro zákaz surfování během pracovní doby

Neco podobneho se snazim udelat uz dlouhou dobu, jen chci proste, abych neco spustil a presel do pracovniho provozu, ale tohle je nepouzitelne, potrebuji wildcards v hosts (mam win, nevim jestli je to jine v lin), abych mohl zakazat treba *.twitter.com - protoze mame (www/m/api).twwitter.com, atd. a to se neda vypsat uplne vse... treba u facebooku, pokud jsou nejaky remindery, tak to je bez sanci... nejaky tip?

Re: PHP skript pro zákaz surfování během pracovní doby

Wildcards nejsou v /etc/hosts podporované ani na Linuxu. Asi to budete muset řešit přes proxy server nebo firewall, jiná možnost mě nenapadá.

Re: PHP skript pro zákaz surfování během pracovní doby

Bežné nastavení v Ubuntu je se zadáním hesla. Stejně tak myslím i v jiných distrech.

%sudo ALL=(ALL) ALL

Re: PHP skript pro zákaz surfování během pracovní doby

Máte pravdu. A rozhodně je to tak lepší, než mnou uvedené nastavení - tím vzniká poměrně vysoké bezpečnostní riziko. Ještě o tom popřemýšlím, každopádně díky za nakopnutí!

Re: PHP skript pro zákaz surfování během pracovní doby

Už jsem to vyřešil a článek aktualizoval - místo použití sudo skriptu přiřazuji SUID bit.

Re: PHP skript pro zákaz surfování během pracovní doby

A nestačil by tedy v tomto případě extension LeechBlock (https://addons.mozilla.org/en-US/firefox/addon/4476)? Přijde mi, že přes tuto extension je řešení mnohem precisnější.

Nebo modifikace hosts je pro případ, že by si chtěl otevřít jiný prohlížeč, než FF?:-).

Poslat nový komentář

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
  • Povolené HTML značky: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Řádky a odstavce se zalomí automaticky.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <python>, <ruby>. Beside the tag style "<foo>" it is also possible to use "[foo]".

Více informací o možnostech formátování