webForumDet fria alternativet

Bildvalidering för formulär?

PHPur PHP

10 svar · 1 216 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Hej alla glada!

Jag tänkte snickra ihop ett bildvalideringssystem som kan användas för att slippa spam via formulär. Är det någon som redan har gjort ett i PHP eller vet vart jag kan få tag på ett schysst?

Hade tänkt mig den där typen där ett par tecken slumpas fram i form av en bild. Man skriver in tecknen i ett fält och det jämförs sedan med t ex. samma värde hashat från ett hidden-fält.

Alla förslag tas tacksamt emot. Det är väl en GD-lösning som jag är ute efter antar jag.

Tackar för svar!
Mvh,

Medlem sedan okt. 20001 285 inlägg
#2

Jag har gjort det 2ggr .. men har ingen aning om var filerna ligger .. ska leta .. hinner nån annan före så ta det

Medlem sedan feb. 20034 441 inlägg
#3

Jag såg en tråd om det för inte så länge sen, tror det var här...

*letar efter kod...*

Oj, här är den:

<?php
session_start();
header("Content-type: image/png");
 
// Generera en 6-siffrig kod
$string = rand(100000, 999999);
 
// Spara koden i en session, används vid formulär valideringen
$_SESSION['sess_code'] = $string;
 
// Höjd, bred på bilden
$width = 82;
$height = 15;
 
// Storlek och position på typsnittet
$textsize = 20;
$angle = 0;   // Snedställ texten
$right = 0;   // Hur lång till höger skall texten vara?
$top = 19;   // Hur högt upp skall texten vara?
 
// Sätt höjden och bredden
$image = imagecreate($width, $height);
 
// Ange bakgrundsfärgen
$bg_color = imagecolorallocate($image, 0xed, 0xec, 0xf1);
 
// Typsnittets färg
$text_color = imagecolorallocate($image, 0x47, 0x58, 0x7c);
 
// Skriv ut bilden med den genererade koden.
ImageTTFText($image, $textsize, $angle, $right, $top, $text_color, 'arial.ttf', $string);
imagepng($image);
imagedestroy($image);
?>

Har inte satt mig in i koden, tror den kommer härifrån.
Kanske är en start iaf?

Medlem sedan okt. 20001 285 inlägg
#4

Här är regkey.php

<?php
// Generate regkey image
// Fuelman
if (empty($_GET['id'])) {
	die("ERROR! You cant access this page");
}
$confirm_id = $_GET['id'];
$confirm_id = htmlspecialchars($_GET['id']);

if (!preg_match('/^[A-Za-z0-9]+$/', $confirm_id)) {
	die("ERROR! Wrong confirm id");
}

header('content-type: image/jpeg');
header('cache-control: no-cache, no-store');

$img = imagecreatetruecolor(300, 60);
$font = 'timesi.ttf';
$text_color = imagecolorallocate($img, 255, 255, 255);
$bag_color  = imagecolorallocate($img, 255, 51, 51);
imagefill($img, 0, 0, $bag_color);
imagettftext($img, 34, 0, 20, 44, $text_color, $font, $confirm_id);
imagejpeg($img, '', 75);
imagedestroy($img);
?>

EDIT: hehe .. ser att du hann före

Medlem sedan nov. 20016 480 inlägg
#5

Funkade lysande. Fuels funkade säkert också men det andra var mer optimerat för mitt ändamål.

Nu har jag två små frågor till:

  1. Hur får man in en vald bakgrundsbild i stället för bakgrundsfärg i den koden? Är det imagecreatefrompng() som gäller?
  2. Hur räknar man ut sådana där färger? ex. (0x47, 0x58, 0x7c)

Tackar för svar!

Medlem sedan nov. 20016 480 inlägg
#6

Någon? :)

Medlem sedan juni 20006 031 inlägg
#7
  1. Går bra att använda rgb kod

t.ex för vit färg

imagecolorallocate($image, 255, 255, 255);
Medlem sedan nov. 20016 480 inlägg
#8

Tack. Det funkade. Har någon svar på 1:an också så blir tråden fulländad ;)

Min kod såg iaf ut så här när jag var färdig (förutsatt att man har en .ttf-fil att lägga till):

val.php

<?php
session_start(); 
header("Content-type: image/png"); 

// Generate a 5 number code --> 
$string = rand(10000, 99999); 

// Save code in session -->
$_SESSION['val_code'] = $string; 

// Image size -->
$width = 64; 
$height = 21; 

// Text settings -->
$textsize = 16;
$angle = 0; // Text angle
$right = 4; // Text position
$top = 18; // Text position
$font = 'Trebuchet MS.ttf'; // Path to font file

// Set image size -->
$image = imagecreate($width, $height); 

// Background color --> 
$bg_color = imagecolorallocate($image, 240, 240, 240); 

// Text color -->
$text_color = imagecolorallocate($image, 0, 45, 90); 

// Print image -->
ImageTTFText($image, $textsize, $angle, $right, $top, $text_color, $font, $string); 
imagepng($image); 
imagedestroy($image);
?>

Delar av check och formulär på formsidan:

if(isset($_SESSION['val_code']) && $_SESSION['val_code'] == $_POST['val']) {
  // rätt kod
} else {
  // fel kod
}

[...]

<input type="text" name="val" id="val" maxlength="5" />
<img src="val.php" style="width: 64px; height: 21px; border: none;" alt="val" />

r/ slarvfel

Medlem sedan juni 20006 031 inlägg
#9

Här har du ett kodexempel på hur du använder en bakgrundsbild

<?php 
header("Content-type: image/jpeg"); 
header("Content-Disposition: inline; filename=minbild.jpg");

$im = imagecreatefromjpeg('bilder/minbild.jpg'); 
$white = imagecolorallocatealpha($im, 255, 255, 255, 75);

$string = "Lite text här";

imagettftext($im, 14, 0, 10, 20, $white, "trebuc.ttf", $string); 

imagejpeg($im, '', 90); 
imagedestroy($im); 
?>
Medlem sedan nov. 20016 480 inlägg
#10

allright. tack. antog att man skulle använda imagecreatefrom*()

Medlem sedan sep. 200619 inlägg
#11

Kul och se att mitt gamla skript kommer till användning :)
http://www.phpportalen.net/viewtopic.php?p=366335#366335

134 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)