Нечувствительная к регистру строка выдерживает сравнение в LINQ к SQL

Начиная с Go 1.11, это просто невозможно полностью выполнить в рамках _test.go программы из-за механики HTTPS.

Однако вы можете подписать один сертификат и сгенерировать файлы server.crt и server.key, а затем ссылаться на них в своих программах _test.go из локального каталога на неопределенный срок.

Одноразовое поколение .crt и .key

Это сокращенная, слегка обтекаемая версия шагов, указанных в статье Дакш-шаха «Средний», Как заставить HTTPS работать в вашей локальной разработке среда за 5 минут , которая будет работать на Mac.

В каталоге, где вы хотите файлы server.crt и server.key, создайте два файла конфигурации

server.csr.cnf

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=US
ST=RandomState
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=hello@example.com
CN = localhost

и

[ 1118]

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.1

Затем введите следующие команды в этот каталог

openssl genrsa -des3 -out rootCA.key 2048 
# create a passphrase
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem -config server.csr.cnf
# enter passphrase
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.csr.cnf
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext
# enter passphrase

Наконец, заставьте вашу систему доверять сертификату, который вы использовали для подписи файлы, запустив

open rootCA.pem

Это откроет сертификат в приложении Keychain Acces, где он будет найден в разделе Сертификаты и назван localhost. Затем, чтобы Всегда доверять ему

  • Нажмите ввод, чтобы открыть его окно
  • Нажмите пробел, чтобы повернуть вниз Доверие
  • Измените «При использовании этого сертификата:» на Всегда доверять
  • Закройте окно и подтвердите свое решение

Примечание: Я пытался многие перестановки security add-trusted-cert из командной строки и, несмотря на то, что он добавляет сертификат в цепочку для ключей и помечает его как «Всегда доверять», мои программы на Go просто не будут ему доверять. Только метод GUI переводит систему в состояние, в котором мои программы Go будут доверять сертификату.

Любые программы Go, которые вы запускаете локально с использованием HTTPS, теперь будут доверять серверам, которые вы запускаете с использованием server.crt и server.key.

Запуск сервера

Вы можете создать *httptest.Server экземпляров, которые используют эти учетные данные с

func NewLocalHTTPSTestServer(handler http.Handler) (*httptest.Server, error) {
    ts := httptest.NewUnstartedServer(handler)
    cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
    if err != nil {
        return nil, err
    }
    ts.TLS = &tls.Config{Certificates: []tls.Certificate{cert}}
    ts.StartTLS()
    return ts, nil
}

Вот пример использования:

func TestLocalHTTPSserver(t *testing.T) {
    ts, err := NewLocalHTTPSTestServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello, client")
    }))
    assert.Nil(t, err)
    defer ts.Close()

    res, err := http.Get(ts.URL)
    assert.Nil(t, err)

    greeting, err := ioutil.ReadAll(res.Body)
    res.Body.Close()
    assert.Nil(t, err)

    assert.Equal(t, "Hello, client", string(greeting))
}

133
задан BlueMonkMN 8 May 2009 в 18:59
поделиться

4 ответа

As you say, there are some important differences between ToUpper and ToLower, and only one is dependably accurate when you're trying to do case insensitive equality checks.

Ideally, the best way to do a case-insensitive equality check would be:

String.Equals(row.Name, "test", StringComparison.OrdinalIgnoreCase)

NOTE, HOWEVER that this does not work in this case! Therefore we are stuck with ToUpper or ToLower.

Note the OrdinalIgnoreCase to make it security-safe. But exactly the type of case (in)sensitive check you use depends on what your purposes is. But in general use Equals for equality checks and Compare when you're sorting, and then pick the right StringComparison for the job.

Michael Kaplan (a recognized authority on culture and character handling such as this) has relevant posts on ToUpper vs. ToLower:

He says "String.ToUpper – Use ToUpper rather than ToLower, and specify InvariantCulture in order to pick up OS casing rules"

109
ответ дан 24 November 2019 в 00:03
поделиться

Если вы передадите строку без учета регистра в LINQ-to-SQL, она будет передана в SQL без изменений, и сравнение будет происходить в базе данных. Если вы хотите выполнять сравнение строк без учета регистра в базе данных, все, что вам нужно сделать, это создать лямбда-выражение, которое выполняет сравнение, и поставщик LINQ-to-SQL переведет это выражение в SQL-запрос с сохранением вашей строки.

Например, этот запрос LINQ:

from user in Users
where user.Email == "foo@bar.com"
select user

транслируется в следующий SQL поставщиком LINQ-to-SQL:

SELECT [t0].[Email]
FROM [User] AS [t0]
WHERE [t0].[Email] = @p0
-- note that "@p0" is defined as nvarchar(11)
-- and is passed my value of "foo@bar.com"

Как вы можете видеть, строковый параметр будет сравниваться в SQL, что означает, что все должно работать только как и следовало ожидать.

0
ответ дан 24 November 2019 в 00:03
поделиться

Я использовал System.Data.Linq.SqlClient.SqlMethods.Like (row.Name, "test") в моем запросе.

Выполняет сравнение без учета регистра.

72
ответ дан 24 November 2019 в 00:03
поделиться

Для выполнения запросов Linq to Sql, чувствительных к регистру, объявите "строковые" поля чувствительными к регистру, указав тип данных сервера с помощью одного из следующих:

varchar(4000) COLLATE SQL_Latin1_General_CP1_CS_AS 

или

nvarchar(Max) COLLATE SQL_Latin1_General_CP1_CS_AS

Примечание. «CS» в приведенных выше типах сопоставления означает «с учетом регистра».

Это можно ввести в поле «Тип данных сервера» при просмотре свойства с помощью Visual Studio DBML Designer.

Подробнее см. http://yourdotnetdesignteam.blogspot.com/2010/06/case-sensitive-linq-to-sql-queries.html

0
ответ дан 24 November 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: