Why use an anonymous function? That seems less readable than declaring
function get( $varName ), and the explanation of anonymous functions
distracts from your point, which is that you should always filter input.

But yeah, quick tutorials tend to over-simplify. Writers make a lot of
assumptions about readers' awareness of security issues and good coding
practices. It's a fundamental problem -- PHP is easy to learn, but a
security mindset is difficult to teach.


Chris Snyder
http://chxor.chxo.com/


On Wed, May 21, 2014 at 11:09 AM, Gary Mort <garyam...@gmail.com> wrote:

>  I was looking at a tutorial written in this century for PHP programming,
> and I had steam come out of my ears.
>
> Even in this day and age, so called PHP 'experts' still write tutorials
> where they create a simple hello world script which uses:
>
> $name = $_GET['name'];
>
> The concept of using the simple filter_input() function is not addressed
> in almost any tutorials, and those that do address it don't bother untill
> the second half of the book.
>
> I understand why they do this.   Explaining all the intricacies of
> filter_input is an advanced topic.   Moreover, using $_GET and $_POST make
> it very easy for instructional purposes to provide visual cues to the
> student for where this data comes from.
>
> Never the less, since we can create closure's in PHP and bind them to
> variables, it's a simple matter to use an anonymous function bound to $get
> and still maintain clarity.  It can even be bound to $_GET so all they need
> to do is change [] to ()!
>
> So I wanted some feedback on the wording of the following to promote using
> 4 little lines of code to reduce PHP security issues:
>
> ## Do not do as they doAs you learn how to program in PHP you will find 
> almost all instructional tutorials as of 2014 do you a grave injustice.  They 
> teach you how to write dangerous, hackable, insecure PHP code.
>
> Since I can't wave a magic wand and make all those tutorials fix themselves, 
> I have decided to instead provide you with a simple way to not let them do 
> this to you.
>
> For any tutorial which ever tells you to get data submitted by a user by 
> using the $_GET superglobal variable, you can perform a simple substitution:
>
> If they say:
> $exampleVariable = $_GET['exampleVariable'];
>
> You should use:
> $exampleVariable = $get('examplevariable);
>
> This is a small change that looks similar visually, so it makes it easy for 
> you to substitute.  Instead of getting the data from an array, you are 
> getting the data using a function.
>
> Now in addition to the above, you will ALSO need to create this function.  So 
> at the top of any PHP file where you will be using this function, simple add 
> the following 4 lines:
>
>
> // FIXME: replace this with a more complete data sanitizing script
> if isset($_GET) { unset($_GET); } // Force yourself not to use the global 
> variable
> $get = function($varName) {
>   return filter_input(INPUT_GET, $varName, FILTER_SANITIZE_STRING); }
>
> ## What this does
> // FIXME: replace this with a more complete data sanitizing script
> This is a PHP comment, it is not executable code.  This is simply a notation 
> to remind you in the future if you are using this file for a production 
> website, to go back and replace this code with more appropriate and secure 
> code.
>
> if isset($_GET) { unset($_GET); } // Force yourself not to use the global 
> variable
> This line is to force you not use the $_GET array by deleting it.  That way 
> if you cut and paste code from a tutorial, you won't accidentally introduce 
> security issues if you forget to make the neccessary changes.
>
>
> $get = function($varName) {
>   return filter_input(INPUT_GET, $varName, FILTER_SANITIZE_STRING); }
>
> These 2 lines create a function to remove any HTML tags from a query string 
> variable and return it.  The function is a special PHP construct called a 
> closure, which you can learn about later, which allows it to be refereneced 
> by a variable.  The purpose of using this odd construct is that it allows you 
> to reuse these 2 lines of code multiple times in a PHP application without 
> having to worry about duplicate function names.
>
> The filter_input is a PHP function which provides a create deal more security 
> options then just the one I have used here.  It is up to you to learn about 
> and use those options appropriately.  What I have included here is the bare 
> minimum to provide some basic security AND to allow you to easily increase 
> your security incremementally.  For example, instead of having to rewrite 
> every single PHP program you write in the beginning, you merely need to 
> search for all the FIXME strings and change filter_input(INPUT_GET, $varName, 
> FILTER_SANITIZE_STRING) to something more appropriate for your specific needs.
>
>
>
> _______________________________________________
> New York PHP User Group Community Talk Mailing List
> http://lists.nyphp.org/mailman/listinfo/talk
>
> http://www.nyphp.org/show-participation
>
_______________________________________________
New York PHP User Group Community Talk Mailing List
http://lists.nyphp.org/mailman/listinfo/talk

http://www.nyphp.org/show-participation

Reply via email to