SlideShare a Scribd company logo
1 of 15
Download to read offline
infrastruktura webová řešení marketing
NetteUtils a příbuzní:
skryté klenoty
Jan Smitka, @jansmitka
Poslední sobota #68, 31. 1. 2015
NetteIteratorsCachingIterator
2
{foreach $rows as $row}
{if $iterator->first}<table>{/if}
<tr n:class="$iterator->isEven() ? even : odd">
<td>{$row->name}</td>
<td>{$row->email}</td>
</tr>
{if $iterator->last}</table>{/if}
{/foreach}
NetteIteratorsCachingIterator
3
foreach ($iterator = new NetteIteratorsCachingIterator($rows) as $row) {
if ($iterator->isFirst()) {
// ...
}
// ...
}
NetteUtilsStrings
• Regulární výrazy se správným ošetřením chyb:

http://phpfashion.com/zradne-regularni-vyrazy-v-php
• Metody pro práci s řetězci v UTF-8 – používá extension mbstring.
• Pozor na správné použití a míchání s non-multibyte funkcemi a hodnotami!
4
UTF-8 řetězce
5
strlen("Slečna"); // 7
mb_strlen("Slečna", "UTF-8"); // 6
substr("Slečna", 0, 6); // "Slečn"
mb_substr("Slečna", 0, 6, "UTF-8"); // "Slečna"
Příklad špatného použití
6
public static function stripHeaders(CurlWrapper $curl)
{
$curl->responseHeaders = Strings::substring($curl->response, 0,
$headerSize = $curl->info['header_size']);
if (!$headers = CurlWrapper::parseHeaders($curl->responseHeaders)) {
throw new CurlException("Failed parsing of response headers");
}
$curl->response = Strings::substring($curl->response, $headerSize);
return $headers;
}
$curl->info['header_size'] je počet bajtů, nikoliv počet UTF-8 znaků!
NetteUtilsRandom
• generate($length = 10, $charlist = '0-9a-z')
• Ke generování se snaží použít první z následujících metod (závislé na platformě):
• openssl_random_pseudo_bytes (nepoužívá se v PHP 5.3 na Windows)
• mcrypt_create_iv (nepoužívá se v PHP <= 5.3.6 na Windows kvůli bugu v PHP)
• file_get_contents('/dev/urandom') (není dostupné na Windows)
• md5(serialize($_SERVER), TRUE)
• Kromě posledního jsou všechny kryptograficky bezpečné.
• Dále kombinuje s microtime() a lcg_value().
7
NetteSecurityPasswords
• Metody (obdoba password_* z PHP 5.5 – http://php.net/manual/en/ref.password.php)

hash($password, array $options = NULL)

verify($password, $hash)

needsRehash($hash, array $options = NULL)
• Používá algoritmus bcrypt (PHP >= 5.3.7), $options:
• cost – počet iterací (2cost
– opatrně!), možné hodnoty 4-31, default 10. Určení vhodné
hodnoty: http://php.net/manual/en/function.password-hash.php#example-924
• salt – 22 znaková sůl, pokud není zadána, Nette ji náhodně vygeneruje.
8
Vliv parametru cost
• Měřeno na Retina MacBook Pro, 13", Late 2013, CPU Core i5 @ 2.4GHz, PHP 5.5.17
• Měření cost = 14: cca 1.77s.
• Teoreticky cost = 31:

1.77 * 2^31/2^14 = 1.77 * 2^17 = 1.77 * 131 072 = 231997 s = 64.44 h
9
NetteUtilsJson
• Metody

encode($value, $options = 0)

decode($json, $options = 0)
• Ošetření chyb: vyhazuje výjimky NetteUtilsJsonException.
• Opravy chyb v různých verzích PHP:

http://phpfashion.com/how-to-encode-and-decode-json-in-php
10
NetteUtilsFileSystem
• Metody pro práci se souborovým systémem.
• Ošetření chyb – výjimky NetteIOException a některé další.
11
NetteUtilsValidators
• Validace datových typů i formátů – např. délka řetězce apod.
• Umí validovat jednotlivé proměnné, prvky polí, …
• Pěkná dokumentace: http://doc.nette.org/cs/2.2/validators
12
NetteHttpHelpers
• ipMatch($ip, $mask)
• Maska zadána ve tvaru CIDR:

<prefix ip adresy>/<počet bitů shody>
• Příklad: IP adresa 10.10.75.16 vyhovuje všem následujícím maskám:

10.0.0.0/8

10.10.0.0/16

10.10.75.0/24

10.10.75.16/32
13
Dotazy?
14
Děkuji za pozornost.
15

More Related Content

Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)

  • 1. infrastruktura webová řešení marketing NetteUtils a příbuzní: skryté klenoty Jan Smitka, @jansmitka Poslední sobota #68, 31. 1. 2015
  • 2. NetteIteratorsCachingIterator 2 {foreach $rows as $row} {if $iterator->first}<table>{/if} <tr n:class="$iterator->isEven() ? even : odd"> <td>{$row->name}</td> <td>{$row->email}</td> </tr> {if $iterator->last}</table>{/if} {/foreach}
  • 3. NetteIteratorsCachingIterator 3 foreach ($iterator = new NetteIteratorsCachingIterator($rows) as $row) { if ($iterator->isFirst()) { // ... } // ... }
  • 4. NetteUtilsStrings • Regulární výrazy se správným ošetřením chyb:
 http://phpfashion.com/zradne-regularni-vyrazy-v-php • Metody pro práci s řetězci v UTF-8 – používá extension mbstring. • Pozor na správné použití a míchání s non-multibyte funkcemi a hodnotami! 4
  • 5. UTF-8 řetězce 5 strlen("Slečna"); // 7 mb_strlen("Slečna", "UTF-8"); // 6 substr("Slečna", 0, 6); // "Slečn" mb_substr("Slečna", 0, 6, "UTF-8"); // "Slečna"
  • 6. Příklad špatného použití 6 public static function stripHeaders(CurlWrapper $curl) { $curl->responseHeaders = Strings::substring($curl->response, 0, $headerSize = $curl->info['header_size']); if (!$headers = CurlWrapper::parseHeaders($curl->responseHeaders)) { throw new CurlException("Failed parsing of response headers"); } $curl->response = Strings::substring($curl->response, $headerSize); return $headers; } $curl->info['header_size'] je počet bajtů, nikoliv počet UTF-8 znaků!
  • 7. NetteUtilsRandom • generate($length = 10, $charlist = '0-9a-z') • Ke generování se snaží použít první z následujících metod (závislé na platformě): • openssl_random_pseudo_bytes (nepoužívá se v PHP 5.3 na Windows) • mcrypt_create_iv (nepoužívá se v PHP <= 5.3.6 na Windows kvůli bugu v PHP) • file_get_contents('/dev/urandom') (není dostupné na Windows) • md5(serialize($_SERVER), TRUE) • Kromě posledního jsou všechny kryptograficky bezpečné. • Dále kombinuje s microtime() a lcg_value(). 7
  • 8. NetteSecurityPasswords • Metody (obdoba password_* z PHP 5.5 – http://php.net/manual/en/ref.password.php)
 hash($password, array $options = NULL)
 verify($password, $hash)
 needsRehash($hash, array $options = NULL) • Používá algoritmus bcrypt (PHP >= 5.3.7), $options: • cost – počet iterací (2cost – opatrně!), možné hodnoty 4-31, default 10. Určení vhodné hodnoty: http://php.net/manual/en/function.password-hash.php#example-924 • salt – 22 znaková sůl, pokud není zadána, Nette ji náhodně vygeneruje. 8
  • 9. Vliv parametru cost • Měřeno na Retina MacBook Pro, 13", Late 2013, CPU Core i5 @ 2.4GHz, PHP 5.5.17 • Měření cost = 14: cca 1.77s. • Teoreticky cost = 31:
 1.77 * 2^31/2^14 = 1.77 * 2^17 = 1.77 * 131 072 = 231997 s = 64.44 h 9
  • 10. NetteUtilsJson • Metody
 encode($value, $options = 0)
 decode($json, $options = 0) • Ošetření chyb: vyhazuje výjimky NetteUtilsJsonException. • Opravy chyb v různých verzích PHP:
 http://phpfashion.com/how-to-encode-and-decode-json-in-php 10
  • 11. NetteUtilsFileSystem • Metody pro práci se souborovým systémem. • Ošetření chyb – výjimky NetteIOException a některé další. 11
  • 12. NetteUtilsValidators • Validace datových typů i formátů – např. délka řetězce apod. • Umí validovat jednotlivé proměnné, prvky polí, … • Pěkná dokumentace: http://doc.nette.org/cs/2.2/validators 12
  • 13. NetteHttpHelpers • ipMatch($ip, $mask) • Maska zadána ve tvaru CIDR:
 <prefix ip adresy>/<počet bitů shody> • Příklad: IP adresa 10.10.75.16 vyhovuje všem následujícím maskám:
 10.0.0.0/8
 10.10.0.0/16
 10.10.75.0/24
 10.10.75.16/32 13