SQL注入是数据库安全的重大威胁,需通过应用层规范、数据库配置、访问控制等多层面防范。以下是具体实施方案:
这是防止SQL注入的最有效手段。应用代码中应避免直接拼接SQL语句,而是使用参数化查询(绑定变量)。例如:
psycopg2
库时,通过execute()
方法的第二个参数传递变量:cursor.execute("SELECT * FROM userinfo WHERE id = %s", (user_input_id,))
PreparedStatement
:PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM userinfo WHERE id = ?");
pstmt.setInt(1, user_inputId);
ResultSet rs = pstmt.executeQuery();
原理:参数化查询会将用户输入视为数据而非SQL代码,数据库引擎会自动转义特殊字符(如单引号),彻底阻断注入路径。
SELECT
、INSERT
、UPDATE
、DELETE
),禁止授予DROP
、TRUNCATE
、ALTER
等高危权限。GRANT CONNECT ON DATABASE dbname TO app_role;
GRANT USAGE ON SCHEMA sch_name TO app_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE table_name TO app_role;
REVOKE ALL ON DATABASE dbname FROM PUBLIC;
REVOKE ALL ON SCHEMA sch_name FROM PUBLIC;
REVOKE ALL ON FUNCTION malicious_function() FROM PUBLIC;
CREATE POLICY
限制用户只能访问符合条件的行(如仅能查看自己的数据),进一步缩小攻击影响范围。CREATE POLICY user_data_policy ON userinfo
FOR SELECT
TO app_role
USING (user_id = current_user);
这些措施可确保即使应用层存在漏洞,攻击者也无法通过SQL注入获取或修改敏感数据。
postgres
)的默认空密码,设置强密码(包含大小写字母、数字、特殊字符,长度≥8位);同时为PgAdmin自身账号设置强密码,并定期更换(建议每90天更换一次)。server.crt
)和私钥(server.key
),并在postgresql.conf
中启用SSL:ssl = on
ssl_cert_file = '/var/lib/pgsql/12/data/server.crt'
ssl_key_file = '/var/lib/pgsql/12/data/server.key'
在PgAdmin连接配置中选择“SSL”模式为“Require”。pg_hba.conf
文件控制访问来源,仅允许特定IP地址或子网连接数据库。例如:host all all 192.168.1.0/24 md5 # 仅允许192.168.1.0/24网段访问
host all all 127.0.0.1/32 md5 # 允许本地访问
结合防火墙(如firewalld
)限制PgAdmin端口(默认80或5050)的访问:sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port=5050 protocol=tcp accept' --permanent
sudo firewall-cmd --reload
这些配置可减少非法IP尝试SQL注入的风险。yum update
命令更新系统软件包:sudo yum update -y postgresql-server pgadmin4
postgresql.conf
中启用详细日志:logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all' # 记录所有SQL语句(生产环境可调整为'dml'或'none')
定期分析日志,若发现异常(如大量DROP TABLE
、UNION SELECT
语句),及时采取措施。通过以上措施,可构建“应用层防护+数据库权限控制+访问安全+持续审计”的多层防御体系,有效防止CentOS环境下PgAdmin遭受SQL注入攻击。