检查 SQL-Injection with Mybatis 的输入
check input for SQL-Injection with Mybatis
我想检查我的输入字符串是否存在潜在的 SQL-注入。
这是我的 class、方法和查询:
public class UserNamesQuery {
public static String getUserNames(Map<String, Object> params) {
String userNames = (String) params.get("userNames");
return "SELECT * FROM users WHERE name IN (" + userNames + ") ";
}
}
是否有工具或快速方法来验证 userNames
没有 SQL-注入?
注意我用的是Mybatis
没有。没有办法。而且不需要。
坦率地说,没有"SQL injection"这样的东西。只有 对格式不正确的查询 的利用。
因此,您不必通过使用 准备好的语句来正确设置查询格式,而不是搜索任何内容 "injections"。
根据上下文,任何数据都可能是潜在的注入或无害的文本块。因此,无论使用何种过滤功能,都会有太多的误报。更糟糕的是,无论过滤是 "black list" 实现,都意味着它 总是 是不完整的——不可能过滤掉所有用于利用注入的代码。
另一方面,准备好的语句是一个相对简单的解决方案,可以免疫任何类型的注入,甚至不知道它们。只是因为它不会让数据干扰查询。
清理输入并不是防止此类注入的方法。使用准备好的语句是可行的方法。
PreparedStatement ps = connection.prepareStatement("SELECT * FROM users WHERE username IN (?)"); //Add however many ?'s you want, if you have an array you can use a StringBuilder for this to add more ?'s
ps.setString(1, userName);
ResultSet rs = ps.executeQuery();
这将设置 ?在您的字符串的代码中。数据库驱动程序然后处理其余部分。
如果 IN 子句中有多个值,请使用 StringBuilder 和循环添加更多问号。
还要注意索引是如何从 1 而不是 0 开始的。
mybatis sql 模板可能是个不错的选择。仅供参考:
<sql id="orderTypeSql">
<trim prefix=" ">
<if test="orderType=='desc'">desc</if>
</trim>
</sql>
<sql id="oderColumnSql">
<trim prefix="order by " suffix="" >
<choose>
<when test="orderColumn==null or orderColumn==''"></when>
<when test="orderColumn=='id'">
id<include refid="orderTypeSql"/>
</when>
<when test="orderColumn=='name'">
`name`<include refid="orderTypeSql"/>
</when>
</choose>
</trim>
</sql>
<select id="testOrderBy" resultType="User">
select
id,
`name`
from t_user
<include refid="oderColumnSql"/>
limit 0, 10
</select>
我想检查我的输入字符串是否存在潜在的 SQL-注入。
这是我的 class、方法和查询:
public class UserNamesQuery {
public static String getUserNames(Map<String, Object> params) {
String userNames = (String) params.get("userNames");
return "SELECT * FROM users WHERE name IN (" + userNames + ") ";
}
}
是否有工具或快速方法来验证 userNames
没有 SQL-注入?
注意我用的是Mybatis
没有。没有办法。而且不需要。
坦率地说,没有"SQL injection"这样的东西。只有 对格式不正确的查询 的利用。
因此,您不必通过使用 准备好的语句来正确设置查询格式,而不是搜索任何内容 "injections"。
根据上下文,任何数据都可能是潜在的注入或无害的文本块。因此,无论使用何种过滤功能,都会有太多的误报。更糟糕的是,无论过滤是 "black list" 实现,都意味着它 总是 是不完整的——不可能过滤掉所有用于利用注入的代码。
另一方面,准备好的语句是一个相对简单的解决方案,可以免疫任何类型的注入,甚至不知道它们。只是因为它不会让数据干扰查询。
清理输入并不是防止此类注入的方法。使用准备好的语句是可行的方法。
PreparedStatement ps = connection.prepareStatement("SELECT * FROM users WHERE username IN (?)"); //Add however many ?'s you want, if you have an array you can use a StringBuilder for this to add more ?'s
ps.setString(1, userName);
ResultSet rs = ps.executeQuery();
这将设置 ?在您的字符串的代码中。数据库驱动程序然后处理其余部分。 如果 IN 子句中有多个值,请使用 StringBuilder 和循环添加更多问号。
还要注意索引是如何从 1 而不是 0 开始的。
mybatis sql 模板可能是个不错的选择。仅供参考:
<sql id="orderTypeSql">
<trim prefix=" ">
<if test="orderType=='desc'">desc</if>
</trim>
</sql>
<sql id="oderColumnSql">
<trim prefix="order by " suffix="" >
<choose>
<when test="orderColumn==null or orderColumn==''"></when>
<when test="orderColumn=='id'">
id<include refid="orderTypeSql"/>
</when>
<when test="orderColumn=='name'">
`name`<include refid="orderTypeSql"/>
</when>
</choose>
</trim>
</sql>
<select id="testOrderBy" resultType="User">
select
id,
`name`
from t_user
<include refid="oderColumnSql"/>
limit 0, 10
</select>