我正在为我的注册表单使用酷验证码。这是我在代码中使用的验证码生成的图片代码:
<img src="captcha.php" id="captcha" />
任何人都可以直接进入“captcha.php”页面查看图片。所以我的问题是,无论如何要禁用在浏览器中直接访问或直接查看 Captcha.php 吗?我只希望 Captcha.php 只能用于查看 img 源内部,而不是浏览器直接查看。在 php 或 htaccess 文件中有什么可做的吗?
谢谢
我正在为我的注册表单使用酷验证码。这是我在代码中使用的验证码生成的图片代码:
<img src="captcha.php" id="captcha" />
任何人都可以直接进入“captcha.php”页面查看图片。所以我的问题是,无论如何要禁用在浏览器中直接访问或直接查看 Captcha.php 吗?我只希望 Captcha.php 只能用于查看 img 源内部,而不是浏览器直接查看。在 php 或 htaccess 文件中有什么可做的吗?
谢谢
没有有效的方法来阻止这种情况,因为有解决方案甚至可以在图像中呈现 URL。在这种情况下,即使您努力阻止验证码,使用渲染的 URL 图像(例如在 Linux 上保存缓冲区 xvfb)也足以让验证码使用 X、Y 坐标切割此图像。顺便说一句......另一种解决方案,如验证引用者或ajax请求,可以使用https://addons.mozilla.org/en-US/firefox/addon/hackbar/等工具绕过
您当然可以.htaccess
以与防止图像盗链相同的方式 使用
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule ^hellothere/captcha\.php$ - [NC,F,L]
要停止对任何 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...');
据我了解,答案是否定的;至少不是以任何安全的方式。对于服务器来说,调用页面的浏览器几乎没有任何区别,因为它是src
您的<img>
标签,或者只是有人在浏览器中输入了 url。
我也不确定你想避免什么样的问题。有人在没有页面的情况下看到您的验证码有什么问题(如果他们真的想......)。
一些想法是让它更难看到它不是形式:
$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)
)$SESSION["captcha_ok"] = 1;
和在 captcha.php 中执行if (!$SESSION["captcha_ok"]) {show_error();} else {$SESSION["captcha_ok"]=0; etc....
但是再一次,这些方法实际上都不会真正阻止那些真正想要在没有表单的情况下查看您的验证码的人。
<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");
}
?>