5 min read
•Question 24 of 29hardWhat is SQL injection and how to prevent it?
SQL security best practices.
What You'll Learn
- What SQL injection is
- Attack examples
- Prevention techniques
What is SQL Injection?
SQL injection is an attack where malicious SQL is inserted into application queries.
Attack Examples
query.sqlSQL
-- Vulnerable code
query = "SELECT * FROM users WHERE email = '" + userInput + "'";
-- User enters: ' OR '1'='1
-- Resulting query:
SELECT * FROM users WHERE email = '' OR '1'='1';
-- Returns ALL users!
-- User enters: '; DROP TABLE users; --
-- Resulting query:
SELECT * FROM users WHERE email = ''; DROP TABLE users; --';
-- Deletes the entire table!Prevention: Parameterized Queries
code.jsJavaScript
// Node.js with MySQL
const sql = 'SELECT * FROM users WHERE email = ?';
connection.query(sql, [userEmail], callback);
// Node.js with PostgreSQL
const sql = 'SELECT * FROM users WHERE email = $1';
client.query(sql, [userEmail]);
// Python with psycopg2
cursor.execute("SELECT * FROM users WHERE email = %s", (user_email,))Prevention: ORM/Query Builders
code.jsJavaScript
// Sequelize
User.findAll({ where: { email: userEmail } });
// Prisma
prisma.user.findMany({ where: { email: userEmail } });
// Knex.js
knex('users').where('email', userEmail);Prevention: Input Validation
code.jsJavaScript
// Validate input type and format
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(userInput)) {
throw new Error('Invalid email');
}
// Escape special characters (last resort)
const escaped = mysql.escape(userInput);Other Best Practices
- Use least privilege database accounts
- Don't expose detailed error messages
- Use Web Application Firewalls (WAF)
- Regular security audits
- Keep software updated