问题描述
我有两个问题。
问题一:
我正在尝试创建一个注册表单,用户可以在其中注册我的网站。
当我运行此MysqL语句时,发现重复条目出现错误:
$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\";
}
解决方法
“ 3”是空字符串的sha1哈希。确保确实将密码插入到SQL查询中,例如,通过回显查询而不是将其发送到SQL Server。
编辑将新信息添加到您的问题后,请查看以下两行:
include(\"databaseconnection.php\");
$databaseconnect = connect($host,$user,$password,$database)
在此,“ 5”是用于连接数据库的密码。包含databaseconnection.php可能会覆盖ѭ5变量中的内容。
尝试按“ 7”键,您可能会自己看到它,SQL查询根本不包含任何密码,或者其中的密码与用户输入的密码不同。
, 首先,我强烈建议不要将MySQL的sha()
或PHP的sha1()
单独用于密码哈希。如果您的数据库受到威胁,这会对您的用户造成巨大的安全风险。
请花点时间阅读我之前关于密码哈希的答案,以正确保护您的数据。
其次,您的代码容易受到SQL Injection攻击。使用ѭ10可以转义要预先放入查询中的变量。
$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,$database);
重点...
$databaseconnect = connect($host,
$password
,$database);
因此,稍后在查询中使用的“ 5”仍然包含数据库连接的密码,而不是用户的密码。
在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()
。
, 从注释行猜测,可能是您不小心使用了\'databaseconnection.php \'中设置的连接密码,而不是用户密码-您没有显示如何初始化$ password字符串。
还要注意您的sql中不应该出现的逗号:
insert into company(username,password,)
^
我尚未测试这是否是原因,但您可能应该摆脱它,然后再次测试。
另外,请认真考虑使用pdo / prepare语句来防止sql注入,如果要从用户输入中插入密码,则更应如此。