(1) 参数化查询的机制 参数绑定:ORM会将用户输入的数据作为参数传递给SQL语句,而不是直接拼接到SQL字符串中。 例如:`SELECT FROM users WHERE name = :name`(Python的SQLAlchemy)或`SELECT FROM users WHERE name = ?`(JDBC)。 用户输入(如`'or 1=1`)会被视为参数,而不是SQL代码。 数据库驱动的处理:数据库驱动会将参数值进行转义(如单引号转义、特殊字符过滤),确保参数不会被解释为SQL命令的一部分。
(2) 避免字符串拼接 ORM通过方法调用或查询构建器(如`filter()`、`where()`)生成SQL语句,而不是直接拼接字符串。 例如:`User.query.filter(User.name == user_input)`,而非`"SELECT FROM users WHERE name = ' + user_input + '"'`。 这种方式彻底避免了用户输入被直接插入到SQL字符串中。
(1) 手动拼接SQL语句 如果开发者直接使用字符串拼接(如`query = "SELECT FROM users WHERE name = '" + user_input + "'"`),则可能引入SQL注入漏洞。 示例: ```python user_input = "'; DROP TABLE users;" query = f"SELECT FROM users WHERE name = '{user_input}'" 构造出恶意SQL:SELECT FROM users WHERE name = ''; DROP TABLE users; ```
(2) 使用原生SQL或未封装的API ORM允许开发者直接编写原生SQL(如`raw_sql = "SELECT FROM users WHERE name = %s" % user_input`),此时未经过参数化处理的SQL可能被攻击。 示例: ```sql 如果使用未参数化的原生SQL SELECT FROM users WHERE name = ' OR 1=1 ```