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语句

Comments NOTHING