[wp-hackers] escape data before db insert?

Bjorn Wijers mailings at bdisfunctional.net
Fri Jan 19 16:39:54 GMT 2007


Brian and Mark, thanks for the explanation!

Another thing:
can a wp nonce be used by forms outside the admin?


Mark Jaquith wrote:
> On Jan 17, 2007, at 1:13 PM, Bjorn Wijers wrote:
> 
>> Now my question is: Do I need to manually call $wpdb->escape() on 
>> every piece of data I would like to insert into the database or not.
> 
> No.  GPC will be pre-slashed for you, just as if magic_quotes_gpc were 
> on.  Values from the database will have to be reslashed before going 
> back in.  If you're modifying GPC input, you should stripslashes(), 
> modify, then $wpdb->escape().
> 
> I recently clarified this in the codex (it had incorrect information):
> 
> http://codex.wordpress.org/Function_Reference/wpdb_Class#escape_-_Escape_For_SQL_Queries 
> 
> 
>> $string = "O'Reilly" (comes in via $_GET or $_POST)
>>
>> after I use
>>
>> $wpdb->escape()
>>
>> becomes after retrieving it from the database and echo'ing it:
>>
>> O\'Reilly
>>
>> So I presume it is already escaped before I used $wpdb->escape() and 
>> the extra $wpdb->escape() changes it into O\\'Reilly before inserting 
>> it into the database.
> 
> It started as O\'Reilly and then the additional manual escaping made it 
> O\\\'Reilly (yes, three slashes... slashes are escaped by slashes, so 
> the first two slashes come out as one slash and the third slash and the 
> quote come out as a quote, giving you back the original O\'Reilly)
> 
> So, as an exercise:
> 
> <?php
> 
> // populate from $_GET
> $GET_test = $_GET['test'];
> 
> // populate from DB
> $DB_test = $wpdb->get_var("SELECT something FROM sometable WHERE foo = 
> 'bar'");
> 
> // now prepare both values for a query
> $DB_test_safe = $wpdb->escape($DB_test);
> $GET_test_safe = $GET_test; // Already safe
> 
> $wpdb->query("INSERT INTO something (test1, test2) 
> VALUES('$DB_test_safe', '$GET_test_safe');");
> ?>
> 
> Here are my rules:
> 
> 1. anything that would be escaped by magic_quotes_gpc can be assumed to 
> be escaped in WordPress and can be safely used in queries **so long as 
> the original superglobal has not been manipulated**
> 
> 2. manipulations of GPC superglobals should be done on copies, leaving 
> the originals escaped
> 
> 3. manipulations of copies of GPC superglobals should be done after 
> running stripslashes() (so you're working with the data, not the escaped 
> data)
> 
> 4. manipulated copies of GPC superglobals MUST be re-escaped using 
> $wpdb->escape() before being used in SQL queries of any kind.
> 
> 5. All data not originating from GPC must be assumed to be unsafe, 
> including stuff from the database.
> 
> -- 
> Mark Jaquith
> http://markjaquith.com/
> 
> Covered Web Services
> http://covered.be/
> 
> 
> _______________________________________________
> wp-hackers mailing list
> wp-hackers at lists.automattic.com
> http://lists.automattic.com/mailman/listinfo/wp-hackers
> 


More information about the wp-hackers mailing list