我有一个带有简单搜索框和输入按钮的页面。用户进行搜索时会发生两件事:
打开一个新选项卡,它会在 Google 上搜索他们输入的任何内容。
他们刚刚所在的页面(他们从哪里进行搜索)刷新,并且有 50% 的机会触发 SQL 查询。
为了防止机器人,我想在这个 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 密钥信息,但我知道这些信息是正确的。