How to prevent SQL injection in PHP?

SQL injection usually occurs when you ask a user for input, like their username/userid, and instead of a name/id, the user gives you an SQL statement that you will unknowingly run on your database. Like in the following example.

$unsafe_variable = $_POST['user_input'];

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");

                                                                                                                                               

User can input something like " value'); DROP TABLE table;--, and the query becomes:

 

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

 

To make your application SQL injection proof always use prepared statements and parameterized queries. These are SQL statements that are sent to and parsed by the database server separately from any parameters. This way it is impossible for an attacker to inject malicious SQL.

Basically we have two options to achieve this:

Using PDO (for any supported database driver):

1.    $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

2.    $stmt->execute(array('name' => $name));

3.    foreach ($stmt as $row) {

4.       // do something with $row}

 

Using MySQLi (for MySQL):

1.    $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');

2.    $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'

3.  $stmt->execute();

4.  $result = $stmt->get_result();

5.  while ($row = $result->fetch_assoc()) {

6.     // do something with $row}

 

If system connect to a database other than MySQL, there is a driver-specific second option refer (e.g. pg_prepare() and pg_execute() for PostgreSQL). PDO is the universal option.

 

Correctly setting up the connection

Note that when using PDO to access a MySQL database real prepared statements are not used by default. To fix this. To disable the emulation of prepared statements. An example of creating a connection using PDO is:

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

In the above example the error mode isn't strictly necessary, but it is advised to add it. This way the script will not stop with a Fatal Error when something goes wrong. And it gives the developer the chance to catch any error(s) which are thrown as PDOException.

What is mandatory, however, is the first setAttribute() line, which tells PDO to disable emulated prepared statements and use real prepared statements. This makes sure the statement and the values aren't parsed by PHP before sending it to the MySQL server (giving a possible attacker no chance to inject malicious SQL).

Although user can set the charset in the options of the constructor, it's important to note that 'older' versions of PHP (< 5.3.6) silently ignored the charset parameter in the DSN.

Explanation

What happens is that the SQL statement to prepare is parsed and compiled by the database server. By specifying parameters (either a ? or a named parameter like :name in the example above) user tell the database engine where user want to filter on. Then call execute, the prepared statement is combined with the parameter values.

The important thing here is that the parameter values are combined with the compiled statement, not an SQL string. SQL injection works by tricking the script into including malicious strings when it creates SQL to send to the database. So by sending the actual SQL separately from the parameters, you limit the risk of ending up with something you didn't intend. Any parameters user send when using a prepared statement will just be treated as strings (although the database engine may do some optimization so parameters may end up as numbers too, of course). In the example above, if the $name variable contains 'Sarah'; DELETE FROM employees the result would simply be a search for the string "'Sarah'; DELETE FROM employees", and you will not end up with an empty table.

Another benefit of using prepared statements is that if we execute the same statement many times in the same session it will only be parsed and compiled once, giving some speed gains.

Oh, and since user asked about how to do it for an insert, here's an example (using PDO):

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array('column' => $unsafeValue));



Was this article helpful?

Top Related Jobs

Top Freelance jobs are waiting for you, View & apply to earn more.

  • Backend Analytics Dashboard

    $18, Hourly | United States
    Searching for developer to clean up analytics dashboard from the backend of my iOS app. This information is currently shown for me on my website via l...
  • ffmpeg maintenance

    $18, Hourly | United States
    Small job, need to have a feature fixed on ffmpeg that is creating a error message
  • Laravel/PHP Engineer

    $14, Hourly | Ukraine
    The Laravel/PHP Engineer is responsible for contributing to the design and implementation of full stack Laravel PHP applications. You will be the deve...
  • PHP/JAVA developer needed for online experiment

    $18, Hourly | United States
    the project is about using PHP/JAVA to develop web pages for an online experiment. It requires proficient skill on PHP/JAVA.
  • Web development for our Social Media project (Angular4 Javascript, PHP, Symfony)

    $24, Hourly | Singapore
    This is an existing Social Media website which we need to be improved. We have a list of features which we want to add and we are ready to provide it...
  • Joomla development

    $50, Fixed | Denmark
    To customise and help configure JomHol by Comdev.In particular booking options.
  • Linux System Administrator [II]

    $19, Fixed | Canada
    To resolve a few issues in the Linux server [CentOS]Shall familiar with the below- CentOS- Centos Web Panel webserver rebuild- Centos Web Panel phpmya...
  • UX/UI Designer to create interactive prototype for online platform

    $40, Fixed | Canada
    User Interface DesignShort description of the deliverable:We need an interactive prototype of a customer journey to visualize user interaction on an o...


People also searched for

Natural Language Processing in Python
Natural Language Processing in Python
Web Development

NLP is a branch of data science that consists of systematic processes for analyzing, understanding, and deriving information from the text information in a smart and efficient mann...

Read More
How to post a Job & Hire a great WordPress developer
How to post a Job & Hire a great WordPress develop...
Web Development

WordPress is an open source Content Management System (CMS), which allows the users to build dynamic websites and blog. WordPress is the most popular blogging system on the web and...

Read More
Some Useful JavaScript Tips,Tricks and Best Practices
Some Useful JavaScript Tips,Tricks and Best Practi...
Web Development

As you know, JavaScript is the top programming language in the world, the language of the web, of mobile hybrid apps (like PhoneGap or Appcelerator), of the server side (like NodeJ...

Read More

You are freelancing Ninja?

Try Toogit Instant Connect today, The new virtual assistant for your freelancing world.


What are the benefits to hire a php developer on Toogit?

Hire PHP developer on Toogit to build a website as per the requirement of your business in a convenient manner. A team of professionals can undertake the requirement of your business and can turn your ideas into reality. Hiring PHP developer is a must for you if you want to build a PHP based site with a professional look. Web developers from all over the world are opting for this software to build a site because of its cost effectiveness, flexibility, simplicity and free availability. Hire PHP developers on Toogit to accomplish your business projects.

  • Flexible option: Our multiple models are designed to give you the flexibility in hiring your team at your own budget and project requirements.
  • Build your own team: Choose from a variety of technologies and create your dream team or your own IT team.
  • Transparency at all levels: Options to choose from a pool of talented resources, interviewing them as per your own standards and hiring the right resource.
  • Complete control: Assign tasks at your own will or give the control to the team to lead the development.

What are php developers?

PHP developers develop programs, applications, and web sites using the dynamic scripting language PHP. PHP is known for web development and business applications. Depending on job function, PHP developers could also be classified as software developers or web developers. Because the language is so ubiquitous in web site development and business, PHP can be a good choice for freelance or contract developers.

Mistakes while hiring the PHP Developers

Common mistake that need to be avoided while hiring a PHP developer

  1. Not examining the previous work effectively: Basically, you have to judge the work of the PHP Developer when you are trying to hire them. Of course, you'll have some idea of the skills that are required for the task and some assumptions on how you would like to proceed additional.
  2. Looking within the region: 'I would prefer to hire a PHP Developer who belongs to my region' this can be the fact that the majority of the businesses think and work in this direction. Well, most of them think that this the simplest way; communication becomes straightforward, problems may be solved with ease and at a faster rate.
  3. Ignoring support and communication: Make sure that your communication is perfect. A proper mode of communication should be selected by the company for solving and reviewing the latest updates and problems. So, while interviewing, test their analytical, decision-making, and problem-solving ability, and also check whether the developer is able to understand and implement the requirements in the project easily or not.
  4. Pricing issue: Do you agree on variable pricing? You never know how much money are going to be spent throughout the process and how many months it would take for the website to go live. This problem arises when working with an offshore. So, in the first interview itself, talk about all the issues clearly. Make sure you provide the detailed contract which is duly signed by the offshore company.

What our users are discussing about PHP