Re: Re: sql injection protection
| From: | Haluk Karamete | Date: | Thu, 26 Jan 2012 17:39:40 +0000 |
| Subject: | Re: Re: sql injection protection | ||
| References: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-316412@lists.php.net to get a copy of this message | ||
>>Re-read his example. He encodes the data in PHP. But decodes the data in SQL. So, if you
>>echo the SQL statement, you would see a base64 encoded string that SQL then decodes.
Got it this time! Up until reading your reply, I was reading Alex's
example with my pseudo-code glasses. I did not realize that the
decoding was being done by SQL! I though it was still in PHP. And
that's where I got confused with the hey why not string casting it
then and got into what's the difference situation. But, you were laser
sharp on that! Thanks a bunch!
>> as to the other issue, the one with utf-8 and mb_detect_encoding, not working for it -
>> cause there are ways of getting around. I still don't get it.. First q comes to mind, why the
>> heck use mb_detect_encoding then if it can be hacked around? see what I'm saying. but i
>> don't want to go off on a tangent.. all i'm trying to do is to safely protect myself from
>> a possible sql injection by using the available filters and sanitizations and techniques but without
>> the PDO. That's the requirement. No PDO. From the earlier recommendations, I understand PDO is
>> the way to go - cause it effectively separates the sql code from the user input to make sure user
>> input does not get executed.. that explanation ... i get that... no problems there... yes, do use
>> PDO... but my question is not what's the safest way in general?. But rather, what's the
>> safest way without the PDO? Without the PDO, it seems like b64'ing it will do the job! And
>> since the data will be stored as clear text, the searches against that data will also work too. I
>> can take this implementation and build my library function based on that - instead of making it
1- first check if the in user string is in utf-8,
2- reject the input if not in utf-8
3- accept the input if utf-8 and apply the applicable filters to it
starting with filter_sanitize_string
4- and on top of that, also mysql_real_escape it
but from what i understand, you guys are saying just don't do this,
because it may be overcome and that's not because of the fact
filter_sanitize_string or mysql_real_escape_string is not effective,
but because of the fact that there is NO WAY to reliably detect
whether the incoming user input is in utf-8 or not.
On Thu, Jan 26, 2012 at 9:14 AM, Jim Lucas <lists@cmsws.com> wrote:
> On 01/26/2012 06:46 AM, Haluk Karamete wrote:
>>
>> when we do b64e and then back b64d, you are saying. we get the org
>> input all as clear text but this time as a string. because it is now a
>> string, "(which by definition can not be executed)"
>>
>> what's the difference between b64e+b64d vs (string) casting then? if
>> you were to cast the original input into string using (string),
>> wouldn't you be in the same shoes?
>
>
> Re-read his example. He encodes the data in PHP. But decodes the data in
> SQL. So, if you echo the SQL statement, you would see a base64 encoded
> string that SQL then decodes.
>
>
>>
>> also on another note, if you know the userinput is in UTF-8, ( you
>> verify that by running mb_detect_encoding($str, 'UTF-8', true); ), is
>> there a situation where you think mysql_real_escape_string would fail
>> in SQLINjection against string based user input ? The reason I ask
>> this about specifically for strings is because it is fairly easy to
>> validate againsts integers,floats,booleans using the built in
>> validation filters.... my biggest issue is on strings...
>>
>> also what do you think about filter_sanitize_string.
>
>
> read this:
>
> http://www.php.net/manual/en/filter.filters.sanitize.php
>
> Then read this:
>
> http://www.php.net/manual/en/filter.filters.flags.php
>
> It seems to me that filter_sanitize_string does not deal with anything other
> then ASCII.
>
> YMMV
>
>
>>
>> and finally, where do you think PHP community plus Rasmus is having a
>> hard time implementing what you have in mind - that is a one liner
>> that will do the inline string interpolation you are talking about..
>> what's the issue that it hasn't been done before?
>>
>>
>>
>> On Tue, Jan 24, 2012 at 1:45 PM, Alex Nikitin<niksoft@gmail.com> wrote:
>>>
>>> You don't need to store it in the database as b64, just undo the
>>> encoding into your inputs
>>>
>>> for the purpose of the explanation, this is language independent
>>>
>>> b64e - encoding function
>>> b64d - decoding function
>>>
>>>
>>> pseudo code
>>>
>>> given:
>>> bad_num = ') union select * from foo --'
>>> bad_str = ""
>>> good_num = 123456
>>> good_str = "some searchable text"
>>>
>>> the b64 way:
>>> bad_num=b64e(bad_num)
>>> ...
>>> good_str=b64e(good_str)
>>>
>>>
>>> inserts:
>>> query("insert into foo (num, str) values
>>> (b64d(\""+bad_num+"\"),
>>> b64d(\""+bad_str+"\"))");
>>> query("insert into foo (num, str) values
>>> (b64d(\""+good_num+"\"),
>>> b64d(\""+good_str+"\"))");
>>>
>>> Can you see that this will safely insert clear text into the database?
>>> This is because when you convert anything from b64, it will return
>>> from the function as a string and will not be executed as code...
>>>
>>>
>>> Now let's try a search:
>>> bad_num= '1 or 2 not like 5'
>>> bad_str = "' or \"40oz\" like \"40oz\""
>>>
>>> again we:
>>> bad_num=b64e(bad_num)
>>> bad_str=b64e(bad_str)
>>>
>>> then we can do a full text search:
>>> query("select * from foo where match(str)
>>> against(b64d(\""+bad_str+"\"))")
>>> or even a number search
>>> query("select * from foo where
>>> num=b64d(\""+bad_num+"\")")
>>>
>>> again this is possible because no matter what you put in bad num, it
>>> will never be able to make post b64e bad_num look like code, just
>>> looks like junk, until b64d converts it to a string (which by
>>> definition can not be executed)
>>>
>>> make sense now?
>>>
>>>
>>> by check i mean, run utf8_decode for example...
>>>
>>>
>>> Problem is, that i can tell you how to write the most secure code, but
>>> if it's hard, or worse yet creates more problems than it solves
>>> (seemingly), nobody other than a few individuals with some passion for
>>> security will ever find the code useful. We need to fix this on the
>>> language level, then we can go around and tell programmers how to do
>>> it right. I mean imagine telling a programmer, that something that
>>> takes them 2 lines of code now, can be done much more securely in 5-7,
>>> and it creates code that doesn't read linearly... Most programmers
>>> will just ignore you. I want to say, "hey programmer, what you do in 2
>>> lines of code, you can do in 1 and make it impossible to inject into",
>>> then, then people will listen, maybe... This is where inline string
>>> interpolation syntax comes in, but it is not implemented in any
>>> programming languages, sadly actually. This is what i want to talk to
>>> Rasmus about.
>>
>>
>
>
> --
> Jim Lucas
>
> http://www.cmsws.com/
> http://www.cmsws.com/examples/
> http://www.bendsource.com/