代码审计之SQL注入

GinTvT 发布于 2024-08-23 26 次阅读 安全学习 预计阅读时间: 2 分钟


conn = DBHerpel.getConnection();
if (conn == null)
 return;
String username = request.getParameter("username");
String Sql = "select * from table where username = '" + username + "'";
stt = conn.createStatement();
set = stt.executeQuery(Sql);

调用orm的错误写法

java/MyBatis

配置文件

<select id="findUserByName" parameterType="java.lang.String"
resultType="cn.itcast.mybatis.po.User">
 <!-- 拼接 MySQL,引起 SQL 注⼊ -->
 SELECT * FROM table WHERE username = '${value}'
</select>

变量绑定方式

${}:直接替换值,基本存在注入

#{}:用于参数化查询,进行了预编译,大概率不会存在注入

python/flask/sqlalchemy

@app.route("/", methods=["GET"])//定义了一个flask路由,在访问路径/的时候会调用test函数,methods=["GET"]是只接受GET请求
def test()://定义了一个test函数,用户访问根目录的时候会调用这个函数来处理请求
 username = request.args.get('username')//这行代码从HTTP GET请求的查询参数中获取名为 username 的参数值,并将其存储在变量 username 中
    //例如,如果URL是 example.com/?username=john_doe,那么 username 的值将是 'john_doe'
 res = db.session.query(table).filter("username={}".format(username))
    /*
    这行代码使用SQLAlchemy的 session 对象和 query 方法,构建并执行一个SQL查询
    db.session 是一个SQLAlchemy的 Session 对象,代表与数据库的会话
    query(table) 表示要查询 table 表中的所有记录
    filter("username={}".format(username)) 使用字符串格式化将用户输入的值直接嵌入到SQL查询字符串中
    生成的查询语句类似于:SELECT * FROM table WHERE username=用户输入的值
    */

正确写法

@app.route("/", methods=["GET"])
def test():
 username = request.args.get('username')
 res = db.session.query(table).filter(table.username == username)

核心思维

sql注入,就是在执行一段sql语句,关键是数据库类型

各种的sql注入其实就是不同的sql语句

此作者没有提供个人介绍。
最后更新于 2025-04-23