Browse Source

Set a cap on the length of subscription queries. (backport #7263) (#7264)

As a safety measure, don't allow a query string to be unreasonably
long. The query filter is not especially efficient, so a query that
needs more than basic detail should filter coarsely in the subscriber
and refine on the client side.

This affects Subscribe and TxSearch queries.

(cherry picked from commit 9dc3d7f9a2)
pull/7268/head
mergify[bot] 3 years ago
committed by GitHub
parent
commit
052b08160a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 0 deletions
  1. +7
    -0
      internal/rpc/core/events.go
  2. +2
    -0
      internal/rpc/core/tx.go

+ 7
- 0
internal/rpc/core/events.go View File

@ -2,6 +2,7 @@ package core
import (
"context"
"errors"
"fmt"
"time"
@ -14,6 +15,10 @@ import (
const (
// Buffer on the Tendermint (server) side to allow some slowness in clients.
subBufferSize = 100
// maxQueryLength is the maximum length of a query string that will be
// accepted. This is just a safety check to avoid outlandish queries.
maxQueryLength = 512
)
// Subscribe for events via WebSocket.
@ -25,6 +30,8 @@ func (env *Environment) Subscribe(ctx *rpctypes.Context, query string) (*coretyp
return nil, fmt.Errorf("max_subscription_clients %d reached", env.Config.MaxSubscriptionClients)
} else if env.EventBus.NumClientSubscriptions(addr) >= env.Config.MaxSubscriptionsPerClient {
return nil, fmt.Errorf("max_subscriptions_per_client %d reached", env.Config.MaxSubscriptionsPerClient)
} else if len(query) > maxQueryLength {
return nil, errors.New("maximum query length exceeded")
}
env.Logger.Info("Subscribe to query", "remote", addr, "query", query)


+ 2
- 0
internal/rpc/core/tx.go View File

@ -72,6 +72,8 @@ func (env *Environment) TxSearch(
if !indexer.KVSinkEnabled(env.EventSinks) {
return nil, fmt.Errorf("transaction searching is disabled due to no kvEventSink")
} else if len(query) > maxQueryLength {
return nil, errors.New("maximum query length exceeded")
}
q, err := tmquery.New(query)


Loading…
Cancel
Save