簡體   English   中英

使用Mybatis檢查SQL注入的輸入

[英]check input for SQL-Injection with Mybatis

我想檢查我的輸入字符串中是否存在潛在的SQL注入。

這是我的類,方法和查詢:

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注入”之類的東西。 只有一種格式不正確的查詢

因此,您不必通過使用准備好的語句來查找任何“注入”,而是必須正確地設置查詢的格式

根據上下文,任何數據都可能是潛在的注入,也可能是無害的文本塊。 因此,無論使用什么過濾功能,都會有太多的誤報。 更糟糕的是,無論什么過濾都是“黑名單”實現,都意味着它永遠是不完整的-過濾掉用於利用注入的所有代碼是不可能的。

另一方面,准備好的陳述是一個相對簡單的解決方案, 即使不知道它們 ,也不會受到任何類型的注射的影響。 僅僅因為它不會讓數據干擾查詢。

消毒輸入不是防止此類注射的方法。 使用准備好的語句是可行的方法。

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM