Avatar billede miss-g Seniormester
21. maj 2010 - 03:49 Der er 16 kommentarer og
1 løsning

tilføj link formular - send hvis bestemt ord er skrevet?

På min hjemmeside har jeg en simpel "tilføj dit link" formular, som bliver spammet med udenlandske links!

Jeg tænker at jeg kan tilføje et slags kodeord, f.eks. "Hvad er hovedstaden i Danmark"? Og så skal man skrive ordet "København".

Mon ikke det ville være sikkert nok?

Jeg har PHP og Server til rådighed (også captcha, men vil ikke have de billeder på....umidelbart).

Hvordan skal det felt valideres?

Er rimelig grøn, så skriv gerne koden og hvor den skal indsættes...

(Og jeg har søgt på eksperten - synes bare ikke jeg kan finde noget konkret jeg kan hitte ud af)...

På forhånd tak.
Avatar billede repox Seniormester
21. maj 2010 - 08:49 #1
Hvis du gerne vil have nogen til at lave det for dig, må du vise din eksisterende kode...
Avatar billede showsource Seniormester
21. maj 2010 - 10:03 #2
du kan prøve med et hiddenfelt som skifter navn ved hver load af siden.

<?php
session_start();

if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_COOKIE[session_name()])) {

    if(isset($_SESSION["post_ok"],$_POST[$_SESSION["post_ok"]]) && $_POST[$_SESSION["post_ok"]] == "") {

    echo"<pre>";
    print_r($_POST);
    echo"</pre>";

    exit;

    }

}

$alf = range("a", "z");
shuffle($alf);

$_SESSION["post_ok"] = $alf[0].$alf[2]."_".rand();

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html><head><title>Hidden field</title>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

<script type="text/javascript" src="spampost.js"></script>

</head>

<body>

<script type="text/javascript">

var form_id = 'postform';
var hidename = '<?php echo $_SESSION["post_ok"]; ?>';

</script>

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" style="display: inline;" id="postform">

    <div style="padding-top: 16px; text-align: center;">

    <input type="text" value="" name="nytlink">
    <input type="button" value="Send link" onclick="make_hidden();" onkeydown="make_hidden();">

    </div>

</form>

</body></html>

og spampost.js

function get_id (idref) {

    if (document.all && document.getElementById) {
    return document.all(idref);
    } else if (!document.all && document.getElementById) {
    return document.getElementById(idref);
    } else {
    return false;
    }
}


function make_hidden() {

    if(!form_id || !hidename) {
    return false;
    }

    if(ref = get_id(form_id)) {

        try {

        newElement=document.createElement('<input type="hidden" name="'+hidename+'" value="">');

        } catch (e) {

            try {

            newElement=document.createElement("input");
            newElement.setAttribute("name", hidename);
            newElement.setAttribute("type", "hidden");
            newElement.setAttribute("value", "");

                } catch (e) {

                alert('Browser is Not Supported !!!');
                return false;

                }
            }

    ref.appendChild(newElement);

    ref.submit();

    }

}
Avatar billede olebole Juniormester
21. maj 2010 - 10:31 #3
<ole>

Du bør vide, at din DOM-kode ikke virker i IE. IE kan ikke sætte en name-attribut på et element. Du er nødt til at skrive:

newElement=document.createElement("<input name='"+hidename+"' type='hidden'>");

/mvh
</bole>
Avatar billede showsource Seniormester
21. maj 2010 - 10:46 #4
øhhh, ole, hvad er forskellen på dit og mit ex. ?
Jeg prøver jo netop at lave elementet først på "IE maner" og ellers bruger setAttribute
Avatar billede olebole Juniormester
21. maj 2010 - 11:02 #5
øhhh, forskellen ...? Måske et par nye briller til den aldrende herre! Sorry - den linje havde jeg overset  :D
Avatar billede Slettet bruger
21. maj 2010 - 14:54 #6
Er du en anelse naiv miss-g ?
- At du bare går ud fra at "spammere" - de må være udlændinge : )

Showsource's metode vil sikkert eliminere langt det meste, men er ikke 100% robot-sikker.

Hvis brugernes indtastede links går direkte fra formen, og op på din side, hvor en masse mennesker kan se dem, vil det være guf for en spammer, og du kan blive nødt til at supplere med captcha (og/eller din egen indfødsretsprøve (men med mere end ét spørgsmål, ikk'))
- søg efter captcha her på Eksperten - der er masser af eksempler.
Avatar billede cronaldo Nybegynder
22. maj 2010 - 01:12 #7
hvorfor ikke noget ala:


<?php

$tal_et = rand(1,9);
$tal_to = rand(1,9);
$sum_tal = $tal_et + $tal_to;

if( $_POST['sum_af_tal'] == $sum_tal )
{
  // SUCCES
} else {
  // FEJL
}

echo 'Hvad giver '.$tal_et.' + '.$tal_to.'?';
echo '<input type="text" name="sum_af_tal" size="4">';
?>

Det er selvfølgelig kun lidt kodestumper, som du selv må indsætte - eller er det mig, der har misforstået problemet helt? :P
Avatar billede olebole Juniormester
24. maj 2010 - 15:21 #8
cronaldo >> Den må du vist forklare. Jeg kan i hvertfald ikke finde hoved eller hale på idéen  =)
Avatar billede cronaldo Nybegynder
25. maj 2010 - 00:51 #9
Jamen lav en form for captcha hvor den finder 2 tal, som brugeren skal lægge sammen. Det bør ikke tage mange linjer kode at lave - ovenstående kode kan jo næsten præstere det.

Så der vil stå noget ala:

Hvad giver 2 + 5? [FELT]

og hvis det ikke er rigtigt skal den give fejl.
Avatar billede miss-g Seniormester
26. maj 2010 - 15:40 #10
Er ikke naiv - nærmere udvidende ang. spammere.

Men captcha og min egen version - er det ikke det samme(lige sikkert) ?

Miss-g
Avatar billede miss-g Seniormester
26. maj 2010 - 15:42 #11
... det er netop en egen captcha jeg ønsker...

Hvad hedder hovedstaden i Danmark? FELT (svar København).

Det vil også udelukke nogle udenlandske da de ikke har ø på tastaturet...
Avatar billede olebole Juniormester
26. maj 2010 - 16:08 #12
De links, der bliver skrevet ind, har du observeret er til udenlandske sider - men du har jo ingen anelse om, hvor de kommer fra.

I allerbedste fald kan du se hvilken proxy server, spammeren har kommunikeret igennem. Den kan jo sagtens stå i Sydbengalen, mens kommunikationen i virkeligheden kommer fra Knud Otto Pedersen i Skanderborg.

Fidusen ved billeder er, at de ikke kan læses programmatisk. Din løsning indebærer ingen sikkerhed - men kan gøre det en anelse mere besværligt. Dog ikke væsentligt mere end at sætte en kaffekop ved siden af spammerens musemåtte og fortælle ham, at han ikke må vælte den  =)
Avatar billede miss-g Seniormester
26. maj 2010 - 18:12 #13
Jeg har nu forsøgt mig med captcha, men formularen kan sendes uanset om det felt er udfyldt eller ej, så min integrering er ikke lykkedes særlig godt. Den kommer dog med fejlbesked om at formularen ikke er udfyldt korrekt.... det manglende felt.

http://www.nicolin.dk/testside.php

Mens jeg sad og "legede" blev der smidt 8 links på til udenlandske sider... de er dælme hurtige!

Captcha jeg bruger er Killbot:
http://www.notonebit.com/projects/killbot/

---------------------------------------------------------------

Kode før header:

<?
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;   
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO links (linkname, linkweb, beskrivelse, catg) VALUES (%s, %s, %s, %s)",
                      GetSQLValueString($_POST['linkname'], "text"),
                      GetSQLValueString($_POST['linkweb'], "text"),
                      GetSQLValueString($_POST['beskrivelse'], "text"),
                      GetSQLValueString($_POST['catg'], "text"));

mysql_select_db($nicolin_dk);
  $Result1 = mysql_query($insertSQL) or die(mysql_error());
}

mysql_select_db($nicolin_dk);
$query_rsLinkcatg = "SELECT * FROM linkcategories";
$rsLinkcatg = mysql_query($query_rsLinkcatg) or die(mysql_error());
$row_rsLinkcatg = mysql_fetch_assoc($rsLinkcatg);
$totalRows_rsLinkcatg = mysql_num_rows($rsLinkcatg);
?>

---------------------------------------------------------------

Formularen:

