Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Preventing sql injection - why should one escape the input if using prepared statements?

I am doing some research in web security, and the reviser of my article said:

"It should be clear that to avoid SQL Injection, the application should use prepared statements, stored procedures and escape input"

My question is: Is one of these methods isn't enough? Ok, prepared statements or stored procedures are better than a simple escape, but if I use PDO, why i should escape the input or have a stored procedure? Does this make sense?

like image 353
Daniel Avatar asked Jan 03 '12 16:01

Daniel


People also ask

Why do prepared statements prevent SQL injection?

Prepared statements are very useful against SQL injections, because parameter values, which are transmitted later using a different protocol, need not be correctly escaped. If the original statement template is not derived from external input, SQL injection cannot occur.

Can we prevent SQL injection using prepared statements?

A prepared statement is a parameterized and reusable SQL query which forces the developer to write the SQL command and the user-provided data separately. The SQL command is executed safely, preventing SQL Injection vulnerabilities.

Does escaping prevent SQL injection?

Character escaping is an effective way of preventing SQL injection. Special characters like “/ — ;” are interpreted by the SQL server as a syntax and can be treated as an SQL injection attack when added as part of the input.

What precautions must be taken to prevent SQL injection attacks?

The only sure way to prevent SQL Injection attacks is input validation and parametrized queries including prepared statements. The application code should never use the input directly. The developer must sanitize all input, not only web form inputs such as login forms.


2 Answers

I would change the reviser's wording to:

It should be clear that to avoid SQL Injection, the application should use prepared statements, escape input, or filter application data before interpolating into an SQL string.

It's not necessary to escape a value if you're going to pass as a parameter. In fact, you should not, because you'll insert literal backslashes into your data.

You need to interpolate strings into your SQL statement when you can't use a query parameter. Examples include:

  • Table names and column names, which have their own syntax for delimited identifiers. These must be part of the SQL query at prepare time, so the RDBMS can parse and validate them.

  • SQL keywords, which should be sanitized but cannot be escaped because they are not delimited.

  • Other syntax or expressions.

  • Some cases where literal values must be provided at prepare time, e.g. MySQL's fulltext functions do not support parameters for the search pattern.

Stored procedures are not a defense against SQL injection. You can prepare and execute unsafe dynamic SQL statements inside a stored procedure. See http://thedailywtf.com/Articles/For-the-Ease-of-Maintenance.aspx for a great story about that.

I cover all these cases in my presentation SQL Injection Myths and Fallacies. That may be a helpful resource for you.

I also cover SQL injection defense in a chapter of my book, SQL Antipatterns: Avoiding the Pitfalls of Database Programming.

like image 177
Bill Karwin Avatar answered Sep 28 '22 00:09

Bill Karwin


If i use PDO, why i should [es]scape the input or have a stored procedure?

As long as you always use PDO, I don't see a reason to bother with input escaping or SPs.

like image 30
Matt Ball Avatar answered Sep 28 '22 00:09

Matt Ball