Autor Beitrag
delnu
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 05.02.17 00:18 
Ich möchte mit php prüfen, ob von mir in meiner Website erwähnte Links gültig sind oder woanders hin weiterleiten.

Zwar kann ich mit $handle=@fopen($site,"r"); prüfen, ob die mit dem Parameter $site zu ermittelnde Website aufgerufen werden kann. Aber abgesehen davon, daß dieser Prüfaufruf viel zu lange dauert, wird dadurch nur ermittelt, ob der Link überhaupt zu einem (beliebigen) Ergebnis oder ins Leere führt.

Was ich möchte, ist aber auch die Prüfung, ob das Ergebnis nicht zu einer beliebig weitergeleiteten Website führt, sondern tatsächlich der gewünschten Website entspricht oder zumindest die Basisadresse übereinstimmt.

Beispiel:
Gesucht wird ganz-tolle-website.de/gratis

Wird nun wenigstens ganz-tolle-website.de gefunden, ist alles o.k., aber wenn der Link zu sinnloser-werbemist.de weiterleitet, möchte ich den entsprechenden Link abblocken, bevor er aufgerufen werden kann und statt dessen eine andere Aktion (die bereits feststeht) ausführen lassen.

Kennt jemand eine Möglichkeit, per php zu prüfen, ob aufzurufender Link und Ziel weitgehend inhaltsgleich sind?
Entscheidend ist dabei, daß der Aufruf nicht identischer Inhalte abgefagen werden kann.

Bitte keine Vorschläge mit Javascript, weil die Prüfung wirklich bereits serverseitig erfolgen soll.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10136
Erhaltene Danke: 1233

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 05.02.17 00:33 
Moin!

user profile icondelnu hat folgendes geschrieben Zum zitierten Posting springen:
Beispiel:
Gesucht wird ganz-tolle-website.de/gratis

Wird nun wenigstens ganz-tolle-website.de gefunden, ist alles o.k.,
Hm, ich würde ja einfach strpos() vorschlagen, oder für etwas flexiblere Sachen auch preg_match(), aber das klingt für mich so simpel, dass du das nicht gemeint haben kannst, oder? :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
delnu
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 05.02.17 01:30 
Danke erstmal für die Antwort.

Aber das ist tatsächlich nicht das Problem, denn es geht ja erstmal darum, überhaupt festzustellen, was denn nach der Abfrage einer URL zurückgeliefert wird. Erst wenn ich also beide Werte habe, einmal den gewünschten und einmal den zurückgelieferten, könnte ich mit strpos arbeiten.

Vielleicht habe ich bei der Fragestellung falsch angesetzt, denn die Identitätsprüfung durch Vergleich zweier Strings ist ja nicht schwierig, sondern den Rückgabewert zu erhalten, bevor die Seite dann wirklich sichtbar aufgerufen wird, bzw. solchen Aufruf zu verhindern.

Mir wäre ja schon geholfen, wenn die URL in einem unsichtbaren Fenster aufgerufen werden könnte, dann die wirkliche Adresse ausgelesen und an eine Variable weitergeleitet würde und dann das unsichtbare Fenster wieder automatisch geschlossen wird, vielleicht auch mit einem festlegbaren timeout.

Eigentlich hatte ich auf eine fertige (mir lediglich unbekannte) php-Funktion gehofft.

Es eilt nicht. Falls jemand auch vielleicht erst nach Monaten eine Idee hat - immer her damit.
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 874
Erhaltene Danke: 148

Win7
VS 2013, VS2015
BeitragVerfasst: So 05.02.17 02:04 
Ich verstehe immer noch nicht ganz.

Wenn du prüfen möchstest, ob ein Link zu google geht, dann gucke ob "google.de" in dem Link vor kommt.

Falls du auch 3xx Redirects berücksichtigen möchtest, aso quasi die URL der letzten Seite, falls weitergeleitet wird: Das geht nur indem du per Request "nachfragst".
delnu
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 05.02.17 03:22 
Mittlerweile habe ich einen Lösungsansatz gefunden, der zumindest das Grundproblem TEILWEISE löst und zugleich anhand des Beispiels erklärt, worum es geht.

