Welcome to Dream.In.Code
Getting Help is Easy!

Join 107,710 Programmers for FREE! Ask your question and get quick answers from experts. There are 1,100 online right now! We've got more than 500 tutorials and 2,000 snippets. Join and find out why Dream.In.Code is the #1 programming help community on the internet! Registration is fast and FREE... Join Now!



SQL Injection :: What It Is, And How To Prevent It

 
Reply to this topicStart new topic

> SQL Injection :: What It Is, And How To Prevent It

Rating  4
sandman85048
Group Icon



post 11 Nov, 2007 - 10:03 AM
Post #1


SQL Injection is a form of hacking that has taken down innumerable amounts of websites, and it's no comforting idea that your site could be next. In this tutorial, I will give you a brief synopsis of what SQL Injection really is, and how to protect your website from it. This tutorial assumes that you have a fairly good knowledge of PHP, you understand GET and POST methods, and you have used and at least partly understand SQL.

SQL Injection is usually done through areas where user input is added into a database, or where GET/POST values are parsed and added into a database. For example, this is a piece of code that will get a POST value and add it to the database:
CODE
mysql_query("INSERT INTO table VALUES('" . $_GET["value"] . "')");
Now let's create the scenario. That code is located at http://example.com/update.php. If the page was visited with the GET values:
http://example.com/update.php?value=bwahaha
This would give us an SQL query like this:
INSERT INTO table VALUES('bwahaha')

That code is all fine and dandy, but what if someone visited the page like this:
http://example.com/update.php?value=blah'); DELETE * FROM table WHERE value != 0; INSERT INTO table VALUES('HACKED!
This would make an SQL query:
INSERT INTO table VALUES('blah'); DELETE * FROM table WHERE value != 0; INSERT INTO table VALUES('HACKED!')
That is one piece of malicious code. This would essentially delete all rows from the database, except for ones with a value of 0. Then, you would probably have one row which would let you know that you were hacked.


Now you probably want to know how to protect your site(s) from this, right? It's fairly simple, actually.

We can use a function from a code snippet I published, called sql_sanitize.
CODE
function sql_sanitize( $sCode ) {
        if ( function_exists( "mysql_real_escape_string" ) ) { // If PHP version > 4.3.0
                $sCode = mysql_real_escape_string( $sCode ); // Escape the MySQL string.
        } else { // If PHP version < 4.3.0
                $sCode = addslashes( $sCode ); // Precede sensitive characters with a slash \
        }
        return $sCode; // Return the sanitized code
}
Now let's put this into action. Remember the code we had earlier? Let's change that:
mysql_query("INSERT INTO table VALUES('" . sql_sanitize($_GET["value"]) . "')");
This will "sanitize" the code and protect your database from people doing anything malicious to it.

Well, there you go! I suggest you implement this method wherever you are putting user input into the database. Instead of using $_GET["value"], for instance, just use sql_sanitize($_GET["value"])! It really is that simple.
Go to the top of the page
+Quote Post


Register to Make This Ad Go Away!

didgy58
**



post 25 Nov, 2007 - 02:52 PM
Post #2
so would it go something like this

CODE


$query = "INSERT INTO $tbl_name (Name, Email, Comment, Datetime) " .
             "VALUES ('".sql_sanitizer('$name', '$email', '$message', '$datetime')."')";



could you only use this for when you are adding to the database what if you where just pulling records out of the database to display in a table could you also use the sanitizer function then??

thanks

dan
Go to the top of the page
+Quote Post

snoj
Group Icon



post 25 Nov, 2007 - 03:27 PM
Post #3
If you're meaning on the records returned...not necessarily. However for the WHERE part of your SELECT query you would want to sanitize.
Go to the top of the page
+Quote Post

rockstar_
Group Icon



