On Wed, May 6, 2009 at 12:06 PM, Bruno Fajardo <bsfajardo@xxxxxxxxx> wrote: > Hi there! > > 2009/5/6 Igor Escobar <titiolinkin@xxxxxxxxx> >> >> Hi folks, >> Someone know how i can improve this function to protect my envairounment >> vars of sql injection attacks. >> >> that is the function i use to do this, but, some people think is not enough: >> >> * @uses $_REQUEST= _antiSqlInjection($_REQUEST); >> * @uses $_POST = _antiSqlInjection($_POST); >> * @uses $_GET = _antiSqlInjection($_GET); >> * >> * @author Igor Escobar >> * @email blog [at] igorescobar [dot] com >> * >> */ >> >> function _antiSqlInjection($Target){ >> $sanitizeRules = >> array('OR','FROM,'SELECT','INSERT','DELETE','WHERE','DROP TABLE','SHOW >> TABLES','*','--','='); >> foreach($Target as $key => $value): >> if(is_array($value)): $arraSanitized[$key] = _antiSqlInjection($value); >> else: >> $arraSanitized[$key] = >> addslashes(strip_tags(trim(str_replace($sanitizeRules,"",$value)))); >> endif; >> endforeach; >> return $arraSanitized; >> >> >> } >> >> You can help me to improve them? > > What if someone posts, in any form of your app, a message containing > "or", "from" or "where"? Those are very common words, and eliminate > them is not the best solution, IMO. > Use mysql_real_escape_string() like Shawn said, possibly something > like this would do the trick (from > http://br2.php.net/manual/en/function.mysql-query.php): > > $query = sprintf("SELECT firstname, lastname, address, age FROM > friends WHERE firstname='%s' AND lastname='%s'", > mysql_real_escape_string($firstname), > mysql_real_escape_string($lastname)); > > Cheers, > Bruno. +1 I would stick with parameterized queries if available, or just use mysql_real_escape_string() for these and a few more reasons: 1) You'll find lots of posts in the archives explaining why mysql_real_escape_string() is preferred over addslashes() for this purpose. 2) strip_tags has absolutely nothing to do with SQL injection. Neither does trim(). There are cases where you would not want to use either of those functions on input, but you would still need to guard against injection. 3) DROP TABLE will work no matter how many white-space characters appeared between the words. For that matter, I am pretty sure that 'DROP /* some bogus SQL comment to make it past your filter */ TABLE' will work also. Andrew -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php