我想知道在测试我的网站时,用户是否可以通过在以下查询中进行一些进一步修改来从我的数据库中获取数据
SELECT * FROM users WHERE login='admin' AND password='1' OR '1'='1';
前提是他知道admin
用户名并使用'1'='1'
密码来破解它。
他还能添加什么来在屏幕上回显密码或查找表格详细信息?
我想这样做是为了了解不受保护的限制SQL
可能会在我关于 SQL 注入的演示中对我们造成伤害
我想知道在测试我的网站时,用户是否可以通过在以下查询中进行一些进一步修改来从我的数据库中获取数据
SELECT * FROM users WHERE login='admin' AND password='1' OR '1'='1';
前提是他知道admin
用户名并使用'1'='1'
密码来破解它。
他还能添加什么来在屏幕上回显密码或查找表格详细信息?
我想这样做是为了了解不受保护的限制SQL
可能会在我关于 SQL 注入的演示中对我们造成伤害
假如说 :
' OR '1'='1';
是一个 hack,如果输入没有被清理,那么可能性可能是无穷无尽的,例如:
' OR '1'='1'; drop table users;
等等。
表单注入到用户名和密码框应如下所示.. z' OR 'x'= 'x..... 但攻击者可以使用 url 注入技术从您的网站获取信息
这个 sql 查询:-
SELECT * FROM users WHERE login='admin' AND password='1' OR '1'='1';
评估为SELECT * FROM users WHERE login='admin' AND TRUE
因此它将选择login column
值为admin的行。它可以用来绕过登录。它有一个严重的 SQL 注入漏洞。
最好使用Prepared Statement。SQL 注入的问题在于,用户输入被用作SQL 语句的一部分。通过使用准备好的语句,您可以强制将用户输入作为参数的内容进行处理(而不是作为 SQL 命令的一部分)。
保护自己免受 SQL 注入攻击的最佳方法之一是使用PreparedStatement而不是Statement。
If you salt and hash the password (instead of storing it directly in the table), then the user cannot inject SQL via the password.
If you table looks like so:
TABLE users:
+-------+-----------+---------------------------+---------------...
| login | salt | password | other columns ...
+-------+-----------+---------------------------+---------------...
| foo42 | 231732156 | d4154b1134b511a5461efe423 | ...
| bob69 | 765219179 | bba3ef876fe78ebacdccd87ff | ...
+-------+-----------+---------------------------+---------------...
Then you can store the "password" the first time a user creates their account by generating a one-time random salt, appending it to the end of the user-submitted password, and hashing it. Now, whenever the user tries to log in, you just recompute the hash and check it against the stored password. This way, they can use a password like ' or '1' == '1
if they want, but your server will only use the hash (which may look like bba3ef876fe78ebacdccd87ff
, for example)