Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dostarczone parametry do Zend_Auth_Adapter_DbTable nie wygenerowały poprawnej instrukcji sql

To zależy od wersji MySQL, jak opisano powyżej. Postępując zgodnie z dokumentacją MySQL dla wersji 5.5:

„Jeśli aplikacja przechowuje wartości z funkcji, takiej jak MD5() lub SHA1(), która zwraca ciąg cyfr szesnastkowych, bardziej wydajne przechowywanie i porównania można uzyskać, konwertując reprezentację szesnastkową na binarną za pomocą UNHEX() i przechowując wynik w kolumna BINARY(N). Każda para cyfr szesnastkowych wymaga jednego bajtu w postaci binarnej, więc wartość N zależy od długości ciągu szesnastkowego. N to 16 dla wartości MD5() i 20 dla wartości SHA1() ”.

Tak więc, zamiast obniżać wersję MySQL, możesz wykonać następujące czynności:

  • zmień typ kolumny „hasło” z varchar(32) na binarny(16)
  • dodaj funkcję MySQL „UNHEX()” do zapytania MySQL w kodzie ZF, na przykład:
$adapter = new Zend_Auth_Adapter_DbTable(
    $db,
    'user',
    'login',
    'password',
    'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);

W moim przypadku to działa dobrze.

Edytuj --Jeśli sól hasła jest również przechowywana w kolumnie binarnej (np. jeśli był to ciąg szesnastkowy wygenerowany przez funkcję SHA1), to ostatnim parametrem Zend_Auth_Adapter_DbTable powinien być:'UNHEX(SHA1(CONCAT(?, LOWER() HEX(salt))))) „Zatem konwertujemy sól z powrotem na ciąg szesnastkowy składający się z małych liter przed połączeniem z hasłem. HEX() zwraca sól w postaci wielkich liter, więc możesz po prostu pominąć wywołanie LOWER(), jeśli twoja sól była pierwotnie pisana wielkimi literami przed zapisaniem jej za pomocą UNHEX().



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak pobrać dokładnie pasujące rekordy w Spring JPA @Query

  2. Co to jest tabela indeksów klastrowych?

  3. mysql GDZIE MECZ PRZECIW

  4. znajdź N-ty największy element w SQL

  5. Prześlij na varchar