我正在尝试实现一段代码,检查hashed_password和user_name是否匹配。下面的代码首先检查用户名是否有效,如果有效,代码将检查密码是否与用户名匹配。但是,这是一段代码不起作用。我可以从数据库输入正确的用户名和相应的正确密码,它会显示正确的消息您可以继续!
。但是如果我从数据库输入正确的用户名,但密码不正确,它仍然会显示您可以继续!
。感谢任何帮助!
public void letsLogin() throws SQLException
{
System.out.print("Enter your user name: ");
username = in.next();
sql = "SELECT " + "username " + "FROM" + " users_table" + " where username = "
+ "'" + username + "'";
result = s.executeQuery(sql);
// select hashed_password
sql_hash = "SELECT " + "hashed_password = " + "crypt(" + "'"
+ hashed_password + "'" + ","+ "hashed_password)" +
" as matched " + "from users_table" + " where username = "
+ "'" + username + "'";
result2 = s2.executeQuery(sql_hash);
if(result.next())
{
System.out.println("You are registered!");
// ask user to enter password
System.out.println("Enter your password: ");
hashed_password = stdin2.next();
// check to see if username and hashed_password match
if(result2.next())
{
System.out.println("You can proceed!");
}
else
{
System.exit(0);
}
}
要解决此问题,最好使用< code>PrepardStatement并创建单独的函数来检查用户名和密码。
我不打算分析为什么这段代码不起作用,因为由于SQL注入漏洞,它必须从头开始重写。 考虑一下当有人输入此用户名时会发生什么情况:
' or 1=1 or 'x' = '
第一个查询变为:
SELECT username FROM users_table where username = '' or 1=1 or 'x' = '';
第二个查询变为:
SELECT hashed_password = crypt('any string', anything) as matched
from users where username = '' or 1=1 or 'x' = '';
在这种情况下,两个查询始终返回一些行。 由于您的代码仅检查 resultset.next()
调用的结果,因此所有检查都将始终通过,并且 ....攻击者登录系统时既不知道用户名也不知道密码。
问题内容: 我想检查一个字符串是否匹配以下格式: 字符串中不应有空格,破折号前仅2个数字,破折号后2个数字。 最好的方法是什么? 问题答案: 您可以使用: 如果您将要进行大量此类验证,请考虑预编译正则表达式: 然后,您可以使用。有关更多详细信息,请参见课程。
因此,我用java编写寄存器和登录系统。我对注册的计划是:用户输入用户名,然后输入密码。 密码被存储在一个. txt文件中。现在,当用户必须输入登录系统的密码时,我如何从。txt文件自其加盐? 我的问题有两个:我如何盐密码,然后存储它。如何找回原来的密码,所以要检查一下。 我找了很多东西,但都没有找到。
我的密码应类似于: “密码应包含至少一个大写字母,一个小写字母,一个数字和一个特殊字符,长度至少为八个字符” 我使用的模式是:
字符串格式应如下所示。它是一个逗号分隔的,应该有两个键access_token和client,每个键都应该有它的值,后面跟一个=(格式如下)。 如何编写一个高效的代码来检查给定的字符串是否与下面的模式匹配。 access_token=,client=
如何检查字符串是否与此模式匹配? 大写字母,数字,大写字母,数字。。。 例如,这些将匹配: 这些不会(“^”表示问题)
有没有一种简单/快速的方法来检查地图中的元素是否使用流不同?我有这张地图: