为capthca创建一个不可读的PHP页面

时间:2012-10-07 16:59:41

标签: php javascript security .htaccess captcha

我正在使用cool-captcha登记表格。 这是我在代码中使用的Captcha生成的图片代码:

<img src="captcha.php" id="captcha" />

任何人都可以直接转到“captcha.php”页面查看图片。所以我的问题是,无论如何禁止在浏览器中直接访问或直接查看Captcha.php?我只想要Captcha.php只能用于查看img源内部而不是浏览器直接查看。反正有没有在php或htaccess文件中做?

由于

5 个答案:

答案 0 :(得分:1)

没有有效的方法来阻止这种情况,因为有一些解决方案甚至可以在图像中呈现URL。在这种情况下,即使您花费精力来阻止验证码,使用URL的渲染图像(例如在Linux上保存缓冲区xvfb)也足以使用X,Y坐标获取验证码。顺便说一下......使用像https://addons.mozilla.org/en-US/firefox/addon/hackbar/

这样的工具可以绕过诸如验证参考或ajax请求之类的其他解决方案

答案 1 :(得分:1)

您当然可以使用.htaccess与防止图像热链接相同的方式

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$   
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule ^hellothere/captcha\.php$ - [NC,F,L]

答案 2 :(得分:0)

要停止直接访问任何PHP脚本,在脚本顶部添加此行

if (!defined('BASEPATH')) exit('No direct script access allowed');

允许AJAX请求:

if (!defined('BASEPATH') &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest')
exit('No direct acess allowed...');

答案 3 :(得分:0)

据我了解,答案是否定的;至少不是以任何安全的方式。对于服务器,调用该页面的浏览器之间几乎没有任何区别,因为它是src标记的<img>,或者只是有人在浏览器中输入了网址。

我也不确定你要避免什么样的问题。有人看到你的验证码没有它周围的页面有什么问题(如果他们真的想...)。

有些想法让人更难以看到它不在形式中:

  • 检查HTTP_REFERER。请注意,某些病毒扫描程序和Internet安全程序包也会终止HTTP_REFERER标头,因此这些人将无法看到您的验证码。
  • 检查顶部op captcha.php中的某些URL参数(例如,只有当它的captcha.php?secret = 123456789时才允许访问)。在你的form.php页面中你知道秘密,其他人不会(理论上)。你可以随着时间的推移进行秘密更改:($secret = md5($salt . strftime("%Y%m%d%H%M"));),然后检查captcha.php这个秘密是秘密还是最后一分钟的秘密($now = time(); $_REQUEST["secret"] == strftime("%Y%m%d%H%M", $now) || $_REQUEST["secret"] == strftime("%Y%m%d%H%M", $now - 60)
  • 在form.php的每个请求上生成一个新的随机秘密,并在captcha.php中检查(一旦生成秘密,你将需要memcached(或类似的)来存储它,然后一旦它被使用就将它删除)。 / LI>
  • 执行form.php时,设置$SESSION["captcha_ok"] = 1;,并在captcha.php中执行if (!$SESSION["captcha_ok"]) {show_error();} else {$SESSION["captcha_ok"]=0; etc....

但是再一次,这些方法实际上都没有真正阻止那些真正想要的人在没有表格的情况下查看你的验证码。

答案 4 :(得分:0)

<html>
<head>

</head>
<body>
<?php
session_start();
$no=rand(0,567890);
$_SESSION['imgno']=$no;
?>
<img src="load.php?sc=<?php echo $no; ?>" width="300px" height="300px" />
</body>
</html>

<强> load.php

<?php
session_start();
header('Content-Type: image/jpeg');
if(isset($_SESSION['imgno']))
{


    readfile("student1.jpg");
    unset($_SESSION['imgno']);
}
else
{
    readfile("thumbs.gif");
}


?>