<div class="headlines">Tilf&oslash;j dit link her:</div><br>
<form action="<?=$PHP_SELF?>" method="POST">
  <table width="100%" align="left">
    <tr valign="baseline">
      <td width="93" align="right" nowrap>Sidens navn::</td>
      <td width="510"><span id="sprylinkname">
        <input name="linkname" type="text" id="linkname" size="32" maxlength="25">
        <span class="textfieldRequiredMsg">Du skal skrive navnet på siden!</span></span></td>
    </tr>
    <tr valign="baseline">
      <td nowrap align="right">Sidens URL::</td>
      <td><span id="sprylinkweb">
      <input name="linkweb" type="text" id="linkweb" value="http://" size="32" maxlength="100">
      <span class="textfieldRequiredMsg">Du skal skrive adressen på siden - start med http://</span><span class="textfieldInvalidFormatMsg">Forkert format!</span></span><br>
        f.eks. http://www.minside.dk</td>
    </tr>
    <tr valign="baseline">
      <td align="right" valign="baseline" nowrap>Kort beskrivelse:<br>
min. 100 tegn.</td>
      <td valign="top"><span id="sprybeskrivelse">
      <textarea name="beskrivelse" id="beskrivelse" cols="50" rows="8"></textarea><br>
      <div class="spryposition"><span class="textareaRequiredMsg">Beskrivelse skal udfyldes!</span></div>
      <div class="spryposition"><span class="textareaMinCharsMsg">Du skal skrive mindst 100 tegn!</span></div>
      <br>
Du har skrevet <span id="countsprytextarea1">&nbsp;</span> tegn.<br>
</span></td>
    </tr>
    <tr valign="baseline">
      <td nowrap align="right">Vælg kategori::</td>
      <td><span id="sprycatg">
        <select name="catg" id="catg">
          <option value=""></option>
          <?php
do { 
?>
          <option value="<?php echo $row_rsLinkcatg['Linkcatg']?>"><?php echo $row_rsLinkcatg['Linkcatg']?></option>
          <?php
} while ($row_rsLinkcatg = mysql_fetch_assoc($rsLinkcatg));
  $rows = mysql_num_rows($rsLinkcatg);
  if($rows > 0) {
      mysql_data_seek($rsLinkcatg, 0);
      $row_rsLinkcatg = mysql_fetch_assoc($rsLinkcatg);
  }
?>
        </select>
        <span class="selectInvalidMsg">Du skal vælge en kategori!</span><span class="selectRequiredMsg">Du skal vælge en kategori!</span></span></td>
    <tr valign="baseline">
      <td colspan="2" align="right" nowrap>&nbsp;</td>
      </tr>
    <tr valign="baseline">
      <td nowrap align="right">&nbsp;</td>
      <td><img border="2" src="/formscript/captcha.php?<?=$string?>"></td>
    </tr>
    <tr valign="baseline">
      <td nowrap align="right">&nbsp;</td>
      <td>Skriv bogstaverne du ser i kassen her:&nbsp;<input type="text" size="10" name="guess"></td>
    </tr>
    <tr valign="baseline">
      <td nowrap align="right">&nbsp;</td>
      <td><input name="submit" type="submit" id="submit" value="Tilføj link"></td>
    </tr>
    <tr valign="baseline">
      <td nowrap align="right">&nbsp;</td>
      <td><strong>Useriøse links vil blive fjernet!</strong></td>
    </tr>
    <tr valign="baseline">
      <td nowrap align="right">&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr valign="baseline">
      <td nowrap align="right">&nbsp;</td>
      <td>
      <?
// The ONLY variable you should need to change is $svar which must match $svar in your captcha.php file

$svar = "MYSECRETKEY"; // IMPORTANT!!! Your unique key. Must match $svar in captcha.php

if ($_POST)
{
    $user_input = $_POST['guess'];        // The guess a user enters -- case sensitive
    $newcode = $_POST['code'] . $svar;    // Combine the hidden code field with $svar
    $key = substr(base64_encode(md5($newcode)), 0, 5);    // Encrypt it and take first five characters
   
    if ($key == $user_input) // USER SUCCESSFULLY VALIDATED
    {
        echo "<hr /><h3>Dit link er blevet tilføjet!</h3>";       
    }
    else // USER UNSUCCESSFULLY VALIDATED
    {
        echo "<hr /><h3>Formularen er ikke udfyldt rigtigt. Prøv venligst igen!</h3><hr />";
    }
}

?>

<?
$rand_loop = rand(5, 10);    // Pick length of random string
$string = '';            // Initialize string

for($i = 1; $i <= $rand_loop; $i++)
{
    $rand1 = rand(48, 57); //0-9
    $rand2 = rand(65, 90); //A-Z
    $rand3 = rand(97, 122); //a-z
    $rand_picker = rand(1, 3); // use rand 1, 2 or 3

    switch ($rand_picker) {
        case 1:
              $string .= chr($rand1);
              break;
        case 2:
              $string .= chr($rand2);
              break;
        case 3:
              $string .= chr($rand3);
              break;
    }
}

