Сигурност при разработката на
        разширения

         Веселин Николов
             @dzver
          WordCamp Sofia 2012
За мен
За мен


●   Работя с компютри
За мен


●   Работя с компютри
●   В Automattic – WordPress.com
За мен


●   Работя с компютри
●   В Automattic – WordPress.com
●   http://automattic.com/jobs
Сигурност...
Сигурност и плъгини
1. Пароли и хешове
2. XSS
3. XSRF
4. SQL Injection (да, в 2012.)
Пароли и хешове




    ~30%
От сайтовете ползват пароли в
          явен вид.
... и някой знае паролата ви.
Пароли и хешове
1. Пароли
wp_hash_password( 'test' );
-> $P$BGMjSkfCR8K6WlxaIYZvFii89aZ
Пароли и хешове
2. Salts
wp_generate_password( 30 );
-> P*DtBn)1WIGi)ekrSrxwDMXq1*N&Wm
(не пестете байтове)
Пароли и хешове
3. Опасности
error_log( print_r( $_POST ) )
wp_mail( ..., ..., print_r( $_POST ) )
md5( 'нещо предвидимо' )
XSS
XSS
  <?php echo $_GET['name']; ?>


http://myproject.com/index.php?name=<script...
XSS
<?php echo $name; ?>


vs


<?php echo esc_html( $name ); ?>
XSS
●   esc_html
●   esc_url
●   esc_attr
●   esc_js
●   esc_textarea
XSS
Често срещани проблеми:
1. Липса на esc_*
2. Погрешна употреба на esc_* функция
3. Липса или неправилна валидация
4. Typos
XSS
Погрешна употреба на esc_*

<script>
var a = '<?php echo esc_html( $a ) ?>'
var b = <?php echo json_encode( $b ) ?>
XSS
Употреба на esc_* без валидация:

<script src=”<?php echo esc_url( $js ) ?>”>


където
$js = 'http://evil-project.com/js';
XSS
Неправилна валидация на ID-та
1. Проверка вместо cast

if ( intval( $myfield ) )
   echo $myfield;


   // $myfield = '1 <script...';
XSS
Неправилна валидация на ID-та
2. Липса на ^ и $ в regexp

if ( ! preg_match( '/[a-z0-9_-]/i', $myfield ) )
   return 'You are trying to hack me!';


   // $myfield = '<script ...'
XSS
Неправилна валидация на URL


1. . е wildcard.

if ( preg_match ( '!^https?://(www.)*good-host.com/js/!i',
$myjs) ...
// $myjs = http://wwwwgoodhost.com/js
XSS
Неправилна валидация на URL


2. Липсващ /

if ( preg_match ( '!^https?://(www.)?good-host.com!i',
$myjs)
// $myjs = 'http://www.good-host.com.dzver.com/'
XSS
Неправилна валидация на URL


3. Липсващ ^

if ( preg_match ( '!https?://(www.)*good-host.com/js/!i',
$myjs)
// $myjs = 'http://dzver.com/bad.js?http://good-host.com/js/'
XSS
Неправилна валидация на URL


4. Позволен / в хост-а

if ( ! preg_match( '!^https?://[^.]+.whatever.com/.+$!i',
$url ) )
// $myjs = 'http://3254656436/or.whatever.com/evil.js'
// $myjs = '<script.../.whatever.com/'
XSS
Бонус - printf вместо sprintf

esc_html( printf( $name ) )
XSRF
<script>
jQuery.get( '
http://mysite.com/index.php?action=delete_user&user_id=5' );
</script>




<img src=
http://mysite.com/index.php?action=delete_user&user_id=5>
XSRF
Nonces

$nonce= wp_create_nonce( 'my-nonce' );
$url = “...&nonce=$nonce”


if ( ! wp_verify_nonce( $nonce, 'my-nonce' ) )
   wp_redirect()
XSRF
Nonces

wp_nonce_url
wp_nonce_field
check_admin_referer


http://codex.wordpress.org/Wordpress_Nonce_Implementation
http://codex.wordpress.org/Function_Reference/wp_verify_nonce
SQL Injection




$wpdb->prepare()
Защита
●   VaultPress
●   Exploit Scanner

    http://wordpress.org/extend/plugins/exploit-scanner/
Защита
●   Не вярвайте на юзърски инпут
●   Man-in-the-middle HTTPS
●   Внимавайте с редиректите. wp_safe_redirect.
●   Extract може да препокрива променливи
●   Внимавайте с call_user_func, $obj->$var, eval
●   `` винаги с escape_shell_args
?

Сигурност при разработката на WordPress разширения