Om l33t hackertjes wat van *ontspanning te voorzien, bestaat er nu een applicatie die je MAG kraken, sterker nog, het is zelfs de bedoeling, dus geef elkaar hints hoe je een object decompiled, hoe je extern post en evt kan klooien met variabelen en of sessie's.
In PHP maak je een random string aan en geef je die mee aan je flash object maar op de één of andere manier geef je die mee aan je flash film en die gehashde string is gewoon ter controle.
okay, nu de doodsteek voor mij...of hopelijk toch niet, want ik heb toch geprobeerd dit te omzeilen, maar ik weet niet hoe ik dit moest testen:
de swf post die checkone naar ver_random.
op ver_random word gekeken of checkone (die ook in een sessie staat) wel dezelfde waarde heeft.
zoniet: echo gna gna
zoja: echo de string waar flash de captcha mee vult, maar tegelijkertijd zet ik dus ook een sessie met die "string".
Bij het daadwerkelijke posten is er iets wat dan eea checked, if not: fout,
if yes: post
Nu je dus DENKT dat je via een formpje en checkone die string kan oproepen, okay, je ZIET wel een string, maar is dat wel de juiste om mee te posten ?
Als je dat weet, dan zou je dus via een extern form moeten kunnen posten (bot)...maar ik hoop dat dit dus goed opgelost is.
Die string is een sessie variable, zodra de swf die sessievar leest, plopt hij die naar ver_random, die op zijn beurt dan weer checked of dat nummer wel daadwerkelijk de sessie var is, zo ja: echo de captcha string, zo nee: echo gna gna.
Wat ik me afvraag is of Actionscript reeds voor het sturen van de response een code kan genereren. Als dit mogelijk is is het natuurlijk niets anders dan reguliere regex maar dan iets uitgebreider. Overigens is het heel gemakkelijk een bot een pagina te laten zien, iets aan te laten klikken (fixed coords) en vervolgens een screenshot te maken. Dit is dus in principe geen veiligere captcha.
Volgens mij is de aard van actionscript heel anders en moet de random code eerst opgehaald worden. Als ik de code zo even over kijk gebeurt dat met een POST request, als dat inderdaad de manier is van ophalen van de code dan is de code heel gemakkelijk te onderscheppen natuurlijk.
EDIT: En gotcha. Met een HTTP sniffer heel gemakkelijk de POST onderschept: "&input_var=wbklh7". Jammer maar helaas, try again ;)
Over het printscreen gedeelte: een printscreen is nutteloos, want met as zorg ik ervoor dat er ALTIJD één character uit de string ontbreekt in de swf, dus dat ding staat daar te knipperen en flitsen, en laat random telkens één letter verdwijnen.
Je kan dan hardop denken, dan neem ik een tweede of derde printscreen, MAAR, daar ontbreekt weer een ander character (of mss wel 2 keer dezelfde), en de rest van de letters is random geroteerd en heeft een andere kleur.
Over je response vraag, die vraag snap ik niet helemaal.
Wat er basicly gebeurd is volgende:
je komt op die pagina en er word een sessie gezet.
Die sessie plaats ik IN de swf (checkOne)
Flash post die string dan op zijn beurt weer naar ver_random.php
Op ver_random word gekeken of flash (of jijzelf) de juiste waarde stuurt en checked of dat dus wel klopt met die sessie.
Als dat wel klopt, dan echod ver random een string terug naar flash waarmee flash die captcha opbouwt.
Ik heb in mn testfase (is dit ook nog steeds wel) natuurlijk een var_dump gezet op de index, en daar stond altijd een "oude" session, maw, flash roept die var_random aan en kan dus ook daar een sessie starten (de 2e sessie)
Ik heb met een HTTP sniffer de POST onderschept waarmee ik heel keurig "&input_var=wbklh7" in mijn sniffer te zien krijg. Ik weet niet of het onderdeel is van je test gebeuren, want dat volg ik niet helemaal, maar zorg dan even dat het zonder test is, maar hoe het er met uiteindelijk implementatie uitziet.
EDIT: Oh en btw, het was wel inderdaad de goede code, voor je daaraan twijfelt
EDIT2: @hierboven: Over het printscreen gebeuren, dat is heel fijn voor je, maar zolang jij die rechtermuisklik optie hebt, is het TOTAAL geen punt om dat eventjes stil te zetten. Een aantal muiskliks simuleren is voor een bot écht geen probleem, en dan heb je alsnog stilstaande characters, en de gehele code. Dat die achtergrond vervolgens draait is geen probleem natuurlijk.
Uiteindelijk is het voor ongerichte bots voorlopig inderdaad veilig. Die kijken waarschijnlijk naar de forms in een pagina en submitten daar troep naar toe.
Het wordt wel een probleem bij wat geavanceerdere bots, want dan is de kans inderdaad groot dat de code wordt onderschept. Op het moment kun je het gewoon gebruiken, lijkt me sterk dat je slachtoffer wordt van een gerichte aanval. Maar mocht dat wel het geval zijn, dan helpt een gewone captcha beter.
En over het weghalen van de rechtermuisoptie; dat is ook weer niet zo handig omdat het erg lastig is de code te volgen op die manier. Het is dan wellicht handig het geheel wat minder snel te laten knipperen, anders is de drempel te hoog. Dan is je CAPTCHA alsnog nutteloos, omdat het stelregel is dat hij niet te ingewikkeld moet zijn.
Jammer maar helaas dus
Bedankt voor jullie inzet en tijd @timmy_loots speciaal.
Het design en looks en gedoe van de captcha was maar een ruwe schets van wat het moest worden, dus qua duidelijkheid etc was nog een todo dingetje.
Het was mn bedoeling om een allround safe captcha te maken, maar die sniffer toestanden had ik totaal over het hoofd gezien, projectje is nu dus bullshit voor me geworden.
edit: ik ga even overleg plegen met de gasten die ook min of meer open stonden voor dit projectje, en als het hun niks uitmaakt, dan post ik de code hier die ik gebruikte.
edit2:
Voor de mensen die dit dus toch evt willen gebruiken
<?PHP
session_start();
error_reporting(E_ALL);
include("config.php");
$controleDing = (isset($_SESSION['randVar']) === false) ? md5(microtime()) : $_SESSION['randVar'] ;
$_SESSION['randVar'] = $controleDing;
if($_SERVER['REQUEST_METHOD'] == "POST")
{
if($_POST['code'] == $_SESSION['getal'])
{
$bericht = mysql_real_escape_string(htmlentities($_POST['bericht']));
if(empty($bericht))
{
$bericht = 'de captcha zei: '.mysql_real_escape_string(htmlentities($_SESSION['getal']));
}
mysql_query("INSERT INTO captcha (naam, bericht) VALUES ('".mysql_real_escape_string(htmlentities($_POST['naam']))."', '".$bericht."')") or die(mysql_error());
echo 'data opgeslagen<br />';
}
else
{
echo 'Fout<br />';
echo '<a href="javascript:history.back()>terug</a>';
}
}
else
{
?>
<form action="<?=$_SERVER['REQUEST_URI']?>" method="post">
<p><strong>Optioneel</strong> tis toch maar testzooi</p>
<p>naam<br />
<input name="naam" type="text" />
<br />
<br />
bericht<br />
<textarea name="bericht" cols="39" rows="10"></textarea>
</p>
<hr />
<br />
<p><strong>Verplicht</strong><br />
<span class="style2">Via rechtermuis op de swf kan je de swf laten stoppen met knipperen en alle letters zichtbaar maken, ik denk niet dat een bot dat zelf kan, maar als dat wel zou kunnen, dan sloop ik die functie er gewoon weer uit</span> </p>
<div id="captcha" style="width:100%; height:50px;">Zonder javascript enabled kunt u niet posten (als het goed is)<br />Zet javascript dus aan.<br />Als javascript al aanstaat, maar u ziet nog deze message, download dan de <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">gratis flashplayer</a> </div>
<script type='text/javascript'>
var so = new SWFObject('captcha.swf?checkOne=<?=$_SESSION['randVar']?>', 'captcha', '200', '50', '8');
so.addParam('allowScriptAccess', 'sameDomain');
so.addParam('quality', 'high');
so.addParam('scale', 'noscale');
so.addParam('loop', 'false');
so.write('captcha');
</script>
<br style="clear:both;"/>Neem bovenstaande code over <input name="code" type="text" />
<input name="save" type="submit" value="save" />
</form>
<?php
}
?>
</body>
</html>
<span class="style2">Via rechtermuis op de swf kan je de swf laten stoppen met knipperen en alle letters zichtbaar maken, ik denk niet dat een bot dat zelf kan, maar als dat wel zou kunnen, dan sloop ik die functie er gewoon weer uit</span> </p>
<div id="captcha" style="width:100%; height:50px;">Zonder javascript enabled kunt u niet posten (als het goed is)<br />Zet javascript dus aan.<br />Als javascript al aanstaat, maar u ziet nog deze message, download dan de <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">gratis flashplayer</a> </div>
<script type='text/javascript'>
var so = new SWFObject('captcha.swf?checkOne=<?=$_SESSION['randVar']?>', 'captcha', '200', '50', '8');
so.addParam('allowScriptAccess', 'sameDomain');
so.addParam('quality', 'high');
so.addParam('scale', 'noscale');
so.addParam('loop', 'false');
so.write('captcha');
</script>
<br style="clear:both;"/>Neem bovenstaande code over <input name="code" type="text" />