Gå til innhold

Sikkerhet i forms med php


Anbefalte innlegg

Hei,

 

Jeg har laget en forms med registrering, og der ønsker jeg en form for random sikkerhetsspørsmål som registrereren må svare riktig for å kunne blir registrert i databasen...

 

Noen som har anbefaling til hvordan jeg kan lage random spørsmål samt hvordan jeg validerer denne..?

 

 

Takk

Lenke til kommentar
Videoannonse
Annonse

Hva med å lage deg en table i databasen med spørsmål og svar, hent et tilfeldig spørsmål samt database id'en til det spørsmålet og send id'en sammen med med resten av verdiene som en "hidden value" i formet? Når du skal teste i "excecution" scriptet henter du svaret til det spørsmålet fra databasen ved å bruke id'n sendt sammen med form'et. Sjekk så om databasens svar er det samme som brukeren har skrevet (bruk enkle spørsmål og svar...) En bruker vil neppe fylle inn alle verdiene i registrerings-formet gjentatte ganger hvis han/hun svarer feil...

 

Evt, bruk et array i php med spørsmål og svar. Send id på samme måte med form'et til "excecution" scriptet.

 

Hvis du vil ha enda bedre sikkerhet kan du MD5'e id'en før den skrives til registrerings-formet. "Excecution" scriptet må da ha en liste over alle md5'er for så å sammenligne (evt. regne de ut i farten).

 

/Sygard.

Lenke til kommentar

Jeg forstår tankegangen din, og det er netop det jeg vil også..

 

Men hvordan henter jeg et tilfeldig spørsmål fra database og inn på formen..?

 

Jeg har bare en form med forskjellige input i en php fil, og selve insert to mysql databasen i en annen php fil.

 

 

		 
	  <form action='reg.php' method='post' name='form'>

	  Navn:<br>
	  <input name='name' type='text' size='30' maxlength='30'><br><br>

	  Email:<br>
	  <input name='email' type='text' size='30' maxlength='30'><br><br>

	  Brugernavn:<br>

	  <input name='brugernavn' type='text' size='30' maxlength='30'><br><br>

 

Et annet spørsmål: Hvordan kan jeg skjekke om en email adr allerede er registrert i databasen..?

Lenke til kommentar
Et annet spørsmål: Hvordan kan jeg skjekke om en email adr allerede er registrert i databasen..?

 

enkel måte å sjekke om epostadressen allerede er registrert på:

$sql = "SELECT epost FROM tabell WHERE epost='".$_POST['epost']."'";
if(mysql_num_rows(mysql_query($sql)) == 0) {
  echo "epost ikke registrert";
}
else {
  echo "epost er allerede registrert";
}

 

PS: ikke hugg hue av meg hvis dette er en tungvindt måte å gjøre det på og det finnes enklere måter ;)

Lenke til kommentar

beklager sent svar, lange dager...

 

OK, lagde en kjapp klasse for å gjøre det du ønsker.

 

<?php
/**
 * Created on Mar 18, 2008 by Sygard.
 *
 * Class for handling user submitted answers to a given question
 *
 */
class Qanda{
private $db_address;	// mysql db address (usually "localhost")
private $db_user;	// mysql username
private $db_pass;	// mysql password
private $db_base;	// mysql database
private $db_table;	// table wh
ere q and a are stored, 3 fields (id, question, answer)
private $db;		// database object

/**
 *	constructor
 *
 */
public function __construct(){
	$this->db_address = "localhost";
	$this->db_user = "%your db username%";
	$this->db_pass = "%your db password%";
	$this->db_base = "%your db database%";
	$this->db_table ="%your db table%";

	$this->db = mysql_connect($this->db_address,$this->db_user,$this->db_pass) or die ("Error connecting to database.");
	mysql_select_db($this->db_base,$this->db) or die ("Couldn't select the database.");

}

/**
 * function which returns a question and its id
 *
 *	@return array where [0] is the id and [1] is the question
 */
function getQuestionAndID(){
	$sql = "SELECT Qid, question FROM `$this->db_table` ORDER BY RAND()";
	$qry = mysql_query($sql, $this->db);
	$result = mysql_fetch_assoc($qry);

	$id = $result['Qid'];
	$question = $result['question'];

	//$q_and_id = array(array("id"=>"$result['Qid']"), array("question"=>"$row['question']"));
	$QandID = array($id, $question);

	return $QandID;

}
/**
 *	function for validation of user submitted answer
 *
 *	@param id		question id
 *	@param answer	user submitted answer
 *
 *	@return true if user has answered correctly
 */
function validateAnswer($id, $answer){
	$sql = "SELECT answer FROM `$this->db_table` WHERE Qid='$id'";
	$qry = mysql_query($sql, $this->db);
	$result = mysql_fetch_assoc($qry);

	if(strcasecmp($answer, $result['answer']) == 0)
		return true;
	else
		return false;
}
}
?>

 

Legg denne i egen fil som du kaller et eller annet lurt (jeg kalte den Qanda.php). Bruk den første funksjonen der du trenger et spørsmål samt id, og den andre der du trenger å sammenligne et brukergitt svar med et fasitsvar.

 

Du må bytte ut disse strengene med ditt oppsett:

%your db username%

%your db password%

%your db database%

%your db table%

 

Her er et eksempel på bruk:

<?php
require_once("Qanda.php");

/**
 *	code for getting a question with ID for use in form
 *
 */
$questionObject = new Qanda();
$resQO = $questionObject->getQuestionAndID();

// $resQO[0] is the id for this question
// $resQO[1] is the question isself
echo "Question ID : $resQO[0] <br/>Question : $resQO[1]";



/**
 *	code for answer validation in excecution script
 *
 */
$answerObject = new Qanda();
if($answerObject->validateAnswer("id recieved from POST", "answer recieved from POST"))
	echo "<p>Riktig!</p>";
else
	echo "<p>FEIL!</p>";

?>

 

 

Si ifra hvis du ikke får det til.

 

/Sygard.

 

edit: tabellen må forresten være på formen:

id = INT (primary, auto_increment)

question = text (jeg brukte MEDIUMTEXT)

answer = text (jeg brukte MEDIUMTEXT)

Endret av sygard
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...