| name | remediation-injection |
| description | Security fix patterns for injection vulnerabilities (SQL, Command, XSS). Provides language-specific code examples showing vulnerable and secure implementations. |
Remediation: Injection Vulnerabilities
Actionable fix patterns for injection-based security vulnerabilities.
When to Use This Skill
- Fixing SQL injection - After finding SQL injection in audits
- Fixing command injection - After finding OS command injection
- Fixing XSS - After finding cross-site scripting vulnerabilities
- Code review feedback - Provide remediation guidance with examples
When NOT to Use This Skill
- Detecting vulnerabilities - Use vulnerability-patterns skill
- Fixing crypto issues - Use remediation-crypto skill
- Fixing auth issues - Use remediation-auth skill
- Fixing config issues - Use remediation-config skill
SQL Injection (CWE-89)
Problem
User input directly concatenated into SQL queries allows attackers to manipulate database queries.
Python (SQLAlchemy/psycopg2)
Don't:
def get_user_bad(user_id):
query = f"SELECT * FROM users WHERE id = '{user_id}'"
cursor.execute(query)
return cursor.fetchone()
query = "SELECT * FROM users WHERE name = '%s'" % username
Do:
def get_user_safe(user_id):
query = "SELECT * FROM users WHERE id = %s"
cursor.execute(query, (user_id,))
return cursor.fetchone()
def get_user_orm(user_id):
return db.session.query(User).filter(User.id == user_id).first()
from sqlalchemy import text
query = text("SELECT * FROM users WHERE id = :user_id")
result = db.session.execute(query, {"user_id": user_id})
JavaScript/TypeScript (Node.js)
Don't:
const query = `SELECT * FROM users WHERE id = '${userId}'`;
db.query(query);
const sql = `SELECT * FROM products WHERE name LIKE '%${searchTerm}%'`;
Do:
const query = 'SELECT * FROM users WHERE id = ?';
db.query(query, [userId]);
const query = 'SELECT * FROM users WHERE id = $1';
await client.query(query, [userId]);
const user = await prisma.user.findUnique({
where: { id: userId }
});
const user = await knex('users').where('id', userId).first();
Java (JDBC)
Don't:
String query = "SELECT * FROM users WHERE id = '" + userId + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
Do:
String query = "SELECT * FROM users WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(query);
pstmt.setString(1, userId);
ResultSet rs = pstmt.executeQuery();
@Query("SELECT u FROM User u WHERE u.id = :userId")
User findByUserId(@Param("userId") String userId);
Go
Don't:
query := fmt.Sprintf("SELECT * FROM users WHERE id = '%s'", userID)
rows, err := db.Query(query)
Do:
query := "SELECT * FROM users WHERE id = $1"
rows, err := db.Query(query, userID)
var user User
err := db.Get(&user, "SELECT * FROM users WHERE id = $1", userID)
ASVS: V1.2.1, V1.2.2
References: OWASP SQL Injection Prevention
Command Injection (CWE-78)
Problem
User input passed to shell commands allows attackers to execute arbitrary system commands.
Python
Don't:
import subprocess
subprocess.run(f"grep {pattern} {filename}", shell=True)
import os
os.system(f"convert {input_file} {output_file}")
Do:
import subprocess
import shlex
result = subprocess.run(
['grep', pattern, filename],
capture_output=True,
text=True
)
if shell_required:
safe_filename = shlex.quote(filename)
subprocess.run(f"process {safe_filename}", shell=True)
from PIL import Image
img = Image.open(input_file)
img.save(output_file)
JavaScript/Node.js
Don't:
const { exec } = require('child_process');
exec(`grep ${pattern} ${filename}`);
exec(`convert ${inputFile} ${outputFile}`);
Do:
const { execFile } = require('child_process');
execFile('grep', [pattern, filename], (error, stdout) => {
console.log(stdout);
});
const { spawn } = require('child_process');
const grep = spawn('grep', [pattern, filename]);
const sharp = require('sharp');
await sharp(inputFile).toFile(outputFile);
Java
Don't:
String cmd = "grep " + pattern + " " + filename;
Runtime.getRuntime().exec(cmd);
Do:
ProcessBuilder pb = new ProcessBuilder("grep", pattern, filename);
pb.redirectErrorStream(true);
Process process = pb.start();
ASVS: V1.2.3
References: OWASP OS Command Injection
Cross-Site Scripting (XSS) (CWE-79)
Problem
User input rendered in HTML without proper encoding allows script injection.
JavaScript (DOM)
Don't:
element.innerHTML = userInput;
document.write(userData);
$('#content').html(userInput);
Do:
element.textContent = userInput;
import DOMPurify from 'dompurify';
element.innerHTML = DOMPurify.sanitize(userHtml);
const link = document.createElement('a');
link.href = sanitizeUrl(userUrl);
link.textContent = userText;
parent.appendChild(link);
$('#content').text(userInput);
React
Don't:
function Comment({ content }) {
return <div dangerouslySetInnerHTML={{ __html: content }} />;
}
<a href={userUrl}>Click here</a>
Do:
function Comment({ content }) {
return <div>{content}</div>;
}
import DOMPurify from 'dompurify';
function RichContent({ html }) {
const clean = DOMPurify.sanitize(html);
return <div dangerouslySetInnerHTML={{ __html: clean }} />;
}
function SafeLink({ url, text }) {
const isValid = /^https?:\/\//.test(url);
if (!isValid) return <span>{text}</span>;
return <a href={url}>{text}</a>;
}
Python (Flask/Jinja2)
Don't:
from markupsafe import Markup
return Markup(f"<div>{user_input}</div>")
{% autoescape false %}
{{ user_content }}
{% endautoescape %}
Do:
return render_template('page.html', content=user_input)
<div>{{ content }}</div>
import bleach
allowed_tags = ['b', 'i', 'u', 'a']
allowed_attrs = {'a': ['href']}
clean = bleach.clean(user_html, tags=allowed_tags, attributes=allowed_attrs)
ASVS: V3.3.1, V1.3.1
References: OWASP XSS Prevention
Quick Reference
| Vulnerability | Fix Pattern | Key Libraries |
|---|
| SQL Injection | Parameterized queries | ORM, prepared statements |
| Command Injection | Argument arrays, no shell | subprocess, execFile |
| XSS | Auto-escaping, sanitization | DOMPurify, bleach |
See Also
remediation-crypto - Cryptography fixes
remediation-auth - Authentication/authorization fixes
remediation-config - Configuration fixes
vulnerability-patterns - Detection patterns