Регистрация PHP / MySQL - я новичок - PullRequest
1 голос
/ 13 августа 2011

Хорошо, как я уже сказал, у меня нет никакого опыта в этом виде кода. Я просто знаю очень, очень основы PHP и небольшое впечатление о том, как работает MySQL.

Итак, это код, который я использую (пароль заблокирован звездочками)

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>P.S.</title>
<link type="text/css" rel="stylesheet" href="http://www.ps.niu-niu.org/ps.css" /> 
</head>
<body>
 <div id="main">
HERE'S THE MAIN PART!
<?php 

 mysql_connect("localhost, "niuniu_ps", "**********") or die(mysql_error()); 

 mysql_select_db("niuniu_ps") or die(mysql_error()); 


 if (isset($_POST['submit'])) { 



 if (!$_POST['username'] | !$_POST['pass'] | !$_POST['pass2'] ) {

        die('You did not complete all of the required fields');

    }





    if (!get_magic_quotes_gpc()) {

        $_POST['username'] = addslashes($_POST['username']);

    }

 $usercheck = $_POST['username'];

 $check = mysql_query("SELECT username FROM users WHERE username = '$usercheck'") 

or die(mysql_error());

 $check2 = mysql_num_rows($check);





 if ($check2 != 0) {

        die('Sorry, the username '.$_POST['username'].' is already in use.');

                }




    if ($_POST['pass'] != $_POST['pass2']) {

        die('Your passwords did not match. ');

    }





    $_POST['pass'] = md5($_POST['pass']);

    if (!get_magic_quotes_gpc()) {

        $_POST['pass'] = addslashes($_POST['pass']);

        $_POST['username'] = addslashes($_POST['username']);

            }





    $insert = "INSERT INTO users (username, password)

            VALUES ('".$_POST['username']."', '".$_POST['pass']."')";

    $add_member = mysql_query($insert);

    ?>




 <h1>Registered</h1>

 <p>Thank you, you have registered - you may now login</a>.</p>

 <?php 
 } 

 else 
 {  
 ?>



 <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

 <table border="0">

 <tr><td>Username:</td><td>

 <input type="text" name="username" maxlength="60">

 </td></tr>

 <tr><td>Password:</td><td>

 <input type="password" name="pass" maxlength="10">

 </td></tr>

 <tr><td>Confirm Password:</td><td>

 <input type="password" name="pass2" maxlength="10">

 </td></tr>

 <tr><th colspan=2><input type="submit" name="submit" 
value="Register"></th></tr> </table>

 </form>


 <?php

 }
 ?>

</div>
<div id="reflection"></div> </body>

Когда я захожу на ps.niu-niu.org/, он отображается как: Ошибка разбора: синтаксическая ошибка, неожиданный T_STRING в /home/niuniu/public_html/ps/index.php в строке 27

Ответы [ 2 ]

3 голосов
/ 13 августа 2011

Похоже, вам не хватает кавычки вокруг localhost в строке подключения ...

 mysql_connect("localhost, "niuniu_ps", "**********") or die(mysql_error()); 

должно быть ...

 mysql_connect("localhost", "niuniu_ps", "**********") or die(mysql_error()); 

Также эта строка ...

if (!$_POST['username'] | !$_POST['pass'] | !$_POST['pass2'] ) {

должно быть ...

if (!$_POST['username'] || !$_POST['pass'] || !$_POST['pass2'] ) {

отдельные каналы являются побитовыми операторами и не дадут ожидаемых результатов.Вероятно, не связано с вашей ошибкой.

1 голос
/ 13 августа 2011

Это не дает конкретного ответа на ваш вопрос «почему это не работает», но решает гораздо более серьезную проблему: вся ваша система - зияющая дыра в безопасности .Извините, но это правда.

  $insert = "INSERT INTO users (username, password)

            VALUES ('".$_POST['username']."', '".$_POST['pass']."')";

  $add_member = mysql_query($insert);

Похоже, вы вставляете пароль в базу данных в виде простого незашифрованного текста.Это очень плохая идея .Если ваша база данных каким-то образом скомпрометирована, то все пароли ваших пользователей находятся здесь и могут быть легко украдены.Большинство пользователей используют один и тот же пароль на многих сайтах, поэтому не только ваш собственный сайт подвергается риску, но также могут быть и учетные данные вашего пользователя на других сайтах.

Кроме того, ваш код широко открыт для SQL-инъекции .Вы ничего не делаете для очистки входных данных при проверке имен пользователей.Для злоумышленника было бы несложно вставить некоторый код в поле имени пользователя вместо имени пользователя и получить все записи вашей базы данных.Если мы установим имя пользователя как ' or '1'='1, то ваш запрос станет следующим:

SELECT username FROM users WHERE username = '' or '1'='1'

Это вернет все имена пользователей, и уязвимость может быть использована в дальнейшем для выявления всех ваших незашифрованных паролей!Не очень безопасный способ обработки данных ваших клиентов, и опасный, потому что все ваши данные могут быть украдены, а затем стерты, без входа в систему.

Дело в том, что многие разработчики - даже те, кто имеетсамообучающийся опыт, не говоря уже о человеке, который раньше почти не использовал PHP - неправильно хранит пароли .И для безопасности вашего приложения, и для ваших пользователей было бы намного безопаснее, если бы вы занялись написанием собственной системы аутентификации и использовали что-то, что хорошо зарекомендовало себя и работает.В PHP-библиотеках для аутентификации пользователей есть сообщение о переполнении стека (не слушайте парня, который говорит, что нужно бросить свой собственный - его собственный пример изобилует уязвимостями, подтверждая мою точку зрения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...