Re: Re: setcookie security concerns [medium]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



	(Comments inline)

tedd wrote:
[···]
One last question, considering the above code, would the following code be a suitable replacement?

<?php
$thestyle=  htmlentities($_POST['thestyle']);
setcookie ('thestyle', $set, time()+31536000, '/', '', 0);
header("Location: $HTTP_REFERER");
?>

Actually, you receive $set via GET, so you should use $_GET instead of $_POST. A lot of people use $_REQUEST (wich is a combination of $_POST, $_GET and $_COOKIE —check the manual), but I read somewhere that this isn't a good practice, though I don't recall why :p

  $set = $_GET['set'];
or even better would be something like
  $set = ( isset($_GET['set']) ? $_GET['set'] : $default_value );

I've used htmlentities() before to filter out user's input, but I don't know if that's sufficient to protect from all types of injections -- is it?

No, it doesn't suffice this way --it does for the script we're talking about, but that's because you only use the data as part of the HTML code, so no more harm can be done with it.

A tipical example would be a login script that uses the data as it arrives, for example:
  $login = $_POST['login'];
  $passw = $_POST['passw'];
  $sql   = "SELECT * FROM user\n"
          ."WHERE( login = '$login' AND passw = '$passw' )";

In this case, what happens if I send something like
  login: ' OR '1'='1' OR '0
  passw: doesnt care
? (I avoided the ' in the passw, just in case)
Well, we'll end up with an SQL similar to this
  SELECT * FROM user
  WHERE( login = '' OR '1'='1' OR '0' AND passw = 'doesnt care' )
and because of the priority of the AND / OR, we would have 3 separated conditions each enough to validate the user, as '1'='1' is true, then we have a validated user.

	Now, if I can do this, I could change the logic a little...
  login: admin' AND '1'='1' OR '0
  WHERE( login = 'admin' AND '1'='1' OR '0' AND passw = 'doesnt care' )
In this case you should care about ' and " (depending on which one are you using) Again, I read somewhere that the safest way is to use (emulated?) "prepared SQL statements", such the "?" SQL-parameters in ADODB, PEAR-DB and others.

By the way, even causing an SQL error that is displayed to the user (the whole message or just a part of it) can reveal info that could be used to bypass your protection.
--
Atentamente,
J. Rafael Salazar Magaña
Innox - Innovación Inteligente
Tel: +52 (33) 3615 5348 ext. 205 / 01 800 2-SOFTWARE
http://www.innox.com.mx

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux