Re: Sanitizing mysql inserts of user data

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

 



>> > That said, I would recommend binding parameters if you can. It's a
>> > cleaner way of separating the logic of a query from its data, and
>> > theoretically more reliable than mysql_real_escape_string():
>> >
>> > http://en.wikipedia.org/wiki/SQL_injection#Parameterized_statements
>> >
>>
>> I fail to understand what is happening here. For the sake of context,
>> here is the PHP code in TFA:
>> $db = new PDO('pgsql:dbname=database');
>> $stmt = $db->prepare("SELECT priv FROM testUsers WHERE
>> username=:username AND password=:password");
>> $stmt->bindParam(':username', $user);
>> $stmt->bindParam(':password', $pass);
>> $stmt->execute();
>>
>> What exactly does bindParam do? I read these pages in TFM but I still
>> do not understand what exactly is being sent to the database:
>> http://il2.php.net/manual/en/function.db2-bind-param.php
>> http://il2.php.net/manual/en/function.maxdb-stmt-bind-param.php
>> http://il2.php.net/manual/en/mysqli-stmt.bind-param.php
>>
>> I do not see how there could possibly be a prepared statement for a
>> user comment. I am not a programmer by trade, so I may be missing
>> something obvious. If so, a link and a friendly RTFM would be great.
>
> Typically, prepared statements do a couple of things. First, they ensure
> that values sent to the DBMS are properly "quoted". You'd be surprised
> how difficult a problem that is. Date and string values must be
> surrounded by quotes, but numerics shouldn't be. And how they're quoted
> depends on the DBMS you're using. So prepared statements take care of
> this for you.
>

Apparently, I missunderstood the meaning of the term "prepared
statements". I thought that it meant using values that only came from
my code, and no user-entered values. For instance, if the user had to
choose between the windows, linux, and mac forums, the code would look
like this:
switch ($userForum){
  case (linux):
    $sqlForum="linux";
    break;
  case (windows):
    $sqlForum="windows";
    break;
  case (mac):
    $sqlForum="mac";
    break;

This is what I currently do. However, that approach would not work for comments.


> The second thing they do is examine the values you're attempting to pass
> into the database, and ensure they don't contain SQL injection type
> code. This is hard to explain, but it's relatively simple to insert
> "code" in place of an actual value, and do malicious things to your
> database, or obtain information you don't want users to see (like credit
> card numbers). If you're curious, search for "SQL injection" to get more
> information and see examples.
>

I am familiar with SQL injection, I wrote about it here:
http://what-is-what.com/what_is/sql_injection.html

-- 
Dotan Cohen

http://what-is-what.com
http://gibberish.co.il

-- 
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