2010-05-27 2 views
2

내 웹 페이지에서 사용자는 MySql 데이터베이스로 정보를 보내는 양식을 작성합니다. 전송되는 데이터 입력 중 하나는 사용자가 내가 실제 시간/날짜가 있는지 확인 할 양식을 제출 date('l jS \of F Y h:i:s A'); (필요에 따라 나는 형식을 변경할 수 있습니다)PHP와 MySQL에서 새로운 액션을 허용하려면 30 초를 기다리시겠습니까?

그래서 형식으로 날짜/시간 양식 제출을 허용하거나하지 않으려면 보낸 시간/날짜보다 30 초 이상. 감사!

+0

안녕하세요, 저는 문법을 변경했습니다. 그 질문이 여전히 당신의 요구를 대표하는지 알려주세요. –

+0

ok ok .. – DomingoSL

답변

6

그래서 당신은 뭔가 같은 ...

<form action="wtv.php" method="POST"> 
    <input type="hidden" name="date" value="<?php echo date('l jS \of F Y h:i:s A'); ?>" /> 
    <input type="submit" /> 
</form> 

... 사용자가 클릭 할 때 '일'입력의 값이 30 초 미만 전부터 있는지 확인하려면 '제출'?

Ken Keenan이 제시 한 것과 같은 방식으로이 작업을 수행 할 수 있지만 문제는 클라이언트 입력을 신뢰할 수 없다는 것입니다. jeroen의 대답에 대한 귀하의 의견에서 클라이언트 스크립팅이 신뢰할 수 없다는 인식을 나타내지 만 스크립팅에만 국한되지 않습니다. 어떤 사람도 <form>을 요청한 후 30 초 이상이 양식을 제출할 수 없도록 보안이 실제로 필요한 경우 다른 작업을해야합니다.

문제는 서버가 "날짜"입력을 예상하는 것이 예측 가능하다는 것입니다. <form>을 방문하여 Firebug을 열거 나 HTML 문서를 저장하고 메모장에서 열어 보면 제출할 수 있도록 <input />을 쉽게 업데이트하는 방법을 추측 할 수 있습니다.

대신 토큰을 사용하십시오.

무작위 임의의 고유 한 ID의 종류를 생성하고 세션 또는 데이터베이스에 저장이 ...

$unique = md5(uniqid()).md5(time()); // there are better ways to get a unique random ID 
$_SESSION['tokens'][$unique] = time(); 

그런 다음 토큰 (안 날짜/시간을!) 포함 <form>에. ..

<form action="wtv.php" method="POST"> 
    <input type="hidden" name="token" value="<?php echo htmlentities($unique); ?>" /> 
    <input type="submit" /> 
</form> 

... 제출시 해당 토큰의 시간이 30 초 미만인지 확인하십시오.

<?php 
    // partially borrowed from Ken Keenan's answer... 
    if((time() - $_SESSION['tokens'][$_POST['token']]) > 30) { 
     echo "Time's up!"; 
    } 
?> 
+0

와우는 좋은 대답입니다. 감사! – DomingoSL

2

제출 날짜를 세션 변수에 저장할 수 있습니다 (사용자의 날짜 형식과 상관없이 서버에 time()의 결과 만 저장). 제출시 조치를 취하기 전에 해당 변수가 설정되어 있는지 확인하십시오.

브라우저 사이드에서 제출을 원하지 않으시면 javascript가 필요합니다. (선명도 지나치게 상세)

예 :

<?php 
    session_start(); 

    if (isset($_SESSION['submit_time'])) 
    { 
     if ($_SESSION['submit_time'] >= (time() - 30)) 
     { 
      die(); 
     } 
    } 
    $_SESSION['submit_time'] = time(); 
?> 
+2

클라이언트 측에서 수행 한 모든 작업이 보안에 실패했습니다. 사용자가 해킹 할 수 있습니다. – DomingoSL

+2

