40
Plugin & Theme Security http://johnford.is/ @iamjohnford

WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

Embed Size (px)

DESCRIPTION

The WordPress Plugin & Theme Security presentation at WordCamp Melbourne February 2011.

Citation preview

Page 1: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

Plugin & Theme

Securityhttp://johnford.is/

@iamjohnford

Page 2: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

SQL Injection

Page 3: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

$wpdb->query("UPDATE $wpdb->posts SET post_title = '$new_title' WHERE ID = $id");

Page 4: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

$wpdb->query("SELECT * FROM $wpdb->usersWHERE user_login = '$username'AND user_pass = '$password'");

Page 5: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

$username = "' OR 1 -- ";$wpdb->query("SELECT * FROM $wpdb->users WHERE user_login = '$username' AND user_pass = '$password'");

Page 6: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

$wpdb->query("SELECT * FROM $wpdb->usersWHERE user_login = '' OR 1 -- ' AND user_pass = '$password'");

Page 7: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

$wpdb->update()

Page 8: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

$wpdb->update( $wpdb->posts, array( 'post_title' => $new_title ), array( 'ID' => $id ));

Page 9: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

$wpdb->insert( $table, $data );

Page 10: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

$wpdb->prepare()

Page 11: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

$wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_name = %s OR ID = %d", $some_name, $some_id);

Page 13: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

XSSCross-site Scripting

Page 14: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

<h1> <?php echo $title; ?></h1>

Page 15: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

$title = '<script>jsCode();</script>';<h1> <?php echo $title; ?></h1>

Page 16: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

<h1> <?php echo esc_html( $title ); ?></h1>

Page 17: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

esc_attr_e()

Page 18: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

<a href="#wordcamp" title="<?php echo $title; ?>"> Link Text</a>

Page 19: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

<?php $title = '" onmouseover="jsCode();'; ?><a href="#wordcamp" title="<?php echo $title; ?>"> Link Text</a>

Page 20: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

<a href="#wordcamp" title="<?php echo esc_attr( $title ); ?>"> Link Text</a>

Page 21: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

esc_textarea()

Page 22: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011
Page 23: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011
Page 24: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

<a href="<?php echo $url; ?>">Link Text</a>

Page 25: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

<?php $url = 'javascript:jsCode();'; ?><a href="<?php echo $url; ?>"> Link Text</a>

Page 26: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

<a href="<?php echo esc_url( $url ); ?>"> Link Text</a>

Page 27: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

<form action="<?php echo $_SERVER['REQUEST_URI']; ?>">

Page 28: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

<form action="<?php echo esc_url( $_SERVER['REQUEST_URI'] ); ?>">

Page 29: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

BAD

<script> var foo = '<?php echo $unsafe; ?>';</script>

Page 30: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

<script> var foo = '<?php echo esc_js( $unsafe ); ?>';</script>

Page 31: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

wp_filter_kses( $data )

Page 33: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

CSRFCross-site Request Forgery

Page 34: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

Noncesaction-, object-, & user-specific

time-limited secret keys

Page 35: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

wp_nonce_field( 'plugin-action_object' )

Page 36: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

GOOD

check_admin_referer( 'plugin-action_object' )

Page 37: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011
Page 39: WordPress Plugin & Theme Security - WordCamp Melbourne - February 2011

eval() = evil