如何实现SQL注入并获取数据表数据?尝试注入失败求助
为什么你的SQL注入尝试失败?
核心原因:你用了参数化查询
你的代码里执行SQL的部分是:c.execute(f"SELECT * from EMPLOYEE WHERE FIRST_NAME=:Name",{"Name":Name})这里的
:Name是SQLite支持的命名参数占位符,属于参数化查询范畴。数据库驱动会把SQL语句结构和参数值完全分开处理:- 先编译固定结构的SQL语句(底层会把命名参数转换为通用占位符)
- 再把
Name的值作为纯数据传入,不会被解析成SQL语法的一部分。
你的注入语句只会被当作查询值
不管你把Name改成什么注入字符串,比如' or 1=1--,数据库只会去查找FIRST_NAME字段等于这个字符串的记录,不会把or 1=1当作SQL逻辑执行。你尝试的所有注入语句,最终都只是普通的字符串查询条件,自然无法返回全表数据。如果想测试注入效果,需用不安全的字符串拼接(仅用于学习测试)
只有当你直接拼接字符串生成SQL时,注入才会生效。比如把代码改成:c.execute(f"SELECT * from EMPLOYEE WHERE FIRST_NAME='{Name}'")此时若将
Name设为' or 1=1--,拼接后的SQL会变成:SELECT * from EMPLOYEE WHERE FIRST_NAME='' or 1=1--'这里
1=1永远为真,--注释掉后续的单引号,就能返回全表数据。但这种写法在实际开发中绝对禁止,会引发严重安全风险。结论
你的代码已经通过参数化查询完美防御了SQL注入,这是正确的开发规范。你的注入尝试失败,恰恰说明这个安全机制在正常工作。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