Auf www.datenreise.de/ph...nd-existenz-pruefen/ habe ich einen Code gefunden, der prüft, ob eine URL existiert. Aber wie ich schon eingangs schrieb, möchte ich wissen, ob der Link auch der gewünschten Website entspricht oder umgelenkt wird.

Ich habe ein wenig mit dem Quelltext experimentiert und habe eine Möglichkeit der Prüfung gefunden, indem ich eine globable Hilfsvariable benutze und ihr innerhalb des Funktionsaufrufs das Ergebnis übergebe.

Wer sich den Quelltext ansieht bzw. ausprobiert, wird erkennen, worum es grundsätzlich geht.

Auf freeavailabledomains.com/en/ lassen sich eigene Domains zuweisen. Wenn eine Domain THEORETISCH vorhanden ist, bedeutet das aber nicht, daß sie auch dauerhaft existiert. Statt also z.B. tatsächlich auf
testlink.usa.cc zu landen, wird z.B. auf freeavailabledomains.com/blocked/ umgeleitet.

Das Beispiel ist unfertig. Erkennungsfehler sind nicht ausgeschlossen und die Feinheiten fehlen noch. Aber nun dürfte immerhin klar sein, was ich bezwecke.

Es liegt nicht an mir, daß ich den Quelltext nicht als PHP, sondern nur als ZIP hochladen kann. Meiner Ansicht nach bietet ein offen lesbarer PHP-Quelltext einen besseren Einblick, als wenn man erst eine (vielleicht gefährliche) ZIP-Datei entpacken muß.

Darum nochmal alles auch DIREKT eingebunden:

ausblenden volle Höhe PHP-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
<?php

$wantit = "http://testlink.usa.cc";
$gotten = "";

// erweitert aus "https://www.datenreise.de/php-url-korrekte-syntax-und-existenz-pruefen/"
function urlValidate($url)
{
  global $gotten;
    $url = trim($url);
    if(preg_match('%^(?:(?:https?)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu'$url))
    {
        if(ini_get('allow_url_fopen'))
        {
            $headers = @get_headers($url1);
            if (preg_match('/^HTTP\/.*\s+(200|401)/'$headers[0]))
            {
        $gotten = $url;
                return true;
            }
            elseif (preg_match('/^HTTP\/.*\s+(300|301|302|303|307|308)/'$headers[0]))
            {
                if ($headers !== false && isset($headers['Location']))
                {
                    if($headers['Location'] != $url)
                    {
                        return urlValidate($headers['Location']);
                    }
                    else  // Never ending story
                    {
            $gotten = $url;            
                        return false;
                    }
                }
                else
                {
          $gotten = $url;
                    return false;
                }
            }
            else
      {
        $gotten = $url;
                return false;
            }
        }
        elseif (function_exists('curl_version'))
        {
            $user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0) Gecko/20121026 Firefox/16.0";
            $ch = @curl_init($url);
            @curl_setopt($ch, CURLOPT_HEADER, 1);
            @curl_setopt($ch, CURLOPT_NOBODY, 1);
            @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
            @curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            @curl_setopt($ch, CURLOPT_HEADER, 1);
            @curl_setopt($ch, CURLOPT_TIMEOUT, 5);
            @curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
            @curl_exec($ch);
            $http_statuscode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            if(preg_match('/^200|301|302$/'$http_statuscode))
            {
        $gotten = $url;
                return true;
            }
        }
        else
        {
            throw new Exception('curl and allow_url_fopen are not avaiable.');
        }
    }
    return false;
}

urlValidate($wantit);

//echo $wantit.'<br>'.$gotten.'<br>';
if ($wantit == $gotten)
{
$handle=@fopen($gotten,"r");

if ($handle)
{
    echo "Die URL <span style='color:blue;'><b> ".$wantit."</b></span> existiert";
  fclose($handle);
}
else
{
    echo "Die URL <span style='color:red;'><b> ".$wantit."</b></span> existiert nicht.";
};
}
else
{
    echo "Die URL <span style='color:red;'><b> ".$wantit."</b></span> existiert nicht, sondern wird auf <span style='color:red;'><b> ".$gotten."</b></span> umgeleitet.";
}


