Нечеткие запросы MyBatis и внедрение SQL | Серия MyBatis (четыре)

задняя часть MyBatis
Нечеткие запросы MyBatis и внедрение SQL | Серия MyBatis (четыре)

Краткое содержание серии MyBatis:Серия MyBatis


1. Нечеткий запрос

1.1, абстрактный интерфейс
List<Map<String,Object>> selectLIKEUser(Map<String,Object> parmsMap);
1.2, XML
  • Посмотрите это, чтобы узнать, почему полеlikeЕсли вы хотите обернуть его плавающим числом, верно?
	<select id="selectLIKEUser" resultType="map" parameterType="map">
        select
               *
        from
             user
        where
            name like "%"#{name}"%"

    </select>
1.3, тестовый класс
	@Test
    public void selectLIKEUser() {
        SqlSession session = MybatisUtils.getSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        Map<String,Object> parmsMap = new HashMap<>();
        parmsMap.put("name","面");
        List<Map<String,Object>> resultList = mapper.selectLIKEUser(parmsMap);

        for (Map map: resultList){
            System.out.println(map);
        }
        session.close();
    }
1.4, результат выполнения
  • данные

在这里插入图片描述

  • результат

在这里插入图片描述

2. SQL инъекция

2.1#и$разница
  • #Входящие данные в виде строки, входящие данные автоматически добавляют двойную кавычку.
  • $Входящие данные напрямую отображаются и генерируются в sql.
  • #Этот метод может в значительной степени предотвратить внедрение SQL,$Невозможно предотвратить внедрение Sql.
  • $Этот метод обычно используется для передачи объектов базы данных, таких как передача имени таблицы.
  • Обычно полезно#не используй$Если бы вам пришлось использовать“${xxx}”Такие параметры следует фильтровать вручную, чтобы предотвратитьSQL注入攻击.
2.2,#и$проверять

① Мы используем log4j для вывода оператора выполнения SQL на консоль.

  • импортная банка
		<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.6.1</version>
        </dependency>
  • log4j2.properties
log4j.rootLogger=DEBUG,console,file

log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

log4j.appender.file = org.apache.log4j.RollingFileAppender

log4j.appender.file.File=log/tibet.log

log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=ERROR
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=INFO

  • ContextAplication.xml
	<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"></setting>
    </settings>
  • Таким образом включается вывод логов, здесь представлены только самые простые, а логи log4j подробно не объясняются.

②SQL-xml

  • #
	<select id="getUserInfoById" resultType="com.dbright.pojo.User">
        select * from user where id = #{id}
    </select>
  • $
	<select id="getUserInfoById" resultType="com.dbright.pojo.User">
        select * from user where id = ${id}
    </select>

③ Выполняйте результаты отдельно

  • #

在这里插入图片描述

  • $

在这里插入图片描述

2.3 Как имитировать SQL-инъекцию?
  • Внедрить недопустимое утверждение:

在这里插入图片描述

  • Результат: Все данные найдены, небезопасны

在这里插入图片描述

  • Как это решить?
    • может быть использован#затем применить
    • должен использовать$В случае добавьте проверку на уровне службы, например, в нашем примере, принимайте только параметры типа int.
    • Или просто оцените, превышает ли параметр длину, потому что оператор инъекции обычно очень длинный!

Впереди долгий путь, и я обязательно буду его искать вдоль и поперёк~

Если вы думаете, что я блогеры хорошо пишу! Писать нелегко, пожалуйста, ставьте лайки, подписывайтесь и комментируйте, чтобы поощрять блоггеров ~ хахах