Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.
Долгое время я считал back-end разработку самым уязвимым местом с точки зрения безопасности — SQL инъекции. пройти черезwhere 1=1
Этот волшебный метод написания SQL может легко атаковать проблемную систему, так что в конечном итоге она эволюционирует.sqlmap
Такие артефакты есть.
позже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, добро пожаловать в друзья для дальнейшего общения.