请输入手机号码
请输入密码
香港服务器防止SQL注入的综合措施
参数化查询是防御SQL注入的核心技术,其原理是将SQL语句的结构与用户输入的数据分离——通过占位符(如?、:param)定义参数位置,再将用户输入绑定到参数,数据库会自动转义特殊字符(如单引号、分号),避免恶意代码被解析为SQL语法。
PreparedStatement,如String sql = "SELECT * FROM users WHERE email = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, userEmail);text()函数结合命名参数,如stmt = text("SELECT * FROM users WHERE id = :user_id"); result = db.session.execute(stmt, {"user_id": user_id})' OR '1'='1),也会被当作普通字符串处理。对所有用户输入(如表单、URL参数、HTTP头部)进行严格的格式校验,确保输入符合预期类型和范围:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$正则)。'转为''),或移除高危字符(如;、--、UNION、SELECT)。为应用程序分配最低必要权限的数据库账号,限制其对数据库的操作范围:
GRANT SELECT ON app_db.* TO 'web_reader'@'localhost';);GRANT INSERT, UPDATE ON app_db.orders TO 'web_writer'@'localhost';);root)连接数据库。DROP TABLE、ALTER DATABASE等高危操作,降低损失。通过WAF拦截恶意SQL注入请求,形成服务器外部的第一道防线:
UNION SELECT、SLEEP(、EXEC(、' OR 1=1 --),支持自定义规则(如拦截包含多个单引号的请求)。location / {
ModSecurityEnabled on;
ModSecurityConfig modsec.conf;
SecRule ARGS "@detectSQLi" "id:1001,deny,status:403,msg:'SQL Injection detected'";
}存储过程可将SQL逻辑封装在数据库中,通过参数传递用户输入,减少动态SQL拼接的风险:
CONCAT函数拼接SQL),仅将参数作为查询条件。DELIMITER //
CREATE PROCEDURE GetUserByEmail(IN userEmail VARCHAR(255))
BEGIN
SELECT * FROM users WHERE email = userEmail; -- 直接使用参数,无拼接
END //
//display_errors=Off),避免攻击者通过错误信息(如数据库版本、表结构)推断漏洞。error_log),便于后续排查,同时避免向用户暴露敏感信息(如die("Request failed. Contact admin.");)。SELECT *查询、大量失败登录),及时发现注入攻击。admin,密码为超长随机字符串),消耗攻击者资源,延缓攻击进程。