我有两个问题。问题一:我正在尝试创建一个注册表格,用户可以在我的网站上注册。当我运行这个mysql语句时,发现一个get-dublicate条目错误:
$sql "insert into users(username, password) values('$username, sha('$password'))";
密钥"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";
}
首先,我建议不要将MySQL的sha()
或PHP的sha1()
单独用于密码哈希目的如果您的数据库遭到破坏,这对您的用户来说是一个巨大的安全风险
请花点时间阅读我之前关于密码哈希的回答,以正确保护您的数据。
其次,您的代码容易受到SQL注入攻击。使用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()
。
da39a3ee5e6b4b0d3255bfef95601890afd80709
是空字符串的sha1哈希。确保您确实将密码插入到SQL查询中,例如,通过回显查询而不是将其发送到SQL服务器。
编辑随着新信息添加到您的问题中,请检查以下两行:
include("databaseconnection.php");
$databaseconnect = connect($host,$user,$password,$database)
这里,$password
是用于连接到数据库的密码。databaseconnection.php的包含可能会覆盖$password
变量中以前的内容。
尝试echo $query2
,您可能会亲眼看到,SQL查询根本不包括任何密码,或者其中的密码与用户输入的密码不同。
根据注释行推测,您可能意外使用了在"databaseconnection.php"中设置的连接密码,而不是用户密码-您没有显示如何初始化$password字符串。
还要注意sql中不应该存在的逗号:
insert into company(username,password,)
^
我还没有测试这是否是原因,但你可能应该把它去掉,再测试一次。
此外,请认真考虑pdo/prepared语句以防止sql注入,如果您想从用户输入中插入密码,则更应如此。