使用 SQL 参数保护我的应用程序免受注入攻击

发布于 2024-12-22 21:58:58 字数 837 浏览 0 评论 0原文

我无法在 Delphi 中使用 SQL 参数,如果我尝试使用它们来保护我的登录表单,则会在登录时收到以下错误

[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+'"';

我正在使用 TMySQLConnectionTMySQLQuery组件,将 ParamsCheck 设置为 True,并使用上面提到的第一个代码,该代码不起作用,如何纠正该问题!

任何建议或帮助将不胜感激。

谢谢

I can't use SQL parameters in Delphi, if I try to use them to protect my login form, I get the following error upon login

[0x0005] Operation not supported

The code I am using is :

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;

but it is not working, the code below works correctly but is it always unsafe :

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

I am using TMySQLConnection and TMySQLQuery components, set ParamsCheck to True, and using the first code mentioned above which doesn't work, how to correct the problem!

Any suggestion or help would be appreciated.

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

瑕疵 2024-12-29 21:58:58

检查“RecordCount”的帮助。如果数据集无法确定返回的记录数,则可能会引发异常。如果删除它并简单地检查数据集是否为 IsEmpty 会怎样?

Check the help for "RecordCount". It may raise an exception if the dataset can't determine how many records are returned. What if you remove it and simply check if the dataset not IsEmpty?

初吻给了烟 2024-12-29 21:58:58

使用加盐哈希值进行密码检查
在数据库中存储未加密的密码是绝对不允许的。
使用加盐哈希代替:

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)  

盐不需要是真正随机的,但它确实需要有点随机并且对于每个用户来说都是不同的。

Use salted hashes for your password check
Storing a unencrypted password in a database is a no-no.
Use a salted hash instead:

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

You can store the passhash in the DB by doing:

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

The salt does not need to be truely random, but it does need to be somewhat random and different for each user.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文