我有两个问题。 问题一: 我正在尝试创建一个注册表单,用户可以在我的网站上注册。 当我运行这个mysql语句时,发现get dublicate条目错误:
$sql "insert into users(username, password) values('$username, sha('$password'))";
重复输入'da39a3ee5e6b4b0d3255bfef95601890afd80709'以获取密钥'密码' 尽管我多次更改了字符串sha('$ password')。 请帮忙。
else{
include("databaseconnection.php");
$databaseconnect = connect($host,$user,$password,$database)
or die("couldnot connect to database serever.\n");
$database_select = mysql_select_db($database,$databaseconnect)
or die("could not select dabases.\n " .mysql_error());
$query2 = "insert into company(username,password)
values('$username',sha1('$password'))";
$result2 = mysql_query($query2,$databaseconnect);
echo "you have been registered as '$companyloginName' <br/>";
header("Location:/index.php");
我的登录php脚本如下:
$result ="select username, password form users where username ='$username' and password = sha('$password');
if(mysql_num_rows($reuslt)==1){
echo"welcome '$username";
}
答案 0 :(得分:1)
首先,我会强烈建议不要单独使用MySQL sha()
或PHP sha1()
进行密码哈希。 如果您的数据库遭到入侵,这对您的用户来说是一个巨大的安全风险。
请花时间到read my previous answer on the subject of password hashing以正确保护您的数据。
其次,您的代码容易受到SQL Injection attack的攻击。使用mysql_real_escape_string()
来转义您之前要放入查询中的变量。
$query2 = "insert into company(username,password)
values('" . mysql_real_escape_string($username) .
"', sha1('" . mysql_real_escape_string($password) . "'))";
第三,您的$password
变量被databaseconnection.php
文件覆盖。
include("databaseconnection.php");
$databaseconnect = connect($host,$user, $password ,$database);
强调......
$databaseconnect = connect($host,$user,
的$password
强>,$database);
因此,查询中稍后使用的$password
仍然包含数据库连接的密码,而不是用户的密码。
在databaseconnection.php
中更改变量的名称,甚至更好,使用数组来保存所有配置。
$dbConnectParams = array('host' => 'localhost'
'user' => 'myUser',
'pass' => 'myPassword',
'db' => 'myDB');
然后,按如下方式更改您的代码:
include("databaseconnection.php");
$databaseconnect = mysql_connect($dbConnectParams['host'],
$dbConnectParams['user'],
$dbConnectParams['pass'],
$dbConnectParams['db']);
由于您在调用mysql_connect()
时已经传递了数据库,因此无需致电mysql_select_db()
。
答案 1 :(得分:0)
da39a3ee5e6b4b0d3255bfef95601890afd80709
是空字符串的sha1哈希值。确保您实际将密码插入SQL查询中,例如通过回显查询而不是将其发送到SQL服务器。
修改将新信息添加到您的问题中,请查看以下两行:
include("databaseconnection.php");
$databaseconnect = connect($host,$user,$password,$database)
此处,$password
是用于连接数据库的密码。包含databaseconnection.php可能会覆盖之前$password
变量中的内容。
尝试echo $query2
,您可能会自己看到,SQL查询根本不包含任何密码,或者其中的密码与用户输入的密码不同。 / p>
答案 2 :(得分:0)
从注释行猜测,您可能会意外地使用“databaseconnection.php”中设置的连接密码而不是用户密码 - 您没有显示如何初始化$ password字符串。
还要注意你的sql中不应该出现的逗号:
insert into company(username,password,)
^
我没有测试过这是不是原因,但你应该把它除去并重新测试。
另外,认真考虑pdo / prepared语句以防止sql注入,如果你想从用户输入插入密码,更是如此。