post 27 Nov, 2007 - 12:58 AM
Post #4
CODE
function sql_sanitize( $sCode ) {
        if ( function_exists( "mysql_real_escape_string" ) ) { // If PHP version > 4.3.0
                $sCode = mysql_real_escape_string( $sCode ); // Escape the MySQL string.
        } else { // If PHP version < 4.3.0
                                                        die('Your PHP version is too old!');  // Addslashes is unsafe
        }
        return $sCode; // Return the sanitized code
}

It would probably best not to try addslashes at all. There are far too many vectors to get around addslashes. PHP 4 will be EOL'd starting Jan 1, 2008 for a reason. Just FYI. If I wanted to try out SQL injection, I'd find out the PHP version first, to see if I could just fire in some escape codes and the like to get it to error out.
Go to the top of the page
+Quote Post

darklighter
*



post 5 Jan, 2008 - 09:03 AM
Post #5
Remember to us stripslashes when trying to display the data from the db, otherwise you may end up with text that looks like:

"Let/'s go!"

And worse if you resubmit that data cuz you'd end up with more slashes on it if you don't strip em again each time you display it.
Go to the top of the page
+Quote Post

Ladydice
*



post 20 Aug, 2008 - 09:35 PM
Post #6
QUOTE(sandman85048 @ 11 Nov, 2007 - 10:03 AM) *

SQL Injection is a form of hacking that has taken down innumerable amounts of websites, and it's no comforting idea that your site could be next. In this tutorial, I will give you a brief synopsis of what SQL Injection really is, and how to protect your website from it. This tutorial assumes that you have a fairly good knowledge of PHP, you understand GET and POST methods, and you have used and at least partly understand SQL.

SQL Injection is usually done through areas where user input is added into a database, or where GET/POST values are parsed and added into a database. For example, this is a piece of code that will get a POST value and add it to the database:
CODE
mysql_query("INSERT INTO table VALUES('" . $_GET["value"] . "')");
Now let's create the scenario. That code is located at http://example.com/update.php. If the page was visited with the GET values:
http://example.com/update.php?value=bwahaha
This would give us an SQL query like this:
INSERT INTO table VALUES('bwahaha')

That code is all fine and dandy, but what if someone visited the page like this:
http://example.com/update.php?value=blah'); DELETE * FROM table WHERE value != 0; INSERT INTO table VALUES('HACKED!
This would make an SQL query:
INSERT INTO table VALUES('blah'); DELETE * FROM table WHERE value != 0; INSERT INTO table VALUES('HACKED!')
That is one piece of malicious code. This would essentially delete all rows from the database, except for ones with a value of 0. Then, you would probably have one row which would let you know that you were hacked.


Now you probably want to know how to protect your site(s) from this, right? It's fairly simple, actually.

We can use a function from a code snippet I published, called sql_sanitize.
CODE
function sql_sanitize( $sCode ) {
        if ( function_exists( "mysql_real_escape_string" ) ) { // If PHP version > 4.3.0
                $sCode = mysql_real_escape_string( $sCode ); // Escape the MySQL string.
        } else { // If PHP version < 4.3.0
                $sCode = addslashes( $sCode ); // Precede sensitive characters with a slash \
        }
        return $sCode; // Return the sanitized code
}
Now let's put this into action. Remember the code we had earlier? Let's change that:
mysql_query("INSERT INTO table VALUES('" . sql_sanitize($_GET["value"]) . "')");
This will "sanitize" the code and protect your database from people doing anything malicious to it.

Well, there you go! I suggest you implement this method wherever you are putting user input into the database. Instead of using $_GET["value"], for instance, just use sql_sanitize($_GET["value"])! It really is that simple.



does this method only used for $_GET statements...what about $_REQUEST statements...?
Go to the top of the page
+Quote Post


Reply to this topicStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

 

Lo-Fi Version Time is now: 8/30/08 03:23AM

Live Help!

Tutorials

Programming

Web Development

Reference Sheets

Code Snippets

Bye Bye Ads

Free DIC T-Shirt

T-Shirt Example

Related Sites

Monthly Drawing

Thumb Drive

Partners

Top Contributors

Top 10 Kudos This Month