当前位置:  开发笔记 > 编程语言 > 正文

"状态"是对方法提供的,而不是消毒的强制使用.为什么?

如何解决《"状态"是对方法提供的,而不是消毒的强制使用.为什么?》经验,为你挑选了1个好方法。

我使用Intellij,但我不知道为什么我总是会收到以下错误:

"状态"在方法外部提供,在使用前不进行消毒.

我的方法:

...
    public List getActionIdByTypeAndCodeAndStatus(String type, String code, String status) throws Exception {
                String sql = "select action_id from action where type = '" + type + "' and code = '" + code + "' and status = '" + status + "' ";
                Query checkWriteLog = entityManager.createNativeQuery(sql);
                return checkWriteLog.getResultList();
            }

抛出错误的行是

 Query checkWriteLog = entityManager.createNativeQuery(sql);

问题: 你知道原因吗?我该如何解决?



1> Rick van Lie..:
问题

你正在连接字符串以形成你的SQL查询.这很容易发生SQL注入攻击.

特定

 String sql = "select action_id from action where type = '" + type + "' and code = '" + code + "' and status = '" + status + "' "

我们可以通过以下字符串传递状态来破坏你的数据库:

'; DROP TABLE action; --

为什么?'; 将完成您的查询并运行它,然后我们提供另一个查询(;关闭第一个),这是"DROP TABLE action;" 最后我们添加两个破折号来忽略后面的所有内容

这会导致表操作的删除表,并且可能是灾难性的.在维基页面上阅读更多相关信息.

解决方案

使用如下的预处理语句:

Query query = JPA.em().createNativeQuery("select action_id from action where type = ':type' and code = ':code' and status = :status ");
query.setParameter("type", type);
query.setParameter("code", code);
query.setParameter("status", status);

这很容易理解,它基本上会将查询发送到数据库并告诉它"运行它,但我会给你稍后添加的值",然后将值发送给它.这意味着您发送的任何内容都将放在""之间,并且不会被视为查询.**

**这不是实际发生的事情,它是了解它如何运作的一种方式.如果您需要实际解释,请阅读维基页面.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有