http://www.prise.tk/activate.php?x=roshnihi%40gmail.com&y=a588e697aac7814486ef589242ac8dbb
以上是我的激活网址,该网址会发送给尝试注册的新用户。但是我的$_GET
代码中的activate.php
无法获取x和y的值。
以下是代码中的代码段:
//Validate $_GET['x'] & $_GET['y']
$x = $y = FALSE;
if(isset($_GET['x']) && preg_match('/^[\w.-]+@[\w.-]+\.[A-Za-z]{2,6}&/', $_GET['x'])){
$x = $_GET['x'];
}
if(isset($_GET['y']) && (strlen($_GET['y']) == 32 )){
$y = $_GET['y'];
}
if($x && $y){ //Update Database
echo 'connected';
require('../db.php');
$q = "UPDATE dealers SET active=NULL WHERE (email='". mysqli_real_escape_string($handle, $x) . "' AND active='" . mysqli_real_escape_string($handle, $y) . "') LIMIT 1";
$r = mysqli_query($handle, $q) or trigger_error("Query : $q\n<br>MySql Error:" . mysqli_error($handle));
if (mysqli_affected_rows($handle) == 1){
echo "<h3> Your account is now active. You may now log in.</h3>";
}
AND below is my register.php code:
$a = md5(uniqid(rand(),true)); // Create activation code
$q = "INSERT INTO dealers (fname, lname, email, password, address, pincode, active) VALUES ('$fn','$ln','$e','$p','$add','$pin','$a')";
$r = mysqli_query ($handle,$q) or trigger_error("Query : $q\n<br>MySql Error:" . mysqli_error($handle)); //Run the query
if(mysqli_affected_rows($handle) == 1){ // if query ran ok
// Send Mail
$body = "Thankyou for registering. To activate, please click on the link:\n\n";
$body .= BASE_URL . 'activate.php?x='. urlencode($e) . "&y=$a" ;
mail($trimmed['email'], 'Registration Confirmation', $body, 'From: xxx@gmail.com' );
答案 0 :(得分:0)
我会首先获取并检查第二个。在这里,检查是否存在x和y,例如
$x = (isset($_GET['x'])) ? urldecode($_GET['x']) : NULL;
然后检查x是否具有有效的电子邮件地址格式,例如
if(filter_var($x, FILTER_VALIDATE_EMAIL) !== false) {
.. code ..
}
长度检查有点不合适 - 因为您应该检查数据库表中是否存在密钥。否则,唯一的有效性检查是长度。人们可以轻易伪造一个32个字符的密钥来启用他知道电子邮件地址的人的帐户。不是真正的危险,但仍然是安全&#34;事故&#34; IMHO。
我在本地复制了你的代码并且工作正常。希望这会有所帮助。
提示:尽量使用PDO或至少使用面向对象的样式(PHP Manual)。这是未来。 :)