2012-04-01 4 views
1

Мне нужно реализовать для текущего проекта некоторый безопасный вход в php. Я написал что-то с подготовленными заявлениями pdo со старым кодом, имеющим в виду. Мне нужны советы, чтобы реализовать более безопасный, возможно, или проверить, является ли это доказательством для sql-атаки, атак.пытается создать безопасный вход с php

<form action="validate.php" method=post> 
    <table class="loginForm"> 
     <thead></thead> 
     <tbody> 
      <tr> 
      <td>UserName:</td> 
      <td><input name=user_name></td> 
      </tr> 
      <tr> 
      <td>Pass:</td> 
      <td><input type=password name=password></td> 
      </tr> 
      <tr> 
      <td><input class=loginBtn type=submit value='Log me in' name=login></td> 
     </tr> 
     </tbody> 
    </table> 
</form> 

Validate.php

session_start();  
try { 
    $host = 'localhost'; 
    $dbName = 'xxx'; 
    $dbUser = 'xxx'; 
    $dbPass = 'xxx'; 
    # MySQL with PDO_MYSQL 
    $DBH = new PDO("mysql:host=$host;dbname=$dbName", $dbUser, $dbPass); 
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch (PDOException $e) { 
    echo "I'm afraid I can't do that."; 
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); 
} 

$STH = $DBH->prepare("SELECT * FROM `Admins` WHERE `username` = '$user_name' AND password='$password'"); 
$STH->execute(); 

$STH->setFetchMode(PDO::FETCH_ASSOC); 
$affected_rows = $STH->fetchColumn(); 

if($affected_rows == 1) { 
    //add the user to our session variables 
    $_SESSION['username'] = $user_name; 
    header("Location: http://www.mysite.com/administration/index.php"); 
     exit; 
     //print 'allowed'; 
     } 
    else { 
     print 'access is not allowed !!!'; 
    } 

Обновлено: Благодаря принятым ответ сильфона мой запрос кодируется в настоящее время, как этот

$STH = $DBH->prepare('SELECT * FROM Admins 
         WHERE username = :user and password = :pass'); 
$STH->execute(array(':user' => $_POST['user_name'], 
        ':pass' => $_POST['password'])); 

Какой штраф. Теперь я просто хочу быть уверенным в том, что моя аутентификация достаточно хороша, чтобы использовать ее на страницах администратора, подобных этому session_start();

try { 
    $host = 'xx'; 
    $dbName = 'xxxx'; 
    $dbUser = 'xxxxx_first'; 
    $dbPass = 'xxx'; 
    # MySQL with PDO_MYSQL 
    $DBH = new PDO("mysql:host=$host;dbname=$dbName", $dbUser, $dbPass); 
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch (PDOException $e) { 
    echo "I'm afraid I can't do that."; 
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); 
} 

if (empty($_SESSION['username'])) { 
    die('To access pages you have to be loged in. 
    <a href="/administration/login.php">log in</a> '); 

} 
+0

Вы используете https для отправки формы на сервер? – Gordon

+1

возможно это помогает http://stackoverflow.com/questions/549/the-definitive-guide-to-forms-based-website-authentication – bescht

+0

Я думаю, что вы храните пароли в виде обычного текста - вы должны их использовать, скажем, с SHA1. – halfer

ответ

1

Вы можете ввести запрос, как это, чтобы избежать SQL Injection

$STH = $DBH->prepare('SELECT * FROM Admins 
         WHERE username = :user and password = :pass'); 
$STH->execute(array(':user' => $_POST['user_name'], 
        ':pass' => $_POST['password'])); 
+0

- это запрос sql inj. безопасно? – BobRock

+0

@ пользователь313378 есть – safarov

0

Ваш код:

$DBH->prepare("SELECT * FROM `Admins` WHERE `username` = '$user_name' AND password='$password'"); 

Подготовленные заявления (в-и-из-себя) не защищают от SQL-инъекций. Вам нужно связывать параметры. Выезд: http://php.net/manual/en/pdostatement.bindparam.php.

В приведенном выше примере SQL-инъекция вполне возможна. Я не вижу, где вы определяете $user_name или $password, поэтому я не могу точно сказать, безопасно ли это.

Смежные вопросы