2013-07-01 3 views
1

간단한 검색 상자와 입력 버튼이있는 페이지가 있습니다. 2 가지 사용자가 검색을 수행 할 때 발생 :PHP 폼 내에 중첩 된 PHP 폼 CAPTCHA 즉시 실패

  1. 새로운 탭이 열리고 그들이에 을 입력 한대로 구글을 검색한다

  2. 가 검색을 한 곳에 그들이 (단지에 있던 페이지. from)이 새로 고침되고 SQL 쿼리를 트리거 할 확률이 50 %입니다.

병합을 방지하기 위해이 SQL 쿼리에 보안 문자를 넣으려고합니다.

현재 내가 가지고있는 문제는 보안 문자가 즉시 실패한다는 것입니다. 첫 번째 양식이 해고 되었기 때문이라고 가정합니다. 그것은 "잘못된 해결책"을 되돌려 놓았습니다. 그것은 내가 믿을 수있게 해줍니다.

다음은 현재 구조입니다.

<form id="search" method="post" action="" target="" onsubmit="refresh(this);"> 

<input type="text" name="q" size="31" maxlength="255" value="" /> 
<input style="color: #cc423f; font-weight:bold; padding: 7px 15px;" name="search" type="submit" value="Search" /> 
</form> 
<script type="text/javascript"> 
function refresh(a){ 
// location.reload(true); 
window.open("http://www.google.com/search?q="+a.q.value); 
} 
</script> 

<?php 
if(isset($_POST['q'])){ 
if (mt_rand(0, 1) === 0) { // 50% chance of this event happening 

// BEGIN SolveMedia CAPTCHA form 
echo "<form id=\"solve4points\" method=\"post\" action=\"\" target=\"\" onsubmit=\"refresh(this);\">"; ?> 
<?php echo solvemedia_get_html("XI.WRU97NXJXuJWRfL0FajiudOutJyDC"); //this displays SolveMedia CAPTCHA widget 
echo "<br /><input style=\"color: #cc423f; font-weight:bold; padding: 7px 15px;\" type=\"submit\" name=\"solve4points\" value=\"Get Points!\" /> 
</form>"; 

} // end SolveMedia CAPTCHA form 

else { // 50% chance of this event happening 
echo "<br /><p>Nope, not today!</p>"; 
} 
} 

if(isset($_POST['solve4points'])){ 
echo solvemedia_get_html("XI.WRU97NXJXuJWRfL0FajiudOutJyDC"); 
require_once("/var/www/vhosts/domain.com/httpdocs/wp-content/plugins/solvemedia/solvemedia.php"); 
$privkey="xxxxxxxxxxxxxxxxxxxxxx"; // API keys for CAPTCHA 
$hashkey="xxxxxxxxxxxxxxxxxxxxxx";// API keys for CAPTCHA 

$solvemedia_response = solvemedia_check_answer($privkey, $_SERVER["REMOTE_ADDR"], $_POST["adcopy_challenge"], $_POST["adcopy_response"], $hashkey); 

if (!$solvemedia_response->is_valid) { //if user fails to complete CAPTCHA correctly, do this 
print "Error: ".$solvemedia_response->error; 
} 

else {//if user completed CAPTCHA correctly, do this 
mysql_query...... 

} 
} 
?> 

은 보안상의 이유로, 나는 데이터베이스 연결 및 API 키 정보를 제거했지만, 나는 그 물건이 정확한지 알고있다.

+0

Google 검색 지점이 무엇인지 잘 모르는 사람 –

+0

많은 세부 정보없이 사용자는 웹 사이트에서 웹을 검색 할 수 있습니다. 그렇게함으로써, 그들은 그 비트가 그 문제와 관련이 없기 때문에 내가 버린 SQL 질의를 통해 그들의 계정에서 이벤트 트리거를 가질 확률이 50 %가됩니다. –

답변

1

solvemedia_get_html("XI.WRU97NXJXuJWRfL0FajiudOutJyDC"); 번으로 전화하지 않아도됩니다.

이 메서드는 응답을 확인하기 직전에 호출합니다. solvemedia captcha (나는 Google recaptcha에서 하나를 사용했습니다)를 사용하지 않았지만 사용하지는 않았지만 두 번이나 호출하는 경우 동일한 IP 주소에서 해결할 새 미디어를 요청했기 때문에 마지막 응답이 유효하지 않게되었습니다.