2016-07-17 3 views
1

이 양식 및 프로세스 페이지가 있습니다.
양식 페이지에서 ID가 문제는 아니지만 행 reg_time에서 실행될 때 "숨김"으로 설정된 두 개의 숨겨진 입력 ID 및 reg_time 값이 있습니다 0000-00-00 00:00:00 timestamp set 테이블 사용자. 제안 사항은 무엇입니까?제출할 때 데이터베이스에 타임 스탬프를 삽입 할 수 없습니다.

function post($POST) 
{ 
    $POST = array_map('trim', $_POST); 
    $hash = "$2y$10$"; 
    $salt = "nekiludistringzahash22"; 
    $his = $hash . $salt; 
    $POST['pass'] = crypt($_POST['pass'],$his); 
    return $POST; 
} 

$sql = "insert into users values(:" . implode(",:", array_keys(post($_POST))) . ");"; 




try{ 
    $db = new PDO('mysql:host=localhost;charset=utf8;dbname=dbname','root',''); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

}catch (PDOException $e) 

{ 

    die("Conn problem " . $e->getMessage()); 
} 

$reg = $db->prepare($sql); 
$reg->execute(post($_POST)); 

및 형태

<form action="exp2.php" method="post"> 
<input type="hidden" name="id" value="null"> 

<input type="text"name="uname"> 
<input type="text"name="pass"> 
<input type="text"name="name"> 
<input type="text"name="lname"> 
<input type="submit"> 

<input type="hidden" name="reg_time" value = "null"> 
</form> 
+0

잘 삽입 NULL은 그래서 당신은 무엇을 기대 했는가? –

+0

왜 이드는 괜찮습니까? – Xigo

+0

현재 날짜 사용을 원한다면'

답변

3

귀하의 문제는 매우 일반적이다.

많은 수강생은 NULL 값을 "NULL"이라는 4 개의 문자로 구성된 문자열에서 알 수 없습니다. 후자는 전혀 특별한 의미가 없습니다.

또한 나쁜 소식이 있습니다. HTTP 프로토콜은 텍스트 기반입니다. 하나는 HTTP 메소드를 사용하여 문자열을 보낼 수 없기 때문에 HTTP POST를 통해 NULL 값을 보낼 수 없습니다.

function post($POST) 
{ 
    $POST = array_map('trim', $_POST); 
    $hash = "$2y$10$"; 
    $salt = "nekiludistringzahash22"; 
    $his = $hash . $salt; 
    $POST['pass'] = crypt($_POST['pass'],$his); 
    $POST['reg_time'] = NULL; 
    $POST['id'] = NULL; 
    return $POST; 
} 

그러나, 그것은 당신의 코드를 사용하여 주요 문제가되지 않습니다 :

당신은 당신이 암호를하고있는 것처럼, 서버 측에서 당신의 널 (null)을 추가해야합니다,이 코드가 작동을합니다. 최악의 뉴스는 올바른 바인딩이 있음에도 불구하고 코드가 severely vulnerable to sql injection입니다.

, 그것은 안전하게 함수가 허용 필드 목록 을 받아 확인하고없는 사람에 NULL 값을 지정하려면 다음과 같이

function post($allowed) 
{ 
    $post = array(); 
    foreach ($allowed as $key) 
    { 
     if (isset($_POST[$key])) $post[$key] = trim($_POST[$key]); 
     else $_POST[$key] = NULL; 
    } 
    $hash = "$2y$10$"; 
    $salt = "nekiludistringzahash22"; 
    $his = $hash . $salt; 
    $POST['pass'] = crypt($_POST['pass'],$his); 
} 

그리고 다음을 호출

$post = post(array('id','uname','pass','name','lname','reg_time')); 
$sql = "insert into users values(:" . implode(",:", array_keys($post)).");"; 
$reg = $db->prepare($sql); 
$reg->execute($post); 

이렇게하면 모든 필드 이름이 필터링됩니다.

보너스로, 당신은 당신의 제출 버튼에 사용자 정의 값을 할당 할 수 있습니다)

+0

당신을 진심으로 환영합니다. 그냥 마음 편하게 물어봐. –

관련 문제