?>
      </td>
    </tr>
  </table>

<input type="hidden" name="MM_insert" value="form1">
</form>

---------------------------------------------------------------

Hvad gør jeg galt?

Bare test løs... Jeg sletter bare links når det virker...
Avatar billede olebole Juniormester
27. maj 2010 - 12:49 #14
Prøv at lave det i et helt stripped miljø ... altså hvor der ikke er andet kode, end hvad der er nødvendigt for at få captcha til at virke. Så er det lettere for dig selv at overskue, hvad du gør og hvad der sker - ligesom det gør det langt lettere for os at hjælpe dig med fejlen
Avatar billede miss-g Seniormester
28. maj 2010 - 00:38 #15
Prøver lige igen.

Ønskede løsning:

1. Hidden field, der ikke skal udfyldes. Er dette felt udfyldt sendes formularen ikke.

2. Når formularen er sendt nulstilles felter og besked kommer "Dit link er tilføjet" øverst på siden.

Her er koden (uden validering og design):

---------------------------------------------------------------

<?php require_once('../Connections/local.php'); ?>

<!------------------------------->

<!------------------------------->
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;   
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO links (linkname, linkweb, beskrivelse, catg) VALUES (%s, %s, %s, %s)",
                      GetSQLValueString($_POST['linkname'], "text"),
                      GetSQLValueString($_POST['linkweb'], "text"),
                      GetSQLValueString($_POST['beskrivelse'], "text"),
                      GetSQLValueString($_POST['catg'], "text"));

  mysql_select_db($database_local, $local);
  $Result1 = mysql_query($insertSQL, $local) or die(mysql_error());

  $insertGoTo = "test.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
}

mysql_select_db($database_local, $local);
$query_rsLinkcatg = "SELECT Linkcatg FROM linkcategories";
$rsLinkcatg = mysql_query($query_rsLinkcatg, $local) or die(mysql_error());
$row_rsLinkcatg = mysql_fetch_assoc($rsLinkcatg);
$totalRows_rsLinkcatg = mysql_num_rows($rsLinkcatg);
?>
<!------------------------------------------------------------------------------------------------------->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<TITLE>Testside</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
<!--
.important {
    display: none;
    visibility: hidden;
}
-->
</style>
</head>
<body>

<form name="form1" method="POST" action="<?php echo $editFormAction; ?>">
  <table width="600" border="0" align="center" cellpadding="5" cellspacing="0">
  <tr class="important">
  <td>&nbsp;</td>
  <td><input name="message" type="text" id="message"></td>
  </tr>
  <tr>
  <td width="124">Sidens navn:</td>
  <td width="456"><input name="linkname" type="text" id="linkname" size="40" maxlength="25"></td>
  </tr>
  <tr>
  <td>Sidens Url:</td>
  <td><input name="linkweb" type="text" id="linkweb" value="http://" size="40" maxlength="100"></td>
  </tr>
  <tr>
  <td>Beskrivelse:</td>
  <td><textarea name="beskrivelse" id="beskrivelse" cols="45" rows="5"></textarea></td>
  </tr>
  <tr>
  <td>&nbsp;</td>
  <td>&nbsp;</td>
  </tr>
  <tr>
  <td>Kategori:</td>
  <td><select name="catg" id="catg">
  <?php do { 
  ?>
  <option value="<?php echo $row_rsLinkcatg['Linkcatg']?>"><?php echo $row_rsLinkcatg['Linkcatg']?></option>
  <?php
  } while ($row_rsLinkcatg = mysql_fetch_assoc($rsLinkcatg));
  $rows = mysql_num_rows($rsLinkcatg);
  if($rows > 0) {
  mysql_data_seek($rsLinkcatg, 0);
  $row_rsLinkcatg = mysql_fetch_assoc($rsLinkcatg);
  }
  ?>
  </select></td>
  </tr>
  <tr>
  <td>&nbsp;</td>
  <td><input type="submit" value="Tilføj Link"></td>
  </tr>
  </table>
<input type="hidden" name="MM_insert" value="form1">
</form>
</body>
</html>
<?php
mysql_free_result($rsLinkcatg);
?>
Avatar billede cronaldo Nybegynder
30. maj 2010 - 23:54 #16
Jeg forstår ikke hvad du vil med et hiddenfield !?
Avatar billede miss-g Seniormester
31. maj 2010 - 02:47 #17
Prøver at søge på nettet - og ellers kommer spørgsmålet igen...
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