Steve Grunwell / @stevegrunwell
Play along at home! stevegrunwell.github.io/wordpress-security-basics
Source: xkcd
Major releases have version numbers like 4.1 and usually contain new features and functionality.
Point releases (4.0.1) fix bugs and patch security holes.
Point releases are very unlikely to break your site
Major releases require more extensive testing, but are still typically safe
If you're not running a staging instance no time's better than the present to get started
Remember: if core upgrades break your site, it's most likely the theme or plugin that's broken, not core!
Most plugins don't receive nearly the amount of testing and auditing as WordPress core
Read upgrade notices and do your research on plugin updates, especially if you're testing on production
Remember: Each third-party plugin or theme you install increases your level of risk
Create one account for administrative tasks like upgrades or managing plugins
Use a separate account for content authoring
Scripts and botnets normally target "admin" as it's a default user with full privileges
Removing the default username from your site drastically reduces your risk of "drive-by" attacks
Security through obscurity…
Make it difficult for hackers to automate anything against your site by avoiding default settings, filesystem structures, or anything else a hacker might be used to
Not secure in itself but effective in reducing opportunistic hacking
"Keep your head down and hope nobody notices"
Your mileage with all-in-one plugins may vary
WordPress allows you to move your wp-content/ directory to another location
// Absolute server path
define( 'WP_CONTENT_DIR', dirname( __FILE__ ) . '/content' );
// No trailing slash!
define( 'WP_CONTENT_URL', 'http://example.com/content' );
Another example of security through obscurity
WordPress constant that will disable the plugin and theme editors
define( 'DISALLOW_FILE_EDIT', true );
…or disable everything, including the plugin installer
define( 'DISALLOW_FILE_MODS', true );
This will break automatic updates!
Force WordPress to serve login pages over SSL:
define( 'FORCE_SSL_LOGIN', true );
Serve all admin and login pages over SSL:
define( 'FORCE_SSL_ADMIN', true );
Of course, this requires that your site has SSL enabled
Steve Grunwell
Senior Web Engineer, 10up
stevegrunwell.com
@stevegrunwell