我的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));
}
?>
答案 0 :(得分:4)
你做这里至少有一个语法错误:
$active = "1"
行尾没有分号。
但是下次你应该指定:
在紧要关头,您可以通过命令行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将无效。
您的代码还有一个问题:您从用户那里获取两个值,不检查它们,并将它们插入数据库。
假设我用这个密码注册了"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 页面,我愿意打赌所有与数据库接口的其他页面都会更开放(在某些系统上,我可以锁定管理员,并通过“联系我们”页面发送信息查询来获取自己的访问权限。
答案 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服务器日志中的错误。