PHP脚本中的HTTP 500错误

时间:2017-03-12 15:41:36

标签: php mysqli

我的register.php文件出现500错误。 我不知道为什么... 我尝试了一些php验证器网站,但他们没有帮助我。 XD

以下是代码:

register.php:

<?php
require('connect.php');
// If the values are posted, insert them into the database.
if (isset($_POST['username']) && isset($_POST['password'])) {
    $username = $_POST['username'];
      $email = $_POST['email'];
    $password = $_POST['password'];
            $premium = "false";
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR']?: $_SERVER['HTTP_CLIENT_IP']?: $_SERVER['REMOTE_ADDR'];
            $countrycodeget = json_decode(file_get_contents("https://ipinfo.io/{$ip}"));
            $countrycode = $countrycodeget->country;
            $active = "1"
            $query = "INSERT INTO `user` (username, password, email, premium, ip, countrycode, active) VALUES ('$username', '$password', '$email',         '$premium', '$ip', '$countrycode', '$active')";
        $result = mysqli_query($connection, $query);
        if ($result) {
            $smsg = "Your account has been created.";
        } else {
            $fmsg ="An error occured, please try again later.";
        }
    }
?>

connect.php:

<?php
$connection = mysqli_connect('localhost', 'xxxx', 'xxxx', 'xxxx');
if (!$connection){
die("Database Connection Failed" . mysqli_error($connection));
}
$select_db = mysqli_select_db($connection, 'test');
if (!$select_db){
    die("Database Selection Failed" . mysqli_error($connection));
}
?>

3 个答案:

答案 0 :(得分:4)

这里至少有一个语法错误:

 $active = "1"

行尾没有分号。

但是下次你应该指定:

  • 你得到的500错误的确切文本(在这种情况下,它可能是“行中的语法错误...”,这将是一个巨大的帮助)
  • php_error日志或Apache错误日志中的错误(如果有)

在紧要关头,您可以通过命令行PHP分析您的PHP文件,而不涉及任何验证程序站点:

php -l name/of/your/file.php

调试

所以你得到了:

Warning: mysqli_connect(): (HY000/1044): Access denied for user     'admin'@'localhost' to database 'account' in /dir/account/connect.php on line 2 

PHP Warning: mysqli_error() expects parameter 1 to be mysqli, boolean given in /dir/account/connect.php on line 4 

第二个警告是由于您通过$connection而未将其检查为有效资源。所以:

$connection = mysqli_connect(...);
if (!is_resource($connection)) {
    die("Connection error"); // And you cannot use $connection.
}

第一个警告来自MySQL:

Warning: mysqli_connect(): (HY000/1044): Access denied for user     'admin'@'localhost' to database 'account' in /dir/

显然,用户admin没有帐户数据库的访问权限。

您需要一个管理员帐户才能登录MySQL服务器,当您在那里时:

GRANT ALL PRIVILEGES ON account.* TO 'admin'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

第一个命令授予访问权限,第二个命令使其保持不变。请注意'localhost':服务器认为您的连接来自的地方。

您强烈希望将访问主机提供给完全相同的主机 MySQL告诉您它来自您。即使你认为它没有任何区别,它确实(或者可能会这样做,为什么会冒风险?)。

在某些系统上,即使localhost被广泛认为是(例如)127.0.0.1 的同义词,使用错误的会使连接失败(对于MySQL来说,这实际上更真实,其中localhost不是127.0.0.1的同义词;但它适用于其他站点,其中webserver.mydomain.net解析为xyzk,但如果MySQL服务器看到你来自webserver.mydomain.net,则使用xyzk将无效。

Danger Will Robinson!

您的代码还有一个问题:您从用户那里获取两个值,不检查它们,并将它们插入数据库

假设我用这个密码注册了"bobby" account

LittleBobbyTables', (SELECT password FROM user WHERE username = 'admin'), '...',...) -- '

您的INSERT查询现在变为:

INSERT INTO `user` (username, password, email, ...
VALUES ('bobby', 'LittleBobbyTables', (SELECT password FROM user WHERE username = 'admin'), '...',...) -- ', rest of the old code

该帐户现已创建,其密码为LittleBobbyTables,其电子邮件现在为管理员用户的密码

哈希密码不是真正的解决方案(即使有人声称这样做),因为我可以在电子邮件字段上运行相同的攻击,甚至是 user 字段,并恢复哈希密码,如果不加盐,95%的次数将允许我找出管理员密码是什么。但更重要的是,如果你不保护 login 页面,我愿意打赌所有与数据库接口的其他页面都会更开放(在某些系统上,我可以锁定管理员,并通过“联系我们”页面发送信息查询来获取自己的访问权限。

所以你想阅读thisthis,甚至是this

答案 1 :(得分:1)

使用以下代码更新您的register.php

   <?php
    require('connect.php');
    // If the values are posted, insert them into the database.
    if (isset($_POST['username']) && isset($_POST['password'])) {
        $username = $_POST['username'];
          $email = $_POST['email'];
        $password = $_POST['password'];
                $premium = "false";
                $ip = $_SERVER['HTTP_X_FORWARDED_FOR']?: $_SERVER['HTTP_CLIENT_IP']?: $_SERVER['REMOTE_ADDR'];
                $countrycodeget = json_decode(file_get_contents("https://ipinfo.io/{$ip}"));
                $countrycode = $countrycodeget->country;
                $active = "1";
                $query = "INSERT INTO `user` (username, password, email, premium, ip, countrycode, active) VALUES ('$username', '$password', '$email',         '$premium', '$ip', '$countrycode', '$active')";
            $result = mysqli_query($connection, $query);
            if ($result) {
                $smsg = "Votre compte à bien été créé.";
            } else {
                $fmsg ="Une erreur s'est produite, ré-essayer plus tard.";
            }
        }
    ?>

答案 2 :(得分:0)

这条线缺少了;最后:

 $active = "1"

如果不是这样,请查看Apache / http服务器日志中的错误。