세션 변수가 서버 측에 저장되며이를 염려 할 경우 세션을 보호 할 수있는 방법이 있습니다. – jeroen

+0

FAIL ............ – DomingoSL

0

당신은 쉽게 MySQL의 날짜가 unix_time 될 필요하여이 작업을 수행 할 수 있습니다. 그런 다음 mktime()이라는 삽입 문을 사용합니다.

유닉스 시간이 두 번째 카운트이기 때문에 30 초 이내에 완료되었는지 확인하는 것이 가장 쉽습니다. 그래서 숫자 비교, 게시물에서 mktime(), 그리고 두 번째 게시물에서 mktime() 빼기, 결과가> 30 인 경우, 당신이 필요로하는 모든 것을하십시오.

예 : (요청에 따라)

, 테이블에서 날짜/시간 값에 대해 데이터베이스에 항목의 초기 INSERT를 수행하여 사용자가 시도하는 경우에서는 mktime()

의 결과를 사용 다시 게시하고, 게시물이 있는지 (또는 마지막 항목, 무엇이든간에) 확인하고 날짜를 가져옵니다 (이것은 유닉스 시간 형식 예 : '12456771411'로 표시됩니다).

는 30 초 후에 "만료"라는 양식을 작성하고자, 현재 unixtime을 얻을 내가 제대로 이해하면

$time = mktime(); 
if($time - $row['date'] > 30){ 
allow them to post 
} else { 
30 seconds didn't pass.. etc; 
} 
+0

코드 예제를 알려주시겠습니까? – DomingoSL

+0

열 유형을 변경하려면 datetime으로 변경하는 것이 좋습니다. 이렇게하면 비교 함수를 비롯하여 모든 특정 datetime 함수를 사용할 수 있고 특정 텍스트 형식을 출력 할 수 있습니다. 그리고 당신은 획기적인 문제에 빠지지 않습니다. – dnagirl

1

으로 뭔가를 할?

나는 형태로 숨겨진 요소를 만드는 것입니다 :

<input name="current_time" type="hidden" value="<?php echo time(); ?>" 

폼이 제출 될 때 당신은 다음이를 확인할 수 있습니다

<?php 
if((time() - $_POST['current_time']) > 30) { 
    echo "Time's up!"; 
} 
?> 

또한 자바 스크립트를 사용하여 클라이언트에 그것을 할 수 양식 제출을 확인하십시오 -하지만 그것은 클라이언트의 시계가 서버에 비해 대체로 정확하다는 것에 달려 있습니다 ...

+0

당신은 나를 이해하지 못합니다. 나는 사용자가 다시 보내려고하면 양식이 전송되었을 때 내 데이터베이스에 시간과 날짜를 저장하려고합니다. 이전에 저장 한 날짜와 30 초가 더 큰지를 비교하기 위해 새로운 날짜를 비교해야합니다. – DomingoSL

1

datetime의 텍스트 버전 저장을 주장하는 경우, 나는 또한 datetime 버전의 datetime을 저장하는 것이 좋습니다. 그렇다면 비교가 쉽습니다.

자바 스크립트없이 제출은 여전히 ​​일어날 것이다, 그러나 당신의 처리 스크립트가

UPDATE mytable SET wordydatetime='$dayofmonthyearhourminutesecond' 
WHERE realdatetime< DATE_SUB(NOW(), INTERVAL 30 SECONDS) AND record_id=$x; 

같은 UPDATE 쿼리를 사용하는 경우 너무 최근의 경우 업데이트가 실패합니다.

ETA :

그냥 업데이 트보다 할 수있는 더 복잡한 처리를하는 경우, 빠른 SELECT는 양식 처리를 계속할지 여부를 결정하게됩니다 : 당신이 다시 레코드를 얻을 경우

SELECT record_id FROM mytable 
    WHERE record_id=$x 
    AND realdatetime< DATE_SUB(NOW(), INTERVAL 30 SECONDS); 

을 , 양식을 처리하면 안됨을 의미합니다.

관련 문제