Уровень сложности
Простой
Время на прочтение
9 мин
Количество просмотров 6.1K
JSON — это инструмент, которым каждый веб-разработчик пользуется ежедневно. На первый взгляд кажется, что JSON слишком прост и незамысловат, чтобы читать про него целую статью. Но если вы не знаете, что такое санитизация данных, никогда не слышали про JSON Injection или XSS атаки, если информация о том, что JSON.parse и JSON.stringify принимают 2 и 3 аргумента для вас новость, то эта статья будет вам полезна.
Общие положения
JSON (JavaScript Object Notation) — это легковесный формат данных, который используется для обмена данными между клиентом и сервером в веб-приложениях.
В начале 2000-х годов была потребность в формате данных, который был бы удобнее и проще XML. Дуглас Крокфорд предложил использовать для обмена данными формат объектного литерала JavaScript, так и появился JSON. Предложенный Крокфордом формат оказался более компактным по сравнению с XML, проще для чтения и записи и прост в парсинге и генерации. В результате сейчас JSON является основным форматом обмена данными в веб-разработке.
JSON основан на двух основных структурах данных: объекте и массиве. Объект — это набор пар «ключ-значение», массив — это упорядоченный список значений. Ключи в объектах JSON всегда являются строками, а значения могут быть строками, числами, объектами, массивами, булевыми значениями или null.
{
"name": "John",
"age": 30,
"is_student": false,
"courses": ["math", "history", "chemistry"],
"personal_info": {
"address": "123 Main St",
"phone_number": "123-456-7890"
}
}
Несмотря на простоту и удобство, работа с JSON может быть связана с рядом проблем безопасности, если не подходить к этому процессу обдуманно.
Безопасное использование JSON
Основные виды атак
1. JSON Injection
Эта атака заключается в том, что злоумышленник вставляет вредоносный код в JSON, который затем обрабатывается веб-приложением.
Пример: Если веб-приложение берет пользовательский ввод и непосредственно вставляет его в JSON без проверки или санитизации (об этом подробно дальше), злоумышленник может вставить вредоносный код. Этот код может быть выполнен при обработке JSON.
const userInput = getUserInput();
const data = `{"name": "${userInput}"}`
const jsonData = JSON.parse(data);
В этом случае, если пользователь вводит что-то вроде "", "isAdmin": "true"}
, вредоносный код будет добавлен в JSON, создавая объект { "name": "", "isAdmin": "true"}
.
2. Cross-Site Scripting (XSS)
XSS — это тип атаки, при которой злоумышленник вставляет вредоносный скрипт в веб-страницу, который затем выполняется в браузере пользователя.
Пример: Если веб-приложение вставляет данные JSON напрямую в HTML без предварительной санитизации, это может привести к XSS-атаке.
const jsonData = getJsonData();
const element = document.getElementById('output');
element.innerHTML = jsonData.content;
Если jsonData.content
содержит что-то вроде
<script>maliciousCode()</script>
вредоносный код будет выполнен в браузере пользователя.
3. SQL Injection и JSON
SQL-инъекция — это вид атаки, при которой злоумышленник внедряет или «инъецирует» вредоносный SQL код в запрос к базе данных через ввод пользователя. SQL-инъекции могут привести к несанкционированному доступу к базе данных, краже, изменению или уничтожению данных.
Примером может служить ситуация, когда данные с клиентской стороны, например, из формы на веб-странице, принимаются в формате JSON, и затем используются для построения SQL-запроса.
const userData = JSON.parse(userInput);
const query = `SELECT * FROM users WHERE name = '${userData.name}' AND password = '${userData.password}'`;
Злоумышленник может подставить в поле name
или password
строку, которая, будучи вставлена в запрос SQL, изменит его логику. Например, следующий JSON:
{
"name": "' OR '1'='1'; --",
"password": "any"
}
после подстановки в запрос приведет к его изменению:
SELECT * FROM users WHERE name = '' OR '1'='1'; --' AND password = 'any'
В данном случае, поскольку условие '1'='1'
всегда истинно, это приведет к выбору всех пользователей и злоумышленник сможет обойти проверку пароля и войти в систему под любым аккаунтом.
Дисклеймер: я привел стандартный пример SQL-инъекции, он призван демонстрировать концепцию, а не реальный вектор атаки.
Важно понимать, что JSON сам по себе не имеет отношения к SQL-инъекциям. Однако, если данные, полученные в формате JSON, используются для формирования SQL-запросов без предварительной валидации и санитизации, то это может создать уязвимости для таких атак.
Чтобы предотвратить SQL-инъекции, рекомендуется использовать подготовленные или параметризованные запросы, а также проводить валидацию и санитизацию всех входных данных. Подготовленные запросы используют параметры вместо прямой вставки ввода пользователя в запрос. Библиотеки баз данных обычно предоставляют функции для создания подготовленных запросов.
Пример использования подготовленного запроса на Node.js с использованием MySQL:
const userData = JSON.parse(userInput);
let sql = `SELECT * FROM users WHERE name = ? AND password = ?`;
const inserts = [userData.name, userData.password];
sql = mysql.format(sql, inserts);
В этом примере, даже если злоумышленник попытается внедрить вредоносный код через JSON, он будет безопасно обработан библиотекой MySQL, и SQL-инъекция не произойдет.
Предотвращение атак
Основой безопасного использования JSON являются валидация и санитизация данных. Эти инструменты универсальны и эффективны против всех описанных выше видов атак.
Санитизация данных
Санитизация данных — это процесс очистки данных от вредоносных или нежелательных элементов. В контексте веб-разработки это обычно включает удаление или замену символов, которые могут быть использованы для проведения атак, таких как вставка SQL, XSS или JSON Injection.
Инструменты для санитизации данных:
-
DOMPurify: Это библиотека для JavaScript, которая позволяет очищать HTML, MathML и SVG от XSS атак. DOMPurify очень прост в использовании. Просто передайте ей строку, которую нужно санитизировать, и она вернет безопасную строку.
const clean = DOMPurify.sanitize(dirty);
-
express-validator: Это набор middleware функций для Express.js, который предоставляет мощные инструменты валидации и санитизации.
const express = require('express');
const { query, validationResult } = require('express-validator');
const app = express();
app.use(express.json());
app.get('/hello', query('person').notEmpty().escape(), (req, res) => {
const result = validationResult(req);
if (result.isEmpty()) {
return res.send(`Hello, ${req.query.person}!`);
}
res.send({ errors: result.array() });
});
app.listen(3000);
В этом примере ‘express-validator’ проверяет, что имя пользователя не пустое, а вызов escape()
производит санитизацию данных.
Валидация данных
Валидация — это процесс проверки данных на соответствие определенным критериям или правилам. В контексте JSON валидация обычно включает в себя проверку следующего:
-
Соответствие структуры и типов данных предполагаемым. Например, если ожидается объект с определенными полями, валидация должна убедиться, что все эти поля присутствуют и имеют правильные типы данных.
-
Отсутствие нежелательных символов или паттернов, которые могут вызвать проблемы при обработке данных (например, вредоносный код).
-
Соответствие данных бизнес-правилам. Например, валидация может включать проверку того, что значение определенного поля находится в допустимом диапазоне.
JavaScript предоставляет некоторые базовые функции для валидации JSON.
JSON.stringify
JSON.stringify() преобразует объект JavaScript в строку JSON. Этот метод принимает три аргумента: значение для преобразования, функцию-заменитель и пробелы.
-
Значение: это может быть любой объект JavaScript или значение, которое вы хотите преобразовать в JSON.
-
Функция-заменитель (replacer): это опциональная функция, которая преобразует значения объекта перед их сериализацией. Она может использоваться для фильтрации или преобразования значений.
-
Пробелы: опциональный параметр, который контролирует отступы в сериализованном JSON. Это может быть число (количество пробелов) или строка (до 10 символов, используемых в качестве пробела).
const json = JSON.stringify(obj, (key, value) => {
if (key === 'id') return undefined;
return value;
}, 2);
В этом примере значение «id» удаляется из сериализованного JSON и используются два пробела для отступов в JSON.
Сериализация — это процесс преобразования состояния объекта в формат, который может быть сохранен или передан и затем восстановлен. В контексте JSON, сериализация обычно включает преобразование объекта JavaScript в строку JSON.
Десериализация — это обратный процесс. Он преобразует сериализованные данные обратно в их первоначальную форму. В контексте JSON, десериализация обычно включает преобразование строки JSON обратно в объект JavaScript.
JSON.parse
JSON.parse() преобразует строку JSON обратно в объект JavaScript. Этот метод принимает два аргумента: строку для преобразования и функцию-ревайвер.
-
Строка: это должна быть корректная строка JSON, которую вы хотите преобразовать в объект JavaScript.
-
Функция-ревайвер (reviver): это опциональная функция, которая преобразует значения объекта после их десериализации. Она может использоваться для преобразования или восстановления определенных значений.
const obj = JSON.parse(str, (key, value) => {
if (key === 'date') return new Date(value);
return value;
});
В примере выше, функция-ревайвер преобразует строку в объект Date в процессе десериализации JSON.
JSON Schema
Для более сложных случаев валидации, таких как проверка структуры объекта JSON и типов данных, может потребоваться использование сторонних библиотек, таких как Ajv (Another JSON Schema Validator).
Ajv использует стандарт, который называется JSON Schema который нужен для описания и валидации структуры JSON-данных.
Пример JSON Schema:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Product",
"type": "object",
"properties": {
"id": {
"type": "number"
},
"name": {
"type": "string"
},
"price": {
"type": "number",
"exclusiveMinimum": 0
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"uniqueItems": true
}
},
"required": ["id", "name", "price"]
}
Обратите внимание на поле:
"$schema": "http://json-schema.org/draft-07/schema#",
"$schema"
является особым полем в JSON Schema. Это URI, который указывает на версию JSON Schema, которая была использована для создания вашей схемы. Это необходимо для корректной интерпретации и валидации схемы.
Вышеуказанная схема описывает объект «Product» с полями «id», «name», «price» и «tags». Поля «id», «name» и «price» являются обязательными. Поле «tags» должно быть массивом уникальных строк.
В данном примере, "$schema": "http://json-schema.org/draft-07/schema#"
указывает, что ваша схема написана с использованием версии "draft-07"
JSON Schema. Это помогает программам, которые обрабатывают вашу схему, правильно интерпретировать и применять правила валидации.
Ajv позволяет определить схему для данных, а затем проверять объекты на соответствие этой схеме.
const Ajv = require("ajv")
const ajv = new Ajv()
const schema = {
type: "object",
properties: {
foo: {type: "integer"},
bar: {type: "string"}
},
required: ["foo","bar"],
additionalProperties: false
}
const data = {foo: 1, bar: "abc"}
const valid = ajv.validate(schema, data)
if (!valid) console.log(ajv.errors)
В этом примере, если данные не соответствуют схеме (например, foo
не является числом, или одно из полей отсутствует), Ajv вернет ошибки, которые затем можно обработать.
Общие ошибки при работе с JSON и их решения
Синтаксические ошибки, ошибки сериализации/десериализации и ошибки передачи данных — это некоторые из наиболее распространенных проблем, с которыми разработчики сталкиваются при работе с JSON.
-
Синтаксические ошибки: JSON имеет строгий синтаксис. Например, все ключи должны быть заключены в двойные кавычки, а не в одинарные.
{ 'key': "value" } // ошибка { "key": "value" } // правильно
Кроме того, каждый элемент в массиве или пара ключ-значение в объекте должны быть разделены запятыми.
{ "key1": "value1" "key2": "value2" } // ошибка { "key1": "value1", "key2": "value2" } // правильно
Синтаксические ошибки могут быть легко обнаружены с помощью JSON валидаторов, например, JSONLint.
-
Ошибки сериализации/десериализации: Некоторые объекты JavaScript не могут быть корректно сериализованы в JSON или десериализованы из JSON. Например, функции и объекты Date в JavaScript не могут быть преобразованы в JSON. В этих случаях необходимо преобразовать объекты в поддерживаемые типы данных перед сериализацией или после десериализации. В этом примере, при преобразовании JSON обратно в объект, функция ревайвер преобразует строку даты обратно в объект Date. Без функции ревайвер, дата осталась бы строкой.
const user = { name: 'Tom', registered: new Date(), }; const json = JSON.stringify(user); // Преобразуем JSON обратно в объект, восстанавливая дату с помощью функции ревайвер const parsedUser = JSON.parse(json, (key, value) => { if (key == 'registered') return new Date(value); return value; }); console.log(parsedUser.registered); // Выведет объект Date, а не строку
-
Ошибки при передаче данных: JSON часто используется для передачи данных между клиентом и сервером. Если эти данные не правильно кодируются или декодируются, или если они теряются в процессе передачи, это может привести к ошибкам. Обычно ошибки кодирования и декодирования связаны с ошибками в заголовке ‘Content-Type’, там необходимо указать значение ‘application/json’.
'Content-Type': 'text/plain' // ошибка
'Content-Type': 'application/json' // правильно
Заключение
Правильное использование JSON в веб-разработке критически важно для обеспечения безопасности и эффективности приложения. Валидация и санитизация данных, использование безопасных функций для обработки JSON и избегание распространенных ошибок могут помочь обеспечить надежную и безопасную работу с JSON. Надеюсь теперь вы согласитесь, что даже в таком простом инструменте, как JSON, могут быть неожиданные подводные камни и особенности, о которых нужно знать.
Также напоследок хочу пригласить вас на бесплатный урок, на котором поговорим о том, как работать с многопоточностью в NodeJS. Также на уроке вы познакомитесь с WorkerThreads. Регистрация доступна по ссылке.
Полезные ссылки
Что еще почитать по теме:
-
Документация MDN по JSON
-
Руководство OWASP по предотвращению SQL инъекций.
-
Подробнее о истории и важности JSON можно прочитать здесь и здесь.
-
Подробнее про JSON Schema тут и тут.
Инструменты:
-
Ajv (Another JSON Schema Validator): Один из самых популярных JSON Schema валидаторов. Он позволяет создавать сложные правила валидации, используя JSON Schema стандарт.
-
DOMPurify: Библиотека для санитизации HTML, которая помогает предотвращать XSS атаки.
-
express-validator: Библиотека для валидации и санитизации данных в Express.js приложениях.
-
Joi: Мощная библиотека для валидации данных в JavaScript. Она поддерживает множество типов данных и позволяет создавать сложные правила валидации.
-
validator.js: Библиотека строковой валидации и санитизации.
-
js-xss: Безопасный и мощный модуль санитизации HTML для JavaScript, предназначенный для предотвращения XSS атак.
-
sanitize-html: Библиотека, которая позволяет обрабатывать HTML, сохраняя только те элементы и атрибуты, которые вы хотите разрешить.
Before you dig into reading this guide, have you tried asking OpsGPT what this log means? You’ll receive a customized analysis of your log.
Try OpsGPT now for step-by-step guidance and tailored insights into your Elasticsearch operation.
Briefly, this error occurs when the JSON data sent to Elasticsearch is not correctly formatted or structured. This could be due to missing or extra commas, brackets, or quotes. To resolve this issue, you can use a JSON validator to check and correct the syntax of your JSON data. Alternatively, you can manually review your JSON data to ensure it adheres to the correct structure and syntax. Also, ensure that all strings are properly quoted and special characters are correctly escaped.
For a complete solution to your to your search operation, try for free AutoOps for Elasticsearch & OpenSearch . With AutoOps and Opster’s proactive support, you don’t have to worry about your search operation – we take charge of it. Get improved performance & stability with less hardware.
This guide will help you check for common problems that cause the log ” The input JSON data is malformed. ” to appear. To understand the issues related to this log, read the explanation below about the following Elasticsearch concepts: plugin.
Log Context
Log “The input JSON data is malformed.” class name is XContentRecordReader.java. We extracted the following from Elasticsearch source code for those seeking an in-depth context :
token = parser.nextToken(); } catch (XContentEOFException | XContentParseException e) { ++errorCounter; if (errorCounter >= PARSE_ERRORS_LIMIT) { logger.error("Failed to recover from malformed JSON data."; e); throw new ElasticsearchParseException("The input JSON data is malformed."); } } } while (token != XContentParser.Token.END_OBJECT); } }
Are you dealing with the “Error Decoding Json Data: Syntax Error” issue? If so, then you’ve come to the right place! In this blog post, we’ll take a look at what this error means and how to handle it. We’ll also provide some tips for avoiding the error in the future. So let’s get started!
Why did you get “Error Decoding Json Data: Syntax Error”
Error Decoding JSON Data: Syntax Error” occurs when the JSON data being decoded is not properly formatted, and as a result, the JSON decoder is unable to parse it.
There are several reasons that may cause this error, below are some of the common reasons for this error
- Missing or extra commas, curly braces, or quotes
- Incorrect data types of values in the JSON data
- Invalid characters or escape sequences in the JSON data
- Incorrect encoding of the JSON data
- Using single quotes instead of double quotes for key-value pairs in the JSON data
- Incorrect nesting of objects or arrays in the JSON data.
So, in order to help you address the “Error Decoding Json Data: Syntax Error” error, in today’s article, we will show an effective solution. Hopefully, they are useful for your error. Now, let’s check them out.
Now, you need to track the following step to fix the “Error Decoding Json Data: Syntax Error”.
Step 1: Go to the Cpanel hosting account for this account on your web host. And make sure that your website doesn’t get more problems, you need to create a backup for your database before.
Step 2: After logging into Cpanel, let’s go down to the phpMyAdmin option in the Databases section and click on it. You can take advantage of the search bar in the top right corner to look for this option.
Step 3: After clicking on it, this immediately takes you to a place where all databases belonging to your web hosting account will be displayed. Now, you need to click on the database that runs your Joomla site. Then, there is a table that runs your Joomla website displayed.
Step 4: Then, let’s click on the “SQL ” tab at the top of the page, and then it will show the fields where you can enter a command that can help you fix that error.
Step 5: You need to enter the following command in that field.
update abc_modules set params = ” where params like ‘%{“”}%’;”
Don’t forget to change “abc” to your table prefix in your database. Additionally, in order to run the above command on your _extension table too, you need to replace abc_modules with abc_extensions.
Step 6: Click on the “Go” button to execute the process.
After that, you will notice a message that shows the number of your rows affected, which means that your error should be tackled.
Now, you can navigate to the Administrator backend of your Joomla site and try to log in again.
Conclusion
it is important to be aware of the potential for errors when working with JSON data. While it can be frustrating to encounter this error, understanding the root cause and taking the necessary steps to fix it can help save time and stress. Fortunately, there are a few simple steps that can help resolve this issue. We hope that mentioned steps can assist you to address this issue.
If your error still exists, let’s mention your case in the comment below, and we will support you soon. Moreover, you can drop by our website to discover a wide range of bewitching, free WordPress Themes. They will help you design a beautiful website without effort.
If you go to the site http://json.parser.online.fr it will let you paste in data and check to see if it’s valid JSON or not. Yours is not.
As others have said, strings need to be enclosed in double quotes, not single quotes, and the «=» is not valid.
It would be quite easy to write code that would replace all occurrences of '
with "
. The song =
bit is less clear. The correct format for JSON would be:
{
"song": {
"artist":"Tom Waits",
"song":"New Coat Of Paint",
"lyrics":"Let\"s put a new coat of paint on this lonesome old town\nSet \"em up, we\"ll be knockin\" em [...]",
"url":"http://lyrics.wikia.com/Tom_Waits:New_Coat_Of_Paint"
}
}
Or you could get rid of the outer dictionary entirely:
{
"artist":"Tom Waits",
"song":"New Coat Of Paint",
"lyrics":"Let\"s put a new coat of paint on this lonesome old town\nSet \"em up, we\"ll be knockin\" em [...]",
"url":"http://lyrics.wikia.com/Tom_Waits:New_Coat_Of_Paint"
}
You need to look at your data and figure out what’s wrong with it in the general case that makes it not legal JSON.
EDIT:
After further digging, it seems that the URLs you’re using are returning JavaScript, not JSON. Try an URL like this instead:
http://lyrics.wikia.com/wikia.php?controller=LyricsApi&method=getSong&artist=Tom%20Waits&song=new%20coat%20of%20paint
That should give you the lyrics of the Tom Waits song New Coat of Paint in well-formed JSON.
This Github page gives info on the search parameters you can use to query that site and get lyrics:
https://github.com/Wikia/app/blob/dev/extensions/wikia/LyricsApi/LyricsApiController.class.php#L10-L15
The «Did not attempt to load JSON data» error message is a common problem faced by developers and programmers who work with JSON data in their applications. JSON, short for JavaScript Object Notation, is a popular data format used to transmit and store data.
When a program encounters the «Did not attempt to load JSON data» error message, it means that the code tried to load JSON data but failed to do so. This can happen for a variety of reasons, such as a missing or incorrect file path, network connectivity issues, or invalid JSON syntax.
Causes of the error message
Missing or incorrect file path
One common cause of the «Did not attempt to load JSON data» error message is a missing or incorrect file path to the JSON data. The code may be pointing to the wrong directory or file name, or the file may have been deleted or moved.
To fix this issue, the developer needs to check the file path to ensure that it is correct and that the file exists.
Network connectivity issues
If the JSON data is being retrieved from a server or an API, network connectivity issues may cause the «Did not attempt to load JSON data» error message. The data may not be accessible due to server downtime or network issues.
To troubleshoot this issue, the developer can check the network connection and try accessing the JSON data from a different network or server.
Invalid JSON syntax
JSON data must follow a specific syntax to be valid. If the JSON data contains invalid or incorrect syntax, the code may encounter the «Did not attempt to load JSON data» error message.
To fix this issue, the developer needs to validate the JSON data to ensure that it follows the correct syntax. There are several online tools available that can help with this task.
Conclusion
The «Did not attempt to load JSON data» error message can be frustrating for developers, but it is usually fixable. By checking the file path, troubleshooting network connectivity issues, and validating the JSON data, developers can resolve this error and continue working with their JSON data.