В 2021 году SQL-инъекция мертва?

MySQL MyBatis
В 2021 году SQL-инъекция мертва?

Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.

Долгое время я считал back-end разработку самым уязвимым местом с точки зрения безопасности — SQL инъекции. пройти черезwhere 1=1Этот волшебный метод написания SQL может легко атаковать проблемную систему, так что в конечном итоге она эволюционирует.sqlmapТакие артефакты есть.

sqlmap-screen.png

позжеfastjsonОсвежая мои познания, эту структуру также можно рассматривать как своего рода продвижение концепции интернет-безопасности. Даже начальники, которые не разбираются в технологиях, знают fastjson快的要命, так как концепция безопасности программиста была улучшена.

Почему у вас слабость к sql-инъекциям? Потому что есть так много мест, где разработчики имеют дело с SQL. Некоторые студенты, специализирующиеся на разработке отчетов, даже пишут больше строк SQL, чем строк кода!

Проблема в том. Давным-давно, еще 10 лет назад, кто-то кричал, что SQL-инъекции мертвы, но сегодня все еще существует большое количество руководств по SQL-инъекциям и кейсов SQL-инъекций.

SQL-инъекция — король уязвимостей, это не удар.

Набор систем с открытым исходным кодом для учебных целей, добро пожаловать в звезду:GitHub.com/star hotel о, хорошо/неплохо…. Он включает в себя сложный бизнес ToB, бизнес с высокой степенью параллелизма в Интернете, приложение кэширования, DDD, руководство по микросервисам. Управляемый моделью, управляемый данными. Поймите путь эволюции крупномасштабных сервисов, навыки кодирования, изучите Linux и настройте производительность. Помощь Docker/k8s, мониторинг, сбор логов, изучение промежуточного ПО. Front-end технология, back-end практика и т.д. Основная техника:SpringBoot+JPA+Mybatis-plus+Antd+Vue3.

Конечно, в этом отношении вклад PHP самый большой, а Java готова проиграть.

Причина популярности SQL-инъекций в том, что разработчики слишком уверены в себе, либо используемые инструменты слишком примитивны, чтобы их можно было один раз отфильтровать на уровне фреймворка. Если вы используете MyBatis или JPA в мире Java, вероятность внедрения SQL становится очень низкой. Теперь в PHP также есть что-то вродеthinkphpТа же структура означает, что становится все меньше и меньше уязвимостей, связанных с SQL-инъекциями, которые можно сделать.

Но это не значит, что их нет, просто порог был поднят. Давайте возьмем MyBatis в качестве примера, чтобы увидеть, может ли все еще происходить SQL-инъекция.

Внедрение SQL все еще существует в MyBatis

Учащиеся, которые используют Mybatis, первая концепция, с которой они соприкасаются, это#и$разница. Эти два символа очень похожи на магические символы в раковине, но, к счастью, их всего два.

  • #Представляет использование предварительно скомпилированного метода SQL, который является безопасным и надежным.
  • $Это означает, что используется метод сплайсинга, и есть риск SQL-инъекции.

Например, следующая конфигурация xml — абсолютно безопасный способ записи. потому что весь#{id}будет заменен на?.

<select id="queryAll"  resultMap="resultMap">
  SELECT * FROM order WHERE id = #{id}
</select>

Но, к сожалению, в некоторых сценариях вы не можете использовать предварительно скомпилированный способ (или вы просто не знаете или ленитесь). Как и в некоторых случаях рефакторинга кода, когда имя таблицы/имя столбца/сортировка и другие поля передаются динамически, неизбежно потребуется способ объединения SQL, и SQL-инъекция все еще имеет некоторые проблемы.

Но более склонны к проблемам, илиLIKEиINи подобные фразы.

Ниже приведен метод написания двух подобных нечетких запросов. Фактический тест обнаружит, что использование#Не работает, сообщит об ошибке, нужно использовать sql splicing$. Проблема возникает из-за этого.

SELECT * FROM order WHERE name like '%#{name}%'  //会报语法错
SELECT * FROM order WHERE name like '%${name}%'  //可以运行

Правильный способ написания должен использовать объединение функций. Но период строительства сокрушил людей, и, прежде чем они это поняли, большинство людей выбрали простой способ письма. В конце концов, функция стоит на первом месте, и это также самый важный способ отразить рабочую нагрузку.

SELECT * FROM order WHERE  name like concat(‘%’,#{name}, ‘%’) //正确的写法

Такая же проблема существует вINутверждение.

in (#{tag}) //报错
in (${tag}) //可以运行

Поскольку несколько символов могут работать, конечно, никто не выбирает сложное письмо ниже.

tag in
<foreach collection="tag" item="item" open="("separatosr="," close=")">
#{tag} 
</foreach>

Существует также порядок, не относитесь к этому легкомысленно, это будет необратимо, если вы не будете осторожны.

SELECT * FROM order order by createDate #{sortType} //报错
SELECT * FROM order order by createDate ${sortType} //正常

В этом случае вам нужно сделать sortType белым списком. Это не просто ASC и DESC Вы передаете мне длинную строку Что происходит?

Суммировать

Внедрение SQL все еще будет существовать в 2021 году, но порог будет повышен. Сейчас уменьшение SQL инъекции происходит за счет фреймворка, а не от уровня программистов. Ситуация со сращиванием sql никогда не исчезнет, ​​потому что это самый быстрый и простой способ, и он вызовет зависимость у людей. Существует бесчисленное множество аутсорсинговых проектов, и есть много систем, которые лежат мертвыми уже более десяти лет, и мечтаю надеяться, что SQL-инъекция будет полностью устранена на уровне фреймворка.

Потому что его противник — человеческая лень. Никто не может победить его.

Набор систем с открытым исходным кодом для учебных целей, добро пожаловать в звезду:GitHub.com/star hotel о, хорошо/неплохо…. Он включает в себя сложный бизнес ToB, бизнес с высокой степенью параллелизма в Интернете, приложение кэширования, DDD, руководство по микросервисам. Управляемый моделью, управляемый данными. Поймите путь эволюции крупномасштабных сервисов, навыки кодирования, изучите Linux и настройте производительность. Помощь Docker/k8s, мониторинг, сбор логов, изучение промежуточного ПО. Front-end технология, back-end практика и т.д. Основная техника:SpringBoot+JPA+Mybatis-plus+Antd+Vue3.

Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.​