1

我正在为我的注册表单使用酷验证码。这是我在代码中使用的验证码生成的图片代码:

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

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

谢谢

4

5 回答 5

1

没有有效的方法来阻止这种情况,因为有解决方案甚至可以在图像中呈现 URL。在这种情况下,即使您努力阻止验证码,使用渲染的 URL 图像(例如在 Linux 上保存缓冲区 xvfb)也足以让验证码使用 X、Y 坐标切割此图像。顺便说一句......另一种解决方案,如验证引用者或ajax请求,可以使用https://addons.mozilla.org/en-US/firefox/addon/hackbar/等工具绕过

于 2012-10-07T17:11:54.227 回答
1

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

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$   
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule ^hellothere/captcha\.php$ - [NC,F,L]
于 2012-10-07T17:12:15.223 回答
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...');
于 2012-10-07T17:26:58.837 回答
0

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

我也不确定你想避免什么样的问题。有人在没有页面的情况下看到您的验证码有什么问题(如果他们真的想......)。

一些想法是让它更难看到它不是形式:

  • 检查 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(或类似的)来存储秘密,然后在使用后将其删除)。
  • 执行 form.php 时,设置$SESSION["captcha_ok"] = 1;和在 captcha.php 中执行if (!$SESSION["captcha_ok"]) {show_error();} else {$SESSION["captcha_ok"]=0; etc....

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

于 2012-10-08T12:42:07.840 回答
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>

加载.php

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


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


?>
于 2016-08-02T07:24:35.927 回答