所以我输入了这段代码,据说在您输入有效的密码并回答安全问题后会向您发送电子邮件。我的问题是这个表格不会提交我给出的答案。它总是回应"提交"在第二个php块的乞讨。如果你能发现我可能错过的任何其他错误,请告诉我。非常感谢。
<?php
define ('DB_SERVER','fenrir');
define ('DB_USERNAME','ArchivrTW');
define ('DB_PASSWORD','vPOZOa1txS');
define ('DB_DATABASE','ArchivrTW');
$connection = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
if(!$connection)
{
die('Could not connect because: ' . mysql_error());
}
?>
<?php
$test = $_POST['email'];
$query = "SELECT 'EMAIL' FROM 'USERS' WHERE 'EMAIL'=$test";
echo(strlen($query));
if(strlen($query) > 42)
{
$query1 = "SELECT 'SecurityQ' from 'USERS' WHERE 'EMAIL' =$test";
$query2 = "SELECT 'SecurityA' from 'USERS' WHERE 'EMAIL' =$test";
$result = mysqli_query($connection,$query);
$result1 = mysqli_query($connection,$query1);
$Results = mysqli_fetch_assoc($result);
$Results1 = mysqli_fetch_assoc($result1);
$Results2 = mysqli_fetch_assoc($result2);
echo($Results1);
}
?>
<form action="recover.php" method="post">
<p>Security Question Answer: <input type="text" name="answer" placeholder="Type your answer here" /> </p>
<p><input type="submit" name="answer" id="answer" /> </p>
</form>
<?php
$answer=$_POST['answer'];
echo($answer);
if (count($Results) >= 1 && strcmp($_POST['answer'],$Results2) == 0)
{
$REQ_STATUS = 1;
$new_passwd = rand(1,1000000);
$to = $email;
$subject = "Archivr-Forgot Password";
$msg = "Use this generated password to log in then change it using the Edit Profile Menu";
mail($to, $subject, $msg);
}
else
{
$message="Account not found or wrong security question answer";
}
if($REQ_STATUS == 1)
{
$update_query="UPDATE USERS set PASSWORD =".$new_passwd." where EMAIL ='". $to ."'";
}
?>
</body>
</html>
第一个块有效,问题是表格或第二个块。
答案 0 :(得分:2)
您使用不正确的identifier qualifiers表示所有表和列都是单引号,而不是将$test
变量包装在引号中;这是一个字符串。
这个例如:
SELECT 'EMAIL' FROM 'USERS' WHERE 'EMAIL'=$test
应为
SELECT `EMAIL` FROM `USERS` WHERE `EMAIL`='$test'
你可能在某个地方看到了一个教程,它的刻度类似于常规的单引号。他们是不一样的; 这些是两种不同的动物。
然后,您需要按照上述相同的方法对其余查询执行相同操作。
以此为例:
$result = mysqli_query($connection,$query) or die(mysqli_error($connection));
会发出语法错误信号。
然后这个mysql_error()
- 那应该是mysqli_error($connection)
。你不能混合MySQL API。他们不互相混淆。
您似乎也没有做任何事情:
$update_query="UPDATE USERS set PASSWORD =".$new_passwd." where EMAIL ='". $to ."'";
无论是否与问题相关,您实际上并未执行该查询。
将error reporting添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告应仅在暂存时完成,而不是生产。
参考文献:
脚注:
您目前的代码向SQL injection开放。使用prepared statements或PDO with prepared statements,它们更安全。
isset()
和/或!empty()
围绕您的可执行代码和POST阵列。密码:
我希望您使用的是现代密码哈希方法,因为我认为这与重置密码有关。
对于密码存储,请使用CRYPT_BLOWFISH或PHP 5.5的password_hash()
功能。对于PHP&lt; 5.5使用password_hash() compatibility pack
。
答案 1 :(得分:2)
您容易受到sql injection attacks;
您有重复的字段名称:
<p>Security Question Answer: <input type="text" name="answer" placeholder="Type your answer here" /> </p>
^^^^^^^^^^^^
<p><input type="submit" name="answer" id="answer" /> </p>
^^^^^^^^^^^^^
由于字段名称相同,因此提交按钮会覆盖/替换文本字段,最后会提交空白值。
答案 2 :(得分:0)
您的表单字段和提交按钮的名称都为&#34; answer&#34;。将您的提交按钮名称重命名为&#34;提交&#34;或者是其他东西。