Php - Szavazó program debuggolása
Sziasztok!!!
van egy szavazó scriptem amit saját kezüleg irtam és nem tom hogy hibátlanul fog müködni??:D
Ha találtok hibát szóljatok létszi.
köszönöm!!
■ van egy szavazó scriptem amit saját kezüleg irtam és nem tom hogy hibátlanul fog müködni??:D
Ha találtok hibát szóljatok létszi.
köszönöm!!
<?php
$result = mysql_query("SELECT * FROM szavazas where nick='kriszrap'");
$row = mysql_num_rows($result);
if(isset($_POST['felkuld']))
{
$sql = "INSERT INTO szavazas (id,nick,szavazas,datum) VALUES ('','krisz','".$_POST['szavaz']."',now())";
$query = mysql_query($sql) or die ("Valami baj van az adatbázissal.");
}
$result2 = mysql_query("SELECT * FROM szavazas");
$szamol = mysql_num_rows($result2);
while($row2 = mysql_fetch_array($result2)){
if($row2['szavazas'] == 1)
{
$jo++;
}
if($row2['szavazas'] == 2)
{
$elmegy++;
}
if($row2['szavazas'] == 3)
{
$Lehet_volna_jobb_is++;
}
if($row2['szavazas'] == 4)
{
$rossz++;
}
}
print $jo."jó<br>";
print $elmegy."elmegy".'<br>';
print $Lehet_volna_jobb_is."Lehet volna jobb is".'<br>';
print $rossz."rossz".'<br>';
$osszeg = $elmegy+$jo+$Lehet_volna_jobb_is+$rossz;
$osztva = 100/$osszeg;// 100% a maximum érték
print floor($osztva*$jo).'<br>';
print floor($osztva*$elmegy).'<br>';
print floor($osztva*$Lehet_volna_jobb_is).'<br>';
print floor($osztva*$rossz);
?>
Miért nem próbálod ki
- nincs mysql connect (legalábbis nem szúrtad be). Ezzel a kóddal, anélkül nem jutsz messzire.. :)
- Poetro úgyis szólni fog :), de: sql utasításba, közvetlenül SOSEM TESZÜNK REQUEST PARAMÉTERT(!), mert így csak megkönnyítjük a támadók munkáját (sql injection), az pedig nem cél. Használd a mysql_real_escape_string függvényt a károskódrészletek kiszűrűsére.
- A dátumot (létrehozás dátuma, módosítás dátuma), én automatikusan töltetem ki az adatbázissal, így azt csak kiszednem kell és esetleg formázni.
A működési logikát nem néztem.
SQL injection
ajj
Javaslok:
1, notice hibaüzenetek kapcsold be, és amire síkit azokat javítsd ki!
2, == helyett amikor csak "lehet" akkor használd === -ot
3, mysql_* függvénnyek helyett használd a PDO-t (beépített a PHP-ban)
4, gondold át azt a sok változott. $jo, $elmegy, $Lehet_volna_jobb_is, $rossz...
5, PHP-t és a HTML-t válaszd szét
ironwill írta de mégegyszer:
+1, SQL injectionnek sürgősen nézz utána. és védd le!
Javaslom ismerkedj meg az
mysql_real_escape_string
köszönöm a tanácsokat:)
Ideje lenne a mysql_
Tanuld meg vagy a mysqli, vagy a PDO használatát, különös figyelemmel a Prepared statements témakörére. Én a PDO-t javaslom. Emberek vagyunk, hibázunk, sokszor elfelejtettünk már eszképelni és el is fogunk - elég nagy árat lehet fizetni érte. Jobb inkább kikerülni a problémát, a Prepared statements ebben segít.
Mint ahogy a többiek is írják, sokmindent lehetne javítani a kódon, de ezen hiányosságok nagyrésze csak rosszabb minőségű kódot és karbantarthatatlanságot, a hibák nehezebb felderíthetőségét okozza. Az SQL injection sokkal nagyobb baj.
Állj át és ne nézz vissza :).
ui.: most látom, hogy ez rohadt régi topik, node sebaj. A probléma még ma is fennáll sajnos, ha egyvalaki rátalál erre, és a fejére csap, hogy mit tettem, már megérte :).
Ellenvélemény
- Az eszképelés elmulasztásának védelmére más eszközök is vannak, mint pdo-drivert használni (pl. saját v. framework osztályon keresztül "MySql-ezni");
- A MySql-nek van egy-két plussz szolgáltatása a pdo-hoz képest, pl. elég egyszerű backup-ot készíteni az adatbázisodról.
Ezzel persze nem akarom azt mondani, hogy "igenis használj MySql-t", csak kicsit kontrázom a (szerintem) túl egyoldalú véleményt.
Obviózus dolgokról nem
Egy kezdő kezébe meg inkább adja az ember azt az eszközt, amivel kisebb galibát tud okozni. Ezért gáz, hogy a netes tutorialok jelentős része még mindig mysql_ függvényekkel nyomul.
Eredmény:
miegymás
<img src="kepek/1.jpg" width="20%" ><input type="checkbox" name="egy" id='egy' ><br>
<img src="kepek/2.jpg" width="20%"><input type="checkbox" name="ketto" id='ketto' ><br>
<img src="kepek/3.jpg" width="20%" ><input type="checkbox" name="harom" id='harom'><br>
<input type="submit" value="Szavazat elküldése!">
</form>
<?php
$kapcsolat=mysql_pconnect("localhost","root","");
if (!$kapcsolat)
{$dbhiba=mysql_error();
return false;}
if (!mysql_select_db('szavazas', $kapcsolat))
{$dbhiba=mysql_error();
return false;}
if ($_POST['egy']){
$parancs="INSERT INTO szav (egy) VALUES ('egy')";
if (mysql_query($parancs, $kapcsolat)){print "Sikeresen szavaztál!";}}
if ($_POST['ketto']){
$parancs="INSERT INTO szav (egy) VALUES ('ketto')";
if (mysql_query($parancs, $kapcsolat)){print "Sikeresen szavaztál!";}}
if ($_POST['harom']){
$parancs="INSERT INTO szav (egy) VALUES ('harom')";
if (mysql_query($parancs, $kapcsolat)){print "Sikeresen szavaztál!";}}
?>
<br><a href="allas.php">A szavazás állásának megtekintése!</a>
<?php
$kapcsolat=mysql_connect("localhost","root","");
if (!$kapcsolat)
{$dbhiba=mysql_error();
return false;}
if (!mysql_select_db('szavazas', $kapcsolat))
{$dbhiba=mysql_error();
return false;}
$sql = "SELECT egy FROM szav WHERE egy='egy' ";
$result = mysql_query($sql);
echo "Első kép: ". mysql_num_rows($result)."<br>";
$sql2 = "SELECT egy FROM szav WHERE egy='ketto' ";
$result2 = mysql_query($sql2);
echo "Második kép: ".mysql_num_rows($result2)."<br>";
$sql3 = "SELECT egy FROM szav WHERE egy='harom' ";
$result3 = mysql_query($sql3);
echo"Harmadik kép: ". mysql_num_rows($result3)."<br>";
?>
<SCRIPT LANGUAGE="JavaScript">
function uresmezo(mezo){
if (mezo.value != "") return true;
else{
alert("A(z) "+ mezo.name +" mező üres!");
return false;
}
}
function email(mezo){
var szoveg = mezo.value;
if (!(szoveg.indexOf('@')>0 && szoveg.indexOf('@')<szoveg.length-1)){
alert("Rossz e-mail cím!");
return false;
}
else return true;
}
function teszt(adat,minta){
for (var i=0; i<adat.length; i++)
if (minta.indexOf(adat.charAt(i)) == -1)
return false;
return true;
}
function numerikusCheck(mezo){
if (!uresmezo(mezo)) return false;
if (!teszt(mezo.value,"1234567890")){
alert("Ez nem numerikus érték!");
return false;
}
else return true;
}
function tartalmaz(adat,minta){
for (var i=0; i<adat.length; i++)
if (minta.indexOf(adat.charAt(i)) != -1)
return true;
return false;
}
function telefon(mezo){
if (!uresmezo(mezo)) return false;
if (!teszt(mezo.value,"1234567890()/- ") || !tartalmaz(mezo.value,"1234567890")){
alert("Ez nem jó telefonszám!");
return false;
}
else return true;
}
function ellenoriz(){
if (uresmezo(document.form.nev) && numerikusCheck(document.form.kor) &&
telefon(document.form.telefon) && email(document.form.email)){
// document.write("<?php include('reg.php'); ?>");
return true;
}
else return false;
}
</SCRIPT>
</head>
<body>
<FORM NAME="form" method="POST" action="reg.php" onSubmit="return ellenoriz()">
<table>
<tr>
<td align="right">Név:</td>
<td><INPUT TYPE="text" NAME="nev" SIZE="20"></td>
</tr>
<tr>
<td align="right">Kor:</td>
<td><INPUT TYPE="text" NAME="kor" SIZE="20"></td>
</tr>
<tr>
<td align="right">Telefonszám:</td>
<td><INPUT TYPE="text" NAME="telefon" SIZE="20"></td>
</tr>
<tr>
<td align="right">E-mail cím:</td>
<td><INPUT TYPE="text" NAME="email" SIZE="20"></td>
</tr>
<tr>
<td align="right"> </td>
<td><INPUT TYPE="submit" VALUE="Regisztráció!"></td>
</tr>
</table>
</FORM>
</body>
</html>
<script language="javascript">
maxkepszam=9;
sorszam=1;
index=1;
function nagy_frissit(szam){
document.nagy.src=+(sorszam+szam)+".jpg";
index=sorszam+szam;
}
function frissit(sorszam){
document.kep1.src=(sorszam)+".jpg";
document.kep2.src=(sorszam+1)+".jpg";
document.kep3.src=(sorszam+2)+".jpg";
document.kep4.src=(sorszam+3)+".jpg";
document.kep5.src=(sorszam+4)+".jpg";
}
function jobbnyilfrissit(fajlnev){
document.kepjobb.src=fajlnev;
}
function balnyilfrissit(fajlnev){
document.kepbal.src=fajlnev;
}
function frissi(sorszam){
document.nagy.src=(sorszam)+".jpg";
}
function jobbnagyfrissit(fajlnev){
document.jobbnyil.src=fajlnev;
}
function balnagyfrissit(fajlnev){
document.balnyil.src=fajlnev;
}
</script>
</head>
<body>
<img src="kepek/regi.jpg" width="1000px" height="1000px"/>
<div id="menu12">
<ul>
<li> <a href="felhasznalo.php"> Kezdőlap</a></li>
<li> <a href="uzenetkuldes.php"> Kapcsolat</a></li>
<li> <a href="galeria.php"> Galéria </a> </li>
<li> <a href="szavazo.php"> Szavazás</a></li>
<li> <a href="kijelentkezes.php"> Kijelentkezés</a></li>
</ul>
<div id="galeria">
<center><h1>Galéria</h1><center>
<table align="center" width="100%" border="0">
<a href="javascript:
if(sorszam>1){sorszam=sorszam-1;frissit(sorszam)};
if(sorszam<2){balnyilfrissit('bal_off.gif')};
jobbnyilfrissit('jobb_on.gif')">
<img src="bal_off.gif" name=kepbal border=0></a>
<img src="1.jpg" width="10%"name=kep1 onMouseOver=nagy_frissit(0);>
<img src="2.jpg" width="10%"name=kep2 onMouseOver=nagy_frissit(1);>
<img src="3.jpg" width="10%"name=kep3 onMouseOver=nagy_frissit(2);>
<img src="4.jpg" width="10%"name=kep4 onMouseOver=nagy_frissit(3);>
<img src="5.jpg" width="10%"name=kep5 onMouseOver=nagy_frissit(4);>
<a href="javascript:
if(sorszam<maxkepszam-4){sorszam=sorszam+1;frissit(so
rszam)}
if(sorszam>maxkepszam-5){jobbnyilfrissit('jobb_off.gi
f')};
balnyilfrissit('bal_on.gif')">
<img src="jobb_on.gif"name=kepjobb border=0></a><br>
<img src="1.jpg"name=nagy width="25%" onMouseOver=document.nagy.title=szoveg[index]>
<form action="uzenetkuldes.php" method="POST">
<td>
<table width="20%" border="0" cellspacing="0" cellpadding="10">
<tr>
<td> <form action="kapcsolat.php" method="POST">
<table width="500" cellspacing="0" border="0" cellpadding="3" align="center">
<tr>
<td align="right"><font color="black"> Név: </td>
<td> <input type="text" name="name" maxlength="255" value=""> </td>
</tr>
<tr>
<td align="right"> <font color="black"> Tárgy: </td>
<td> <input type="text" name="theme" maxlength="255" value=""> </td>
</tr>
<tr>
<td align="right"><font color="black"> E-mail: </td>
<td> <input type="text" name="email" maxlength="255" value=""> </td>
</tr>
<tr>
<td colspan="2" align="center"> <textarea name="message" id="uzen" cols="50" rows="6" tabindex="2" ></textarea> </td>
</tr>
<tr>
<td colspan="2" align="center"> <input type="submit" name="submit" value="Elküld" id="regigomb"> </td>
</tr>
</table>
</form>
</center>
</div>
<div id="szoveg123">
<center>
<h1>Üzenetküldés</h1>
</center>
<?php
if (isset($_POST['submit'])) {
if ($_POST['name'] == NULL) {
echo "<div id='hibakuldes'>Nem adtál meg nevet!</div>";
} else if ($_POST['theme'] == NULL) {
echo "<div id='hibakuldes'>Nem adtál meg tárgyat!</div>";
} else if ($_POST['email'] == NULL) {
echo "<div id='hibakuldes'>Nem adtál meg e-mailt!</div>";
} else if ($_POST['message'] == NULL) {
echo "<div id='hibakuldes'>Nem irtál üzenetet!</div>";
} else {
echo "<div id='sikerkuldes'>Sikeresen elküldtük az üzeneted!</div>";
$name = ($_POST['name']);
$theme = ($_POST['theme']);
$email = ($_POST['email']);
$message = ($_POST['message']);
mail('valaki##kukac##gmail.com', '$theme', '$name, $email, $message', 'From:localhost');
}
}
?>
<?php
if ( !empty($_REQUEST['nev']) &&
!empty($_REQUEST['kor']) &&
!empty($_REQUEST['email'])&&
!empty($_REQUEST['telefon'])
){
$dbhiba="";
$vissza = adatbazis_bovit($_REQUEST['nev'],
$_REQUEST['kor'],
$_REQUEST['email'],
$_REQUEST['telefon'],
$dbhiba);
if (!$vissza)
{print $dbhiba;}
else {print "<h2 alignt='center'>"."Sikeres Regisztráció!"."<h2>";}
}
function adatbazis_bovit($nev, $kor, $email, $telefon, &$dbhiba)
{
$nev=mysql_real_escape_string($nev);
$kor=mysql_real_escape_string($kor);
$email=mysql_real_escape_string($email);
$telefon=mysql_real_escape_string($telefon);
$kapcsolat=mysql_pconnect("localhost","root","");
if (!$kapcsolat)
{$dbhiba=mysql_error();
return false;}
if (!mysql_select_db('users', $kapcsolat))
{$dbhiba=mysql_error();
return false;}
$parancs="INSERT INTO adatok (nev, kor, email, telefon) VALUES ('$nev','$kor','$email','$telfon')";
if (!mysql_query($parancs, $kapcsolat)){$dbhiba=mysql_error(); return false;}
return true;
}
?>
Ez egyre szebb :D
Lehet, hogy csak
mysql_pconnect
mysql_pconnect
, mert nem megfelelő beállítások mellett meg lehet vele fektetni az adatbázis szervert azzal, hogy elfogynak a megnyitható kapcsolatok. Legalábbis jó pár éve nekem sikerült elérnem, hogy csak a root tudta lelőni az összes megnyitott kapcsolatot, mivel más már nem tudott hozzá kapcsolódni.Nyitott szem
Lehet, hogy én vagyok türelmetlen, de meg sem próbáltam...
Én sem.
Ha nem szóltok, még
Sok pénzt kéne fizetni ahhoz,
A mysql_ függvényekkel