2014-11-21 2 views
0

은 사용자가 웹 사이트를 만들 수있는 PHP 소프트웨어를 구입했습니다. 하지만 내가 돈을 준 사람은 가입 양식을 작성하지 않았습니다. 나는 기본적인 코딩을 할만큼 위험하다. 그러나 나는 이것이 나의 기술 수준을 넘었다 고 느낍니다. 내가 만든 양식은 mysql 데이터베이스에 잘 삽입되었지만 암호 필드가 해시가 아니기 때문에이 양식을 사용하는 새로운 사용자가 로그인 할 수있게되었습니다.암호 필드 해시하는 방법

HMTL 가입 양식 :

<form action="input.php" method="post" class="pcss3f pcss3f-type-hor"> 
      <header>Fillout the below to join.</header> 

      <section class="state-normal"> 
       <label for="">First Name</label> 
       <input type="text" name="first_name"/> 
       <i class="icon-user"></i> 
      </section> 

      <section class="state-normal"> 
       <label for="">Last Name</label> 
       <input type="text" name="last_name"/> 
       <i class="icon-user"></i> 
      </section> 

      <section class="state-normal"> 
       <label for="">Email</label> 
       <input type="email" name="email"/> 
       <i class="icon-envelope"></i> 
      </section> 

      <section class="state-normal"> 
       <label for="">Password</label> 
       <input type="password" name="password"/> 
       <i class="icon-key"></i> 
      </section> 

      <footer> 
       <button type="button" onclick="window.location = 'index.html'">Back</button> 
       <button type="submit" class="color-blue">Submit</button> 
      </footer> 
     </form> 

와 PHP 스크립트 :

<?php 
$con = mysql_connect("localhost","name","password"); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db("instantw_builder", $con); 


$sql="INSERT INTO users (first_name, last_name, username, email, password) 
VALUES 
('$_POST[first_name]','$_POST[last_name]','$_POST[email]','$_POST[email]','$_POST[password]')"; 

if (!mysql_query($sql,$con)) 
    { 
    die('Error: ' . mysql_error()); 
    } 
echo "1 record added"; 

mysql_close($con) 
?> 

내가 암호 필드를 해시 어떻게해야합니까?

+0

** 위험 ** : [오래된 ** 데이터베이스 API] (http://stackoverflow.com/q/12859942/19068)를 사용하고 있으며 [modern 대체] (http://php.net/manual/en/mysqlinfo.api.choosing.php). 또한 ** [SQL 주입 공격] (http://bobby-tables.com/) **에 현대적인 API를 사용하면 쉽게 방어 할 수 있습니다 ** (http://stackoverflow.com/questions/60174/best-way-to-prevent-sql-injection-in-php)을 사용하십시오. – Quentin

+0

PHP 설명서에는 [예제] (http://php.net/manual/en/)뿐만 아니라 [FAQ] (http://php.net/manual/en/faq.passwords.php)도 있습니다. function.password-hash.php). – Quentin

+0

http://daveismyname.com/login-and-registration-system-with-php-bp에는 필요한 모든 것이 있습니다. * 또한, 준비된 명령문과'password_hash()'와 함께 PDO를 사용합니다. –

답변

-1

당신은 MySQL의 쿼리에 암호를 해시하는 sha1 기능을 사용한다 : 다른 사람보다

$sql="INSERT INTO users (first_name, last_name, username, email, password) 
VALUES 
('$_POST[first_name]','$_POST[last_name]','$_POST[email]','$_POST[email]',SHA1('$_POST[password]'))"; 
+1

아니요, 그러지 마세요. SHA1은 MD5보다 좋지만 암호가 충분하지 않습니다. 당신은 또한 소금을 넣지 못하고 있습니다. 이 내용은 [PHP FAQ] (http://php.net/manual/en/faq.passwords.php#faq.passwords.fasthash)에서 다룹니다. – Quentin

+0

오케이, 나는 이것이 ion_auth와 그 bcrypt로 만들어 졌다는 것을 알아 냈습니다. – urdave

+0

'password_hash()'만 사용해야합니다. @Jerodev – xXAlphaManXx

-1

암호를 해시 수있는 여러 가지 방법이 있습니다, 몇 가지 더. PHP에 내장 된 SHA1 해시 함수를 사용하는 것이 좋습니다.

$hash_password = sha1($_POST[password]); 

그런 다음이 암호를 데이터베이스에 저장하려고합니다.

사용자가 로그인하면 입력 한 암호를 해시하고 두 해시가 일치하는지 확인해야합니다.

추가 보안을 위해 예약 해싱의 성공을 제한하기 위해 모든 암호 끝에 문자열 (사용자에게만 알려짐)을 추가하는 것이 좋습니다.

SQL 인젝션으로 알려진 데이터베이스 공격과 관련하여이 양식에 다른 문제가 있습니다. 여기에서 내용을 읽어보십시오. http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php

+1

[PHP 매뉴얼은 ** SHA1을 사용하여 **에 대해 추천합니다.] (http://php.net/manual/en/faq.passwords.php#faq.passwords.fasthash). – Quentin

+0

*** 항상'password_hash()'를 사용하십시오 *** – xXAlphaManXx