MyBatis如何防止SQL注入(一)

攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“or ‘1’=’1’”这样的语句),有可能入侵参数检验不足的应用程序。

解决:

     办法一:将SQL语句全部替换为存储过程(多应用于银行)

     办法二:bind + #{}  模糊查询 防止SQL注入。

bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:

<select id="selectBlogsLike" resultType="Blog">
  <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM BLOG
  WHERE title LIKE #{pattern}
</select>

<select id="getInfo" resultType="cn.xm.exam.bean.haul.Haulinfo"        parameterType="hashmap">
        SELECT * FROM haulinfo
        <where>
            <if test="name != null">
                <bind name="names" value="'%'+name+'%'" />
                and bigname like #{names}
            </if>
            <if test="status != null">
                and bigStatus = #{status}
            </if>
        </where>
    </select>

【结论】在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。

#{}:相当于JDBC中的PreparedStatement

${}:是输出变量的值

简单说,#{}是经过预编译的,是安全的${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。

扫描二维码关注公众号,回复: 5593620 查看本文章

  如果我们order by语句后用了${},那么不做任何处理的时候是存在SQL注入危险的。你说怎么防止,那我只能悲惨的告诉你,你得手动处理过滤一下输入的内容。如判断一下输入的参数的长度是否正常(注入语句一般很长),更精确的过滤则可以查询一下输入的参数是否在预期的参数集合中。

猜你喜欢

转载自blog.csdn.net/inflaRunAs/article/details/88563343