use*_*075 5 javascript php ajax messagebox recaptcha
这是我第一次询问Stack Overflow(但是,不是我第一次在其他人的问题上使用好的回答).我是一名经验丰富的网站程序员,所以请放心,我总是会在凌晨时分尝试解决缺乏适当指导的问题.这就是Stack Overflow真正得心应手的时候.但是,这一次,我已经在PHP墙上撞了三四天了.所以我要求就此事提供一些帮助.
现在,编程纯粹是数学,实质上.这就是为什么人们最终能够理解它的语言以及正在发生的事情.我已经达到了成为一名非常有经验的AS程序员的意义,然后我决定从Flash切换,尝试使用JS和jQuery(竞争,可以这么说)尝试HTML,并坠入爱河.不过,我还是那个领域的业余爱好者.但我与PHP的关系特别完全不同:我不理解它并且没有耐心; 这对我来说是梵文.也许我还没有用它来掌握它,但似乎对我来说没有逻辑意义,如JS和HTML以及AS和ETC.做.
无论如何,我的困境:
我根据这里给出的优秀代码构建了一个自定义的Shoutbox:http://yensdesign.com/2009/01/create-a-shoutbox-using-php-and-ajax-jquery/.但是,代码不包含验证码,这使得它完全容易受到垃圾邮件的攻击.所以我首先设计了一个简单的验证码,它由包含数字的各种图像组成,所有图像都加起来一个特定的数字.现在我想尝试一下,我一直试图添加谷歌reCaptcha.
ReCaptcha是基于PHP的.Sbox确实使用PHP但是一旦JS文件执行了表单检查的东西; 它使用PHP最终保存在mySql数据库中输入的数据,并检索以前保存的数据以进行显示.我已经尝试将reCaptcha PHP代码放在这个过程的这一部分,但它并没有真正起作用,因为它只是阻止输入数据并阻止它被检索.我需要的是一开始就停止这个过程的东西,比如说:"嘿!你进了错误的Captcha,你是Spam-bot,你!"
我也尝试将PHP放在JS文件中...最后,在拉了大量头发之后,又发现了一句话:"JS是基于客户端的; PHP是基于服务器的." 我几天前可以得到的好消息.业余我,现在我明白PHP为何如此挑剔.
无论如何,我已经尝试过上下放置PHP并且已经得到零,没有,零.
我希望我已经在这个问题上给出了足够的背景知识.对我的第一个Stack Overflow问题的反馈将很有帮助.并且特别有帮助:任何有关破解这个谜团的帮助你都可以折腾我的方式.
reCaptcha PHP代码如下:
<?php
$privatekey = "your_private_key";
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
// What happens when the CAPTCHA was entered incorrectly
die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
"(reCAPTCHA said: " . $resp->error . ")");
} else {
// Your code here to handle a successful verification
}
?>
Run Code Online (Sandbox Code Playgroud)
除了样式之外,还有关于reCaptcha的内容.看起来很简单!
我认为Shoutbox代码太多太长而无法包含在这里并使帖子饱和.但他们在上面给出了联系.它们基本上是HTML Shoutbox,它的JS文件和PHP信息保存和检索.
此外,有关进一步的参考,我在附加链接到包含我的在线留言板工作RAR文件,如,对于这一点.正如您将看到的,在页面底部有一个预加载器.它应该在显示先前消息列表时关闭.它不起作用,因为我笨拙地将PHP放在JS文件中 - 这无疑会返回并且错误会阻止JS序列.如果您评论 PHP或删除它,那么序列应该完成并且至少应该出现"找不到db ... bla bla"消息,因为预加载器消失了,这意味着Shoutbox功能正常(但没有验证码) .
和RAR文件,voilà:( 不再可用)
在此之前,非常感谢您的耐心和任何帮助,您可以发送我的方式!
编辑1:
好的,按照J. Bruni关于下面详细说明的练习的说明进行更新.
因此,遵循J. Bruni的建议,假设我已经正确地理解了它们,我只拿出了它iframe.我把剩下的reCaptcha完好无损,因为它对于这个练习是多余的(此外,我需要Captcha图像来测试这个东西是否真的有效).在form最初,没有设置张贴到特定的输出文件,你可以看到(原因是它具有的JS文件),但是,正如J.布吕尼的推荐的运动去,我已经将它设置为action="shoutbox.php".这意味着它现在完全绕过JS文件.
测试:我得到了错误的单词和正确的消息.J.Bruni相应地编写了原始的reCaptcha PHP代码,所以现在一切都很完美,至少与reCaptcha相关.
但是,正如我所说,JS文件完全被绕过了.我做过的最初的深夜测试之一,我尝试了类似于J. Bruni提出的建议.我试图通过PHP文件顶部的reCaptcha代码返回一个true/false语句,因此它可以被调节,并且函数返回的true/false检查所有字段都被填充(客户端,在JS中)文件),为了继续,如果全部为真或返回错误消息,如果有任何错误.我在那里遇到的问题,正如你可能猜到的那样,但我后来才明白,一个检查是在客户端完成的,另一个是在服务器端完成的; 你怎么能把他们两个结合起来?(如果你可以.)我的问题是:有没有办法同时运行PHP和JS'并行',然后汇总各自的结果?听起来已经不可能了; 作为一个客户端,它听起来很直接,而另一个,服务器端,听起来很遥远.
此外,也许更敏锐的程序员会说:为什么要单独处理这两项检查?似乎非常混乱和不必要; 他们都可以用PHP.唉! 问题是,虽然我知道如何将表单的输入文本变量直接发布到PHP文件,但我不知道如何将其余部分转换为PHP!甚至不知道它是否可以被翻译.真的,如果我有我的选择,我宁愿找到一种方法来制作JS.但那就是J. Bruni明智地指出的:
您需要一些服务器端代码,因为您无法向公众显示您的私钥......如果一切都在客户端完成,并且没有任何服务器端,技术用户将很容易绕过整个验证.
因此,在我上面解释的第一个深夜练习导致惨败之后,我尝试将其余的shoutbox.php代码调整为reCaptcha函数,返回true.如果它返回false,PHP代码将停在那里.但是,这意味着在提交新表单之前,Shoutbox中不会显示任何先前的消息; 而且,即使这样,这也将取决于有效提交的表格(意味着正确输入了reCaptcha).如果表单返回false,则不会发生任何事情,保存页面的重新加载 - 我们可以同意,由于许多原因,这是不切实际的.另一方面,分离PHP代码的两个部分,使一个独立于reCaptcha条件的运行和另一个条件的运行,并没有真正有太大的区别.
就在那时我尝试将reCaptcha PHP检查插入到JS文件中,这在我看来是唯一的出路.我们都知道结局如何!它让我在这里,你的怜悯.并且,正如J. Bruni明智地指出的那样,我没有谈到的事情,让我的私人身份证客户端向世界提供无保护的信息.
因此,在J. Bruni提出的练习之后,我现在认为reCaptcha本身就可以正常工作.如果表单直接发布到PHP文件,并且JS文件中负责收集表单值并检查它们是否正确的部分转录到PHP文件中,那么我猜Sbox可能会在基本水平.但是,现在,没有reCaptcha,Sbox正在100%工作,所有的想象和诸如此类的东西.必须有一种方法来插入那个darned reCaptcha并仍然使Sbox工作一流.现在我必须弄清楚如何制作一种"绕行",让JS文件也能发挥其魔力,而PHP则可以完成它的工作.虽然,说实话,我不确定哪个更实用:首先检查表格是否填写并返回错误,如果他们甚至在检查reCaptcha是否已正确输入之前,或者反过来.人们可以总是把它们打在一起,正如我在第一个例子中所做的那样,我在上面告诉你的深夜审判; 但是,当然,单独检查它们会更加有趣,所以你可以告诉你的用户他到底搞砸了什么.我所知道的是,在第一个实例停止发送表单,在表单或reCaptcha中发现错误或不正确的输入,而不是让数据一直到数据库时,听起来更实际在检查其有效性之前的门.也许这是一个没有实际意义的点,考虑到这一切都是在几分之一秒内完成的,但它听起来很混乱.你怎么看?
无论如何,我会在接下来的几天内尝试解决这个问题,让你知道我是怎么做的.尽管如此,如果有人的灯泡在此期间闪烁,请成为我的客人,争先恐后地向我展示这条隧道尽头的另一种可能性.
注意:顺便说一下,我已经意识到(至少在直接发布到PHP时)reCaptcha需要和额外的脚本,每次页面被提取时都需要刷新,而不是刷新,比如按下打印结果后返回.否则,验证码图像保持不变,但显然,reCaptcha认为它显示出另一个挑战; 如果您尝试使用相同的图像回答相同的reCaptcha,您可能已经知道它是正确的,它将返回错误的结果.这对我来说意味着挑战总是自动重新加载,但由于某种原因,图像在这种特定情况下不变.只是一个抬头.
编辑2
好吧,正如J. Bruni注意到的那样,我们都忽略了一个"!" 在ifPHP文件的语句中.这已经得到纠正.
然而......是的,然而又出现了另一个问题.
嗯.该if声明已得到纠正,现在它确实返回了"错误的验证码"警报.但出于某种原因,reCapthca 总是回归"错误",无论如何.昨天,表格总是打印,即使没有插入验证码或插入错误的验证码,因为if正如布鲁尼所说,声明被设置为返回肯定的验钞码输入错误,在这种情况下,表格将继续如果验证码错误则打印(但如果它是正确的则不打印).这总是错的,这就是它一直打印的原因.if当验证码正确时,将语句更正为返回正数表明验证码始终返回错误的答案,因为现在您总是得到"错误的验证码"警报.所以这个具体问题必须在其他地方.
现在,正如我在各种场合所说的那样,我和PHP一样好.所以我不能说if/elsePHP中的语句是否正确.但是,如果我的其他经验对我有用,那看起来好像ifJS文件中的语句可能缺少使其警报并停止其余complete: function(data)功能的东西,因为在我看来,该complete: function(data)功能的其余部分始终在播放.在任何情况下,我都不会alert()因为if声明而放在括号内.也许,即使if声明是错误的,仍然alert()正在播放函数的其余部分,因为它需要括号......但是因为这部分是AJAX,我可能会说胡言乱语并咆哮错误的树.如果我错了,请纠正我.
我会尝试解决它并回发问题隐藏的地方.当我获得100%正常运行的Sbox时,我会在这里发布最终产品,以便所有可能遇到相同或类似问题的人都可以使用它.
编辑3
我的直觉是正确的if,因为complete: function(data)函数中的语句需要在括号内; 否则,无论PHP reCaptcha检查是否返回'错误',都会出现'错误的验证码'警告.
complete: function(data){
if (data.responseText == 'wrong') {
alert('Wrong captcha');
}
messageList.html(data.responseText);
updateShoutbox();
...
PS无法在此页面上正确显示代码...我正在尝试遵循右侧的格式指南,但无济于事.
PPS ReCaptcha仍然总是'错'.有一些时会更新进度.
有一次我尝试使用 AJAX 加载 reCaptcha。它不起作用。我没有太努力,因为我根本无法使用 AJAX,而这就是我所做的。无法通过 AJAX 运行的相同代码可以直接以简单的形式运行。
另外,正如您所说,reCaptcha不是基于 PHP 的。您可以使用任何服务器端语言(包括 PHP)。
我已经查看了你的index.php文件。在自定义外观之前,让我们尝试做一些基础工作。我见过iframe和script标签的混合。您所需要的就这么简单(假设您的公钥是以“6Ld_b8”开头的字符串:
<input type="text" id="recaptcha_response_field" name="recaptcha_response_field" />
<script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=6Ld_b84SAAAAAAv1Ds1vYHxQjyoowiCPkARtvB2W"></script>
Run Code Online (Sandbox Code Playgroud)
删除 iframe。目前,您可以删除任何其他与验证码相关的内容。
所以,你有一个form将被发布到shoutbox.php。然后,暂时将您粘贴到问题中的代码添加到此文件的开头。您需要包含recaptchalib.php,并且需要用“your_private_key”替换您的 reCaptcha 私钥。所以,代码将如下所示:
// put this on top of shoutbox.php
include "recaptchalib.php";
$privatekey = "your_private_key"; // change this here to your reCaptcha private key!
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
echo '<b>WRONG WORDS!</b>';
} else {
echo '<b>CORRECT WORDS! GREAT!</b>';
}
exit();
Run Code Online (Sandbox Code Playgroud)
现在,您可能想尝试一下,看看会发生什么,然后告诉我们。
编辑1
您只需在shoutbox.php内的正确位置添加reCaptcha 验证即可。看起来它可以在“case insert”部分,或者在“insertMessage”函数内部:
case "insert":
include "recaptchalib.php";
$privatekey = "your_private_key"; // change this here to your reCaptcha private key!
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if ($resp->is_valid)
echo insertMessage($_POST['nick'], $_POST['message']);
break;
Run Code Online (Sandbox Code Playgroud)
你看到过complete: function(data){JavaScript 代码中的这些行吗?它是函数调用选项之一$.ajax。它指定 PHP 代码运行后将运行的函数,并将其响应发送回浏览器。来自服务器的响应将位于data参数中的某个位置供您使用。如果您想在验证码出现“错误单词”时向用户显示一条消息,警告他,您需要:
从服务器端返回一些内容(PHP 代码):
if ($resp->is_valid)
echo insertMessage($_POST['nick'], $_POST['message']);
else
echo 'wrong';
Run Code Online (Sandbox Code Playgroud)在客户端使用这个返回(JS代码):
$.ajax({
type: "POST", url: "shoutbox.php", data: "action=insert&nick=" + nick + "&message=" + message,
complete: function(data){
if (data.responseText == 'wrong')
alert('Incorrect captcha words! Try again.');
messageList.html(data.responseText);
updateShoutbox();
//reactivate the send button
$("#send").attr({ disabled:false, value:"Shout it!" });
}
});
Run Code Online (Sandbox Code Playgroud)是的,您需要重新加载 reCaptcha(对于“后退”按钮以及提交的情况 - 成功或失败)。对于后退按钮,您可以使用 PHP 或 HTML“元”标记设置“过期”HTTP 标头,强制页面重新加载。对于另一种情况(在 ajax 表单提交后),您可以通过使用 JavaScript/jQuery 替换 HTML 来请求新的挑战。将挑战包含在 div 中:
<div id="challenge">
<input type="text" id="recaptcha_response_field" name="recaptcha_response_field" />
<script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=6Ld_b84SAAAAAAv1Ds1vYHxQjyoowiCPkARtvB2W"></script>
</div>
Run Code Online (Sandbox Code Playgroud)
并在必要时“重新加载”它:
function reloadCaptcha(){
$('#challenge').html('<input type="text" id="recaptcha_response_field" name="recaptcha_response_field" /><script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=6Ld_b84SAAAAAAv1Ds1vYHxQjyoowiCPkARtvB2W"></script>');
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
753 次 |
| 最近记录: |