?>


Moderiert von user profile iconNarses: B- durch PHP-Tags ersetzt
Einloggen, um Attachments anzusehen!
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 874
Erhaltene Danke: 148

Win7
VS 2013, VS2015
BeitragVerfasst: So 05.02.17 14:34 
Klar, du kannst einen 302 Redirect werten als "Domain gibt's nicht". Wenn du testlink.usa.cc aufrufst, bekommst du ja:

Zitat:
HTTP/1.1 302 FOUND
Server: nginx/1.4.6 (Ubuntu)
Date: Sun, 05 Feb 2017 12:27:43 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Language
Location: freeavailabledomains.com/blocked/
Content-Language: en


Andererseits bekommst du bei einem GET auf "http://entwickler-ecke.de" auch folgendes:
Zitat:
HTTP/1.1 301 Moved Permanently
Date: Sun, 05 Feb 2017 12:32:50 GMT
Server: Apache/2
Location: www.entwickler-ecke.de/
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 233
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1


Würde nach deiner Logik also auch nicht existieren ;-)
delnu
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 05.02.17 17:42 
Danke an Narses für das Ersetzen des Quelltextes durch den passenden BBCode. Leider kenne ich mich bei dieser Forensoftware damit nicht aus.

@jfheins:
Danke für den Hinweis. Bisher hatte ich schon gemerkt, daß es auch Probleme geben kann, wenn HTTP auf HTTPS weitergeleitet wird. Was "meine" Logik betrifft: Ich hatte den Lösungsansatz deshalb als Quelltext reingestellt, um alle Mißverständnisse über meine Absicht auszuräumen.

Mir ist völlig klar, daß es sich nicht um die Lösung des Problems handelt. Darum habe ich ja hier um Hilfe gebeten.

Falls jemand konkrete Vorschläge hat, wie sich die Existenz eines "echten" Links erkennen läßt, egal ob mit "www", "http" oder "https", würde ich mich sehr freuen. Aber wie schon erwähnt: Es eilt absolut nicht. Das Gesamtprojekt besteht ja noch aus viel mehr. Ich möchte (zunächst für mich selbst) diese übermässig vielen Browser-Lesezeichen in geordnete Bahnen bringen. Dazu werden die Links (nach Themen sortiert) in Textdateien gespeichert und per php in Arrays eingelesen. Über einen etwas komplizierten Mechanismus (der auch noch nicht ganz fertig ist) bekommt jeder externe Link dann einen individuell aufrufbaren (programminternen) Link, über den sich jede gültige Website dann per iframe einbinden läßt.

Sinn der ganzen Sache ist eine Art "vereinfachter Suchmaschine" mit vorausgewählten Links und einer ständig sichtbaren Menüstruktur. Das Ausfiltern ungültiger Weiterleitungen (wobei es in dem von mir hier erstellten Thema geht) soll die Wartung vereinfachen, denn es ist sehr mühsam, tausende Links manuell zu prüfen und solche hartnäckigen ungültigen Weiterleitungen können einem das gesamt Layout zerknallen.

Der Snapshot-Ausschnitt gibt einen Überblick, wie das Gesamtprojekt später aussehen bzw. funktionieren soll.

Nachtrag:
Die Nichterkennung der Entwicklerecke liegt an was ganz anderem, nämlich an fopen und HTTP. Es müßte also bei Links, denen das "HTTP://" fehlt, dieses vorangestellt werden.
ausblenden PHP-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
<?php
$links = array("www.entwickler-ecke.de/""http://www.entwickler-ecke.de/");

foreach ($links as $temp)
{
 $wantit = $temp;
$handle = @fopen($wantit"r");
if ($handle)
{
    echo "Die URL<b> <a href=$wantit>".$wantit."</a> </b>existiert.";  
//  echo "Die URL <span style='color:blue;'><b> ".$wantit."</b></span> existiert";
fclose($handle);
}
else
{    echo "Die URL <span style='color:red;'><b> ".$wantit."</b></span> existiert nicht.";}
echo "<br>";
}
?>
Einloggen, um Attachments anzusehen!