Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I've run across the following snippet in themes from time to time:

if ( ! defined('ABSPATH')) exit('restricted access');

It's at the beginning of some (all?) PHP files in a theme and it's supposed to prevent direct access of the file by nefarious sources.

I see that this isn't included in Twenty Ten or Eleven and I've never seen it recommended in official WordPress documentation. It seems like a good idea to me, but I also don't know enough about security to judge it and can't find much with Google.

Is this something I should have in my custom themes? If so, should it be in all PHP files or just some?

share|improve this question
3  
Just for later readers, this can be written shorter and nicer: defined('ABSPATH') OR exit; –  kaiser Jan 14 '13 at 16:16
add comment

1 Answer

up vote 7 down vote accepted

Usually, you don’t need it. But … there is at least one edge case:

  • If a theme file is a template part,
  • and it is using global variables from the calling context (parent file),
  • and register_globals is on,
  • and it is just using these variables without any security check …

… an attacker can call this file, set the missing variables with GET or POST and make the theme file print those out. And then there is a security problem.

So … the best option is not a context check like the one from your example, but good code: avoid global variables, check their content before you print it out.

In some cases I add the context check when I think somebody else will use my code and change it without security in mind. It doesn’t hurt.

share|improve this answer
    
If a template part still contained at least one function call that would cause a PHP fatal error would this scenario still be possible? –  Chris_O Aug 25 '12 at 4:52
    
@Chris_O Depends on the order of appearance. –  toscho Aug 25 '12 at 4:57
    
Makes sense and totally agree on another reason not to use global variables between file calls. –  Chris_O Aug 25 '12 at 4:59
1  
It's always best to be safe than sorry. Too much security can't hurt, can it? –  Sean Berg Aug 25 '12 at 17:41
    
If you do everything right, you should not use code that isn’t needed. This question is the proof that it makes code harder to follow. –  toscho Aug 25 '12 at 17:45
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.