Ich benutze das Cool-Captcha für mein Anmeldeformular. Dies ist der von Captcha generierte Bildcode, den ich in meinen Codes verwende:

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

Jeder kann direkt zur Seite "captcha.php" gehen und das Bild anzeigen. Meine Frage ist also, gibt es überhaupt eine Möglichkeit, den direkten Zugriff oder die direkte Anzeige von Captcha.php im Browser zu deaktivieren? Ich möchte nur, dass die Captcha.php nur zum Anzeigen innerhalb der IMG-Quelle verwendet werden kann, nicht zum direkten Anzeigen durch Browser. Gibt es überhaupt etwas in PHP- oder HTAccess-Datei zu tun?

Vielen Dank

1
user1725155 7 Okt. 2012 im 20:59

5 Antworten

Beste Antwort

Sie können .htaccess natürlich auf die gleiche Weise verwenden, wie Sie das Hotlinking von Bildern verhindern

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

Um den direkten Zugriff auf ein PHP-Skript zu beenden, fügen Sie diese Zeile oben im Skript hinzu

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

So erlauben Sie AJAX-Anforderungen:

if (!defined('BASEPATH') &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest')
exit('No direct acess allowed...');
0
Girish 7 Okt. 2012 im 17:26

Soweit ich weiß, lautet die Antwort NEIN. Zumindest nicht auf sichere Weise. Für den Server gibt es kaum einen Unterschied zwischen einem Browser, der die Seite aufruft, da es sich um das src Ihres <img> -Tags handelt oder nur um jemanden, der die URL in den Browser eingibt.

Ich bin mir auch nicht sicher, welche Art von Problem Sie vermeiden möchten. Was ist das Problem, wenn jemand Ihr Captcha ohne die Seite sieht (wenn er wirklich wollte ...).

Einige Ideen, um es schwieriger zu machen, es nicht in der Form zu sehen:

  • Suchen Sie nach HTTP_REFERER. Beachten Sie, dass einige Virenscanner und Internet-Sicherheitspakete auch den HTTP_REFERER-Header löschen, sodass diese Personen Ihr Captcha nie sehen können.
  • Suchen Sie oben in der Datei captcha.php nach URL-Parametern (erlauben Sie beispielsweise den Zugriff nur, wenn es sich um captcha.php handelt? Secret = 123456789). Auf Ihrer form.php-Seite kennen Sie das Geheimnis, andere Leute nicht (theoretisch). Sie können das Geheimnis im Laufe der Zeit ändern: ($secret = md5($salt . strftime("%Y%m%d%H%M"));) und dann in captcha.php prüfen, ob das Geheimnis entweder das Geheimnis dieser Minute oder das Geheimnis der letzten Minute ist ($now = time(); $_REQUEST["secret"] == strftime("%Y%m%d%H%M", $now) || $_REQUEST["secret"] == strftime("%Y%m%d%H%M", $now - 60)).
  • Generieren Sie bei jeder Anforderung von form.php ein neues zufälliges Geheimnis und überprüfen Sie dies in captcha.php (Sie benötigen memcached (oder ähnliches), um das Geheimnis zu speichern, sobald es generiert wurde, und entfernen Sie es dann, sobald es verwendet wird).
  • Wenn Sie form.php ausführen, setzen Sie $SESSION["captcha_ok"] = 1; und in captcha.php if (!$SESSION["captcha_ok"]) {show_error();} else {$SESSION["captcha_ok"]=0; etc....

Aber noch einmal, keine dieser Methoden wird diejenigen, die wirklich wollen, wirklich daran hindern, Ihr Captcha ohne das Formular anzuzeigen.

0
Claude 8 Okt. 2012 im 12:42

Es gibt keine effektive Möglichkeit, dies zu blockieren, da es Lösungen gibt, um sogar eine URL im Bild zu rendern. In diesem Fall würde selbst dann, wenn Sie sich bemüht haben, das Captcha zu blockieren, ein gerendertes URL-Bild (z. B. Speichern des Puffers xvfb unter Linux) ausreichen, um Captcha dieses Bild mit X-, Y-Koordinaten schneiden zu lassen. Übrigens ... Andere Lösungen wie das Überprüfen von Referer- oder Ajax-Anforderungen können mit Tools wie https://addons.mozilla.org/en-US/firefox/addon/hackbar/

1
Ragen Dazs 10 Okt. 2012 im 15:11
<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");
}


?>
0
shafeeq mk 2 Aug. 2016 im 07:24