Использование параметров SQL для защиты моего приложения от атак внедрения - PullRequest
4 голосов
/ 27 декабря 2011

Я не могу использовать параметры SQL в Delphi, если я пытаюсь использовать их для защиты своей формы входа, я получаю следующую ошибку при входе в систему

[0x0005] Операция не поддерживается

Код, который я использую:

SQLQuery1.SQL.Text := 'SELECT * FROM registered WHERE email= :Email'+
                      ' and login_pass= :Password';
SQLQuery1.ParamByName('email').AsString := Email;
SQLQuery1.ParamByName('password').AsString := Password;

SQLQuery1.Open; // Open sql connection
if SQLQuery1.recordCount >0 then form2.Show;

но это не работает, приведенный ниже код работает правильно, но всегда ли это небезопасно:

SQLQuery1.SQL.Text := 'SELECT * FROM registered WHERE email="'+Email+
                      '" and login_pass= "'+Password+'"';

Я использую компоненты TMySQLConnection и TMySQLQuery, для ParamsCheck установлено значение True и использую первый код, упомянутый выше, который не работает, как исправить проблему!

Любое предложение или помощь будут оценены.

Спасибо

Ответы [ 2 ]

3 голосов
/ 27 декабря 2011

Проверьте справку для «RecordCount». Может возникнуть исключение, если набор данных не может определить, сколько записей возвращено. Что если вы удалите его и просто проверьте, не является ли набор данных IsEmpty?

2 голосов
/ 27 декабря 2011

Использование соленых хэшей для проверки пароля
Хранение незашифрованного пароля в базе данных - нет-нет.
Вместо этого используйте соленый хеш:

SELECT * FROM registered WHERE email = :email 
AND passhash = SHA2(CONCAT(salt,:password),512)

Вы можете сохранить пароль в БД, выполнив:

INSERT INTO registered (email, passhash, salt) 
VALUES (:email, SHA2(CONCAT(:salt,:password),512), :salt)  

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

...