Avatar billede super-mann Juniormester
21. januar 2007 - 18:19 Der er 20 kommentarer og
1 løsning

Captcha med php

Hejsa

Jeg har et nyhedssystem hvor det er muligt, at sende en kommentar via nyheden. Desværre er formularen blevet "spammet" groft på det seneste, og alle forsøg på at udelukke IP-adressen er mislykkedes (modtager pt. 3-4 indlæg i timen som er spam).

Jeg har hørt om udtrykket "Captcha", som er en sikkerhedskode for at kunne sende en formular. Jeg kender intet til denne form for sikring, så håber derfor på hjælp til:

1) Finde et godt Captcha script (er selv tidl. blevet henvist til http://www.phpclasses.org/browse/package/3120.html)

2). Hjælpe med at "installere" det i nedenstående kildekode, som bl.a. kører min formular.

news.display.php:

<form method="post" action="form.handle.php">
<table border="0" width="100%">
  <tr>
    <td width="8%">Navn</td>
    <td width="1%">:</td>
    <td width="91%"> <input type="text" name="navn" style="width: 167; height: 23" size="20">
    </td>
  </tr>
  <tr>
    <td width="8%">E-mail</td>
    <td width="1%">:</td>
    <td width="91%"> <input type="text" name="email" style="width: 166; height: 23" size="20"></td>
  </tr>
  <tr>
    <td width="8%" vAlign="top">Indlæg</td>
    <td width="1%" vAlign="top">:</td>
    <td width="91%">
<textarea name="text" rows="7" cols="0" style="width: 314; height: 155"></textarea></td>
  </tr>
  <tr>
    <td width="8%" vAlign="top">&nbsp;</td>
    <td width="1%" vAlign="top"></td>
    <td width="91%">
    </td>
  </tr>
  <tr>
    <td width="8%" vAlign="top"></td>
    <td width="1%" vAlign="top"></td>
    <td width="91%">

<input type="submit" value="Send">
<input type="reset" value="Slet alt" name="B1"></td>
  </tr>
</table>

<input type="hidden" name="referer" value="comment">
<input type="hidden" name="parent" value="<?php echo $_GET['id']; ?>">
<input type="hidden" name="ip" value="<?php print $_SERVER['REMOTE_ADDR']; ?>">

</form>

form.handle.php:

<?php
include('inc.config.php');

if ($_POST['referer'] == 'comment') {
    if (empty($_POST['name']) && empty($_POST['text'])) {
        echo '<font color="red">Alle felter er ikke udfyldt!</font>';
    } else {
        $_POST['email'] = preg_match("/^[\w\.\-_]+@([\w\-_]+\.)+\w+$/i",$_POST['email']) ? $_POST['email'] : '';
        mysql_query("INSERT INTO comments VALUES ('','".$_POST['ip']."','".$_POST['name']."','".$_POST['email']."',now(),'".$_POST['text']."','".$_POST['parent']."')") or die(mysql_error());
        header("Location: news.display.php?id=".$_POST['parent']);
    }
}
?>
Avatar billede coderdk Praktikant
21. januar 2007 - 19:03 #1
Har du f.eks. læst http://www.eksperten.dk/artikler/1019 ? :)
Avatar billede super-mann Juniormester
21. januar 2007 - 19:05 #2
Takker, vil jeg da se lidt på :-)
Avatar billede super-mann Juniormester
21. januar 2007 - 19:18 #3
coderdk --> Det ser ud til at virke, men er du bekendt med om billedet/jpeg filen som vises kan gøres større med koden? Kan være svær at se.
Avatar billede coderdk Praktikant
21. januar 2007 - 19:20 #4
Den version kan ikke lige umiddelbart gøres større... Du kan tvinge browseren til at vise et større billede ved at sætte f.eks. width="120px" i <img>-tag'et... Ellers skal du skrive billedvisningen lidt om og bruge imagettftext osv...
Avatar billede super-mann Juniormester
21. januar 2007 - 19:23 #5
Oki, takker :-) Bliver forhåbentlig super
Avatar billede coderdk Praktikant
21. januar 2007 - 19:26 #6
Prøvede lige selv at lave tricket med width="120px" det bliver ikke så pænt men det virker da :) Stregerne bliver måske en anelse mørke, jeg ændrede de tre

mt_rand( 100, 230)

til

mt_rand( 130, 230)

så bliver stregerne lidt lysere :)
Avatar billede super-mann Juniormester
21. januar 2007 - 19:44 #7
Hmm, scriptet kan desværre ikke snakke sammen med mit nuværende nyhedssystem. Der kommer hele tiden en session fejl! Ser sådan her ud:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /usr/local/psa/home/vhosts/domæne.dk/httpdocs/banned/banned.php:146) in /usr/local/psa/home/vhosts/domæne.dk/httpdocs/news.display.php on line 65

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /usr/local/psa/home/vhosts/domæne.dk/httpdocs/banned/banned.php:146) in /usr/local/psa/home/vhosts/domæne.dk/httpdocs/news.display.php on line 65
Avatar billede super-mann Juniormester
21. januar 2007 - 19:51 #8
filen news.display.php ser således ud:

<?php include ('banned/banned.php'); ?>

<HTML>
<HEAD>

<TITLE>yeah !!</TITLE>
<LINK href="css/layout.css" type="text/css" rel="stylesheet">

</HEAD>

<BODY><DIV align=center>
<IMG height=102 src="images/layout/top.jpg" width=622 border=0><BR>

<TABLE cellSpacing=0 cellPadding=0 width=622 border=0>
  <TBODY>
  <TR>
    <TD class=content vAlign=top width=418>

        <DIV class=blogcontent>

<?php
include('inc.config.php');
$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%Y %T') AS date FROM news WHERE id=".$_GET['id']."");
$row = mysql_fetch_assoc($query);

function LinkedText($text)
{
  $text = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]","<a target=\"new\" href=\"\\0\">\\0</a>",
          ereg_replace("www[^<>[:space:]]+[[:alnum:]/]", "http://\\0",
          str_replace("http://www", "www", $text)));
  return $text;
}

echo '<h2>'.$row['title'].'</h2>';
echo '<p><b>'.$row['synopsis'].'</b></p>';
echo empty($row['image']) ? '' : '<p align="center"><img src="files/'.$row['image'].'" class="image">';
echo '</p>';
echo LinkedText(nl2br(htmlspecialchars($row['text'])));
echo '<br><br><p>Skrevet af '.$row['author'].', '.$row['date'].'</p>';
echo '<div class="hr"></div>';


$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%Y %T') AS date FROM comments WHERE parent=".$_GET['id']." ORDER BY id ASC");
if (mysql_num_rows($query) > 0) {
    echo '<a name="Kommentarer"></a><h2>Kommentarer</h2>';
    while ($row = mysql_fetch_assoc($query)) {
        echo empty($row['email']) ? htmlspecialchars($row['name']) : '<a href="mailto:'.$row['email'].'">'.htmlspecialchars($row['name']).'</a>';
        echo '&nbsp;('.$row['date'].')<br><br>';
        echo LinkedText(nl2br(htmlspecialchars($row['text'])));
        echo '<div class="hr"></div>';
    }
}
?>

<a name="kommenter"></a><h2>Kommenter nyhed</h2>

Her kan du vælge at kommentere, ovenstående nyhed - sæt dine egne ord på og deltag i debatten.

<br>

<?php

    session_start();
   
    function outputImage()
    {
        // Denne funktion skriver et billede til browseren
        header( 'Content-Type: image/png' );
        $im = imagecreate( 60, 20 );
        // Baggrundsfarven
        $bgcol = imagecolorallocate( $im, 255, 255, 255 );
        // Rammen
        $bordercol = imagecolorallocate( $im, 0, 0, 0 );
        // Tekstfarce
        $textcol = imagecolorallocate( $im, 100, 100, 220 );
        // Fyld med baggrundsfarven
        imagefill( $im, 1, 1, $bgcol );
        for ( $i = 0; $i < 4; $i++ )
        {
            // Tilfældig farve til linjerne
            $tmpCol = imagecolorallocate(
                $im, mt_rand( 100, 230), mt_rand( 100, 230), mt_rand( 100, 230) );
            // Tegn linje
            imageline( $im, 0, mt_rand( 0, 19 ), 59, mt_rand( 0, 19 ), $tmpCol );
        }
        // Skriv CAPTCHA-teksten
        imagestring( $im, 5, 9, 2, $_SESSION['captcha-code'], $textcol );
        // Wave effect
        for ( $i = 0; $i < 60; $i += 2 )
            imagecopy( $im, $im, $i - 2, sin( $i / 10 ) * 3, $i, 0, 2, 20 );
        // Tegn rammen
        imagerectangle( $im, 0, 0, 59, 19, $bordercol );
        // Smid billedet til browseren
        imagepng( $im );
        imagedestroy( $im );
        // Stop scriptet her!
        exit;
    }
   
    function newCode()
    {
        // Denne funktion laver en tekst der (som regel) kan udtales
        $vowels = array_slice( preg_split( '//', 'AEUY' ), 1, -1 );
        $nvowels = count( $vowels ) - 1;
        $consonants = array_slice( preg_split( '//', 'BCDFGHJKLMNPQRSTVWXZ' ), 1, -1 );
        $nconsonants = count( $consonants ) - 1;
        $code = "";
        $rnd = mt_rand( 0, 1 ) == 1 ? true : false;
        // Loopet herunder bygger teksten
        while ( strlen( $code ) < 5 )
        {
            $code .= ( $rnd ? $vowels[ mt_rand( 0, $nvowels ) ]
                : $consonants[ mt_rand( 0, $nconsonants ) ] );
            $rnd = !$rnd;
        }
        // Smid teksten i en sessionsvariabel
        $_SESSION['captcha-code'] = $code;
    }
   
    if ( isset( $_GET['img'] ) || isset( $_GET['newimg'] ))
    {
        if ( isset( $_GET['newimg'] ) )
        {
            // Brugeren kunne ikke læse koden, så lav en ny
            newCode();
        }
        // Vis billede
        outputImage();
        // Scriptet stopper i outputImage() - Denne kode bliver altså kun
        // kørt når der gives ?img eller ?newimg i URL'en
    }
   
    // Dan ny CAPTCHA-tekst
    newCode();

?>

<script type="text/javascript">
    function getNewImg()
    {
        var d = new Date();
        document.getElementById('theImg').src =
            '<?= $_SERVER['PHP_SELF'] ?>?newimg&x' + d.getTime();
    }
</script>

<form method="post" action="form.handle.php">
    <img id="theImg" align="top" src="<?= $_SERVER['PHP_SELF'] ?>?img">
    <input type="button" value="Jeg kan ikke læse det!" onclick="getNewImg()"><br>
    Skriv bogstaverne i billedet:
    <input type="text" style="width: 60px" name="kode">
    <input type="submit" value="Indsend">
</form>

<div class="hr"></div>
<a href="java script:window.scrollTo(0,0)">Til toppen</a> |
<a href="index.php">Forsiden / Nye nyheder</a> |
<a href="news.search.php">Søg efter nyhed</a> |
<a href="news.archives.php">Nyhedsarkiv</a>




    </DIV></TD><TD class=extra vAlign=top align=left width=142>


<?php include ('includes/menu.php'); ?>


</TD></TR></TBODY></TABLE>
       
<IMG height=3 alt="" src="images/layout/bottom.gif" width=622 border=0><BR>
       
        <table><tr><td><span class="copyright">© Copyright 2007span></td></tr></table></DIV>
   

<br>

<p align="center"><?php include ('includes/chart.php'); ?></p>


</BODY>
       
</HTML>
Avatar billede super-mann Juniormester
21. januar 2007 - 20:08 #9
Fjerner jeg denne linie "<?php include ('banned/banned.php'); ?>" vises kun denne fejl:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /usr/local/psa/home/vhosts/domæne.dk/httpdocs/news.display.php:19) in /usr/local/psa/home/vhosts/domæne.dk/httpdocs/news.display.php on line 61
Avatar billede coderdk Praktikant
21. januar 2007 - 20:32 #10
Prøv:

<?php

    session_start();
 
    function outputImage()
    {
        // Denne funktion skriver et billede til browseren
        header( 'Content-Type: image/png' );
        $im = imagecreate( 60, 20 );
        // Baggrundsfarven
        $bgcol = imagecolorallocate( $im, 255, 255, 255 );
        // Rammen
        $bordercol = imagecolorallocate( $im, 0, 0, 0 );
        // Tekstfarce
        $textcol = imagecolorallocate( $im, 100, 100, 220 );
        // Fyld med baggrundsfarven
        imagefill( $im, 1, 1, $bgcol );
        for ( $i = 0; $i < 4; $i++ )
        {
            // Tilfældig farve til linjerne
            $tmpCol = imagecolorallocate(
                $im, mt_rand( 100, 230), mt_rand( 100, 230), mt_rand( 100, 230) );
            // Tegn linje
            imageline( $im, 0, mt_rand( 0, 19 ), 59, mt_rand( 0, 19 ), $tmpCol );
        }
        // Skriv CAPTCHA-teksten
        imagestring( $im, 5, 9, 2, $_SESSION['captcha-code'], $textcol );
        // Wave effect
        for ( $i = 0; $i < 60; $i += 2 )
            imagecopy( $im, $im, $i - 2, sin( $i / 10 ) * 3, $i, 0, 2, 20 );
        // Tegn rammen
        imagerectangle( $im, 0, 0, 59, 19, $bordercol );
        // Smid billedet til browseren
        imagepng( $im );
        imagedestroy( $im );
        // Stop scriptet her!
        exit;
    }
 
    function newCode()
    {
        // Denne funktion laver en tekst der (som regel) kan udtales
        $vowels = array_slice( preg_split( '//', 'AEUY' ), 1, -1 );
        $nvowels = count( $vowels ) - 1;
        $consonants = array_slice( preg_split( '//', 'BCDFGHJKLMNPQRSTVWXZ' ), 1, -1 );
        $nconsonants = count( $consonants ) - 1;
        $code = "";
        $rnd = mt_rand( 0, 1 ) == 1 ? true : false;
        // Loopet herunder bygger teksten
        while ( strlen( $code ) < 5 )
        {
            $code .= ( $rnd ? $vowels[ mt_rand( 0, $nvowels ) ]
                : $consonants[ mt_rand( 0, $nconsonants ) ] );
            $rnd = !$rnd;
        }
        // Smid teksten i en sessionsvariabel
        $_SESSION['captcha-code'] = $code;
    }
 
    if ( isset( $_GET['img'] ) || isset( $_GET['newimg'] ))
    {
        if ( isset( $_GET['newimg'] ) )
        {
            // Brugeren kunne ikke læse koden, så lav en ny
            newCode();
        }
        // Vis billede
        outputImage();
        // Scriptet stopper i outputImage() - Denne kode bliver altså kun
        // kørt når der gives ?img eller ?newimg i URL'en
    }
 
    // Dan ny CAPTCHA-tekst
    newCode();

    include ('banned/banned.php');

?>
<HTML>
<HEAD>

<TITLE>yeah !!</TITLE>
<LINK href="css/layout.css" type="text/css" rel="stylesheet">

</HEAD>

<BODY><DIV align=center>
<IMG height=102 src="images/layout/top.jpg" width=622 border=0><BR>

<TABLE cellSpacing=0 cellPadding=0 width=622 border=0>
  <TBODY>
  <TR>
    <TD class=content vAlign=top width=418>

        <DIV class=blogcontent>

<?php
include('inc.config.php');
$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%Y %T') AS date FROM news WHERE id=".$_GET['id']."");
$row = mysql_fetch_assoc($query);

function LinkedText($text)
{
  $text = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]","<a target=\"new\" href=\"\\0\">\\0</a>",
          ereg_replace("www[^<>[:space:]]+[[:alnum:]/]", "http://\\0",
          str_replace("http://www", "www", $text)));
  return $text;
}

echo '<h2>'.$row['title'].'</h2>';
echo '<p><b>'.$row['synopsis'].'</b></p>';
echo empty($row['image']) ? '' : '<p align="center"><img src="files/'.$row['image" class="image">';
echo '</p>';
echo LinkedText(nl2br(htmlspecialchars($row['text'])));
echo '<br><br><p>Skrevet af '.$row['author'].', '.$row['date'].'</p>';
echo '<div class="hr"></div>';


$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%Y %T') AS date FROM comments WHERE parent=".$_GET['id']." ORDER BY id ASC");
if (mysql_num_rows($query) > 0) {
    echo '<a name="Kommentarer"></a><h2>Kommentarer</h2>';
    while ($row = mysql_fetch_assoc($query)) {
        echo empty($row['email']) ? htmlspecialchars($row['name']) : '<a href="mailto:'.$row['email'].'">'.htmlspecialchars($row['name']).'</a>';
        echo '&nbsp;('.$row['date'].')<br><br>';
        echo LinkedText(nl2br(htmlspecialchars($row['text'])));
        echo '<div class="hr"></div>';
    }
}
?>

<a name="kommenter"></a><h2>Kommenter nyhed</h2>

Her kan du vælge at kommentere, ovenstående nyhed - sæt dine egne ord på og deltag i debatten.

<br>

<script type="text/javascript">
    function getNewImg()
    {
        var d = new Date();
        document.getElementById('theImg').src =
            '<?= $_SERVER['PHP_SELF'] ?>?newimg&x' + d.getTime();
    }
</script>

<form method="post" action="form.handle.php">
    <img id="theImg" align="top" src="<?= $_SERVER['PHP_SELF'] ?>?img">
    <input type="button" value="Jeg kan ikke læse det!" onclick="getNewImg()"><br>
    Skriv bogstaverne i billedet:
    <input type="text" style="width: 60px" name="kode">
    <input type="submit" value="Indsend">
</form>

<div class="hr"></div>
<a href="java script:window.scrollTo(0,0)">Til toppen</a> |
<a href="index.php">Forsiden / Nye nyheder</a> |
<a href="news.search.php">Søg efter nyhed</a> |
<a href="news.archives.php">Nyhedsarkiv</a>




    </DIV></TD><TD class=extra vAlign=top align=left width=142>


<?php include ('includes/menu.php'); ?>


</TD></TR></TBODY></TABLE>
     
<IMG height=3 alt="" src="images/layout/bottom.gif" width=622 border=0><BR>
     
        <table><tr><td><span class="copyright">© Copyright 2007span></td></tr></table></DIV>
 

<br>

<p align="center"><?php include ('includes/chart.php'); ?></p>


</BODY>
     
</HTML>
Avatar billede super-mann Juniormester
21. januar 2007 - 20:36 #11
Så får jeg denne fejl:
Parse error: syntax error, unexpected ';', expecting ']' in /usr/local/psa/home/vhosts/domæne.dk/httpdocs/news.display.php on line 112
Avatar billede coderdk Praktikant
21. januar 2007 - 20:46 #12
Du har en fejl i din kode.

Linje 112:

echo empty($row['image']) ? '' : '<p align="center"><img src="files/'.$row['image" class="image">';

skal være:

echo empty($row['image']) ? '' : '<p align="center"><img src="files/'.$row['image']. ' class="image">';
Avatar billede coderdk Praktikant
21. januar 2007 - 20:47 #13
Der mangler noget, den skal nok være:

echo empty($row['image']) ? '' : '<p align="center"><img src="files/'.$row['image']. '" class="image"></p>';
Avatar billede super-mann Juniormester
21. januar 2007 - 21:35 #14
Hmm, det virkede nu ellers før fejlfrit den "gamle" kildekode, så der burde vel ikke rettes som du skriver? Det er vel den nye kildekode med captcha som giver problemer?

Jeg har alligevek forsøgt at ændre ovenstående linie mht. image men giver fortsat fejl.
Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in /usr/local/psa/home/vhosts/domæne.dk/httpdocs/news.display.php on line 112
Avatar billede coderdk Praktikant
21. januar 2007 - 21:55 #15
Well, den linje det er galt med har intet med captcha'en at gøre...
Linjen skal nok i øvrigt være:

echo empty($row['image']) ? '' : '<p align="center"><img src="files/'.$row['image']. ' class="image"></p>';
Avatar billede coderdk Praktikant
21. januar 2007 - 21:56 #16
Jeez, jeg bliver ved at paste det forkerte:

echo empty($row['image']) ? '' : '<p align="center"><img src="files/'.$row['image']. '" class="image"></p>';

Den burde virke
Avatar billede super-mann Juniormester
21. januar 2007 - 21:58 #17
Så er der gevinst :-) Nu virker det hehe
Avatar billede super-mann Juniormester
21. januar 2007 - 22:00 #18
21/01-2007 21:55:30 --> Den kode virker

21/01-2007 21:56:39 --> Den kode virker ikke
Avatar billede super-mann Juniormester
21. januar 2007 - 22:08 #19
Måske du også kan hjælpe med den sidste del, så formularen også kommer ind i databasen? Det er de 2 nedenstående koder som skal "bygges sammen".

Min fil ser sådan ud:

<?php
include('inc.config.php');

if ($_POST['referer'] == 'comment') {
    if (empty($_POST['name']) && empty($_POST['text'])) {
        echo '<font color="red">Alle felter er ikke udfyldt!</font>';
    } else {
        $_POST['email'] = preg_match("/^[\w\.\-_]+@([\w\-_]+\.)+\w+$/i",$_POST['email']) ? $_POST['email'] : '';
        mysql_query("INSERT INTO comments VALUES ('','".$_POST['ip']."','".$_POST['name']."','".$_POST['email']."',now(),'".$_POST['text']."','".$_POST['parent']."')") or die(mysql_error());
        header("Location: news.display.php?id=".$_POST['parent']);
    }
}
?>

---------------------- den nye kode med captcha funktion -------------
<?php

    session_start();

    if ( !empty( $_POST['kode'] ) && strtoupper( $_POST['kode'] ) == $_SESSION['captcha-code'] )
    {
        // Koden brugeren tastede var korrekt, og du kan nu gemme hvad han har postet
    }
    else
    {
        $_SESSION['captcha-code'] = md5( microtime() );
        echo "<p>Desværre, koden du skrev, var forkert. Prøv igen.</p>";
    }

?>
Avatar billede coderdk Praktikant
21. januar 2007 - 22:17 #20
Burde virke:

<?php

session_start();

include('inc.config.php');

if ($_POST['referer'] == 'comment') {
    if (empty($_POST['name']) && empty($_POST['text'])) {
        echo '<font color="red">Alle felter er ikke udfyldt!</font>';
    } else {
        if ( !empty( $_POST['kode'] ) && strtoupper( $_POST['kode'] ) == $_SESSION['captcha-code'] )
        {
            $_POST['email'] = preg_match("/^[\w\.\-_]+@([\w\-_]+\.)+\w+$/i",$_POST['email']) ? $_POST['email'] : '';
            mysql_query("INSERT INTO comments VALUES ('','".$_POST['ip']."','".$_POST['name']."','".$_POST['email']."',now(),'".$_POST['text']."','".$_POST['parent']."')") or die(mysql_error());
            header("Location: news.display.php?id=".$_POST['parent']);
            exit;
        }
        else
        {
            $_SESSION['captcha-code'] = md5( microtime() );
            echo "<p>Desværre, koden du skrev, var forkert. Prøv igen.</p>";
        }
    }
}

?>
Avatar billede super-mann Juniormester
21. januar 2007 - 22:26 #21
Tusind tak for din hjælp og tålmodighed :-) Nu virker det hele i mit nyhedssystem. Så kan det være jeg er heldig, at slippe for en masse spam.

Og du får straks nogle point kastet efter dig :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester