From b6ecff15c75bc63561e90dc839fb124b32c8d438 Mon Sep 17 00:00:00 2001 From: Almaz Sharipov Date: Mon, 6 Oct 2025 08:09:11 +0300 Subject: [PATCH] some fixes --- README.md | 4 ++-- README.ru.md | 3 ++- src/handlers/blob.go | 11 +++++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 599a2ad..c8d60b6 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,8 @@ Note that this service is not limited to 1C and can be utilized in other context * Prepared Statements : supported; * BLOB read/write : supported; * Flexible Binding : Can bind to localhost or any specified IP address for enhanced security. By default, it is intended to bind to localhost and run alongside legacy software; -* Security Responsibility : Does not perform SQL query validation and any other security checks. It is the responsibility of DBA to configure appropriate database privileges. Keep in mind ADODB is the old-school engineering and this tool is the simple replacement. All security-related work must be completed first at -SQL server — as it always was, long before the era of shiny new toys; +* Security Responsibility : Does not perform SQL query validation and any other security checks. It is the responsibility of DBA to configure appropriate database privileges. Keep in mind ADODB is the old-school engineering and this tool is the simple and quick replacement. All security-related work must be completed +first at SQL server — as it always was, long before the era of shiny new toys. Consider to implement ORM model in the future or another secure-driven patterns; * Monitoring and Metrics : Provides Prometheus metrics for performance monitoring and observability; ## API description diff --git a/README.ru.md b/README.ru.md index 970799b..90ac447 100644 --- a/README.ru.md +++ b/README.ru.md @@ -41,7 +41,8 @@ + Поддержка подготовленных выражений: реализована; + Поддержка записи и чтения BLOB полей: реализована; + Гибкая привязка: может быть привязан к localhost или любому указанному IP-адресу для повышения безопасности. По умолчанию предполагается привязка к localhost и работа в паре с устаревшим программным обеспечением; -+ Ответственность за безопасность: не выполняет валидацию SQL-запросов. Ответственность за настройку соответствующих привилегий базы данных лежит на администраторе СУБД. Помните, что это простая прямая замена вызовов ADODB, который является "дедовской" технологией, и раз вы заинтересованы заменить его, то у вас уже должны быть настроены роли и пользователи на СУБД, в противовес тому что принято сейчас в смузи-технологиях. Не используйте учётную запись с административными привилегиями! ++ Ответственность за безопасность: не выполняет валидацию SQL-запросов. Ответственность за настройку соответствующих привилегий базы данных лежит на администраторе СУБД. Помните, что это простая и быстрая замена вызовов ADODB, который является "дедовской" технологией, и раз вы заинтересованы заменить его, то у вас уже должны быть настроены роли и пользователи на СУБД, в противовес тому что принято сейчас в смузи-технологиях. Не используйте учётную запись с административными привилегиями! Рассмотрите на будущее +разработку ORM или других более безопасных паттернов разработки. + Мониторинг и метрики: предоставляет метрики Prometheus; ## Описание API diff --git a/src/handlers/blob.go b/src/handlers/blob.go index ce0e308..bb47580 100644 --- a/src/handlers/blob.go +++ b/src/handlers/blob.go @@ -7,6 +7,8 @@ import ( "sql-proxy/src/db" ) +const maxBlobSize int64 = 32 << 20 // 32 MB, change here if required + func ReadBlob(w http.ResponseWriter, r *http.Request) { if ok := checkApiVersion(w, r); !ok { @@ -31,6 +33,11 @@ func ReadBlob(w http.ResponseWriter, r *http.Request) { return } + if int64(len(data)) > maxBlobSize { + errorResponce(w, "Data too large", http.StatusRequestEntityTooLarge) + return + } + w.Header().Set("Content-Type", "application/octet-stream") w.Write(data) @@ -42,8 +49,8 @@ func WriteBlob(w http.ResponseWriter, r *http.Request) { return } - maxSize := int64(32 << 20) // 32 MB, change here if required - connId, sqlQuery, data, ok := parseQueryHttpHeadersAndMultipartBody(r, maxSize) + //maxSize := int64(32 << 20) // 32 MB, change here if required + connId, sqlQuery, data, ok := parseQueryHttpHeadersAndMultipartBody(r, maxBlobSize) if !ok { errorResponce(w, "Bad request", http.StatusBadRequest) return