(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

Reply via email to