abonnement Unibet Coolblue Bitvavo
  dinsdag 7 november 2006 @ 16:14:38 #121
71919 wonderer
Hung like a My Little Pony
pi_43327427
Om SQL injection te voorkomen, doe ik

$ID=settype($id,"int");

zodat alles dat geen nummer is, eruit wordt gefilterd. $id is de variabele die in de functie wordt ingevoerd (geen userinput, maar als ik het mezelf zo kan aanleren, kan het vast geen kwaad). $id gaat er nu al 46329 in en komt er al 1 uit. Da's natuurlijk niet de bedoeling. Waar ligt dat aan, en hoe fix it het?

edit: nevermind, php.net niet goed gelezen

[ Bericht 8% gewijzigd door wonderer op 07-11-2006 16:22:48 ]
"Pain is my friend. I can trust pain. I can trust pain to make my life utterly miserable."
"My brain is too smart for me."
"We don't need no education." "Yes you do, you just used a double negative."
pi_43333068
Ik ben op dit moment bezig om een serie functies te schrijven die mij gaan helpen om op een hele makkelijke manier formulieren te maken, controleren/valideren en verwerken.
Nu kun je op google een heleboel achtergrond informatie vinden maar de meeste teksten zijn nogal basis en verklappen hier en daar en klein intressant detail, maar 90-95% van alle informatie weet ik al.
Heeft er iemand een écht goeie tutorial die precies aangeeft welke functies belangrijk zijn om je form te valideren?

En wat ik ook graag wil weten, hoe kun je het beste controleren of een formulier ook écht door jou webserver is verstuurd? Met spoofing kunnen ze een hoop headers veranderen las ik ergens dus dat is niet echt wat ik zoek. Is een random value aanmaken in een hidden input en die controleren met een session een veilige en goede methode?

Andere hints en tips zijn ook welkom.

Ohja, ik weet dat er een dergelijk systeem al bestaat in PEAR maar dat is heel erg uitgebreid en ik heb er even naar gekeken maar ik snap ook niet echt goed hoe die alles hebben gedaan. Ik doe het liever zelf, dat ik er ondertussen nog van leer ook.

Het belangrijkste is dus voor mij, hoe maak ik mijn formulieren veiliger?
-
pi_43333297
Het belangrijkste voor jou is: hoe maak je de verwerking van de gegevens uit de formulieren veiliger.
pi_43333328
Yup dat klopt beter, en is metteen een leuke samenvatting van dat hele verhaal.
-
pi_43336760
Het verhaal
Er was eens een tabel met daarin 1,1 miljoen achternamen. Bijvoorbeeld 'Janssen' en 'van der Laan'. Nu wordt er gezocht met een query:

1SELECT * FROM Achternamen WHERE Achternaam LIKE '%Jan%' OR Achternaam LIKE '%Laan%'


Op deze manier worden dus de achternamen 'Janssen' en 'van der Laan' gevonden. Deze tabel doorzoeken met slechts 100 (oid) records er in gaat goed en snel, maar 1.1 miljoen is toch een ander verhaal.

Doordat er een % voor het zoekwoord geplaatst wordt, kan MySQL de index op het Achternaam-veld niet gebruiken, omdat niet duidelijk is waarmee het te zoeken woord begint (% betekend 0 of meer willekeurige tekens). Dit eerste % teken weglaten

1SELECT * FROM Achternamen WHERE Achternaam LIKE 'Jan%' OR Achternaam LIKE 'Laan%'


zou 'Janssen' wel vinden maar 'van der Laan' niet, omdat de achternaam niet met 'Laan' begint.

Oke oplossen met een full-text index zou kunnen, maar helaas kan/mag/whatever ik deze niet gebruiken.

Andere manier dus
Ik heb twee tabellen gemaakt:

1
2
AchternaamDeel(ID,Deelnaam)
AchternaamDeelLink(Achternaam_ID,AchternaamDeel_ID)


Ik splits de achternamen op: 'Janssen' blijft 'Janssen' en 'van der Laan' wordt opgedeeld in 3 stukken: 'van' 'der' en 'Laan'.

Deze deelnamen worden in de AchternaamDeel tabel opgeslagen, en in de AchternaamDeelLink tabel worden de deelnamen gelinkt met Achternaam_ID, die verwijst naar de Achternamen tabel waar de achternaam in oorspronkelijke vorm is opgeslagen.

We zoeken hierin met:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT * FROM Achternamen WHERE ID IN 
(
   SELECT
      AchternaamDeelLink.Achternaam_ID
   FROM
      AchternaamDeelLink
   LEFT JOIN
      AchternaamDeel 
   ON
      AchternaamDeelLink.AchternaamDeel_ID=AchternaamDeel .ID
   WHERE   
      AchternaamDeel.Deelnaam LIKE 'Jan%' OR
      AchternaamDeel.Deelnaam LIKE 'Laan%'
   GROUP BY
      AchternaamDeelLink.Achternaam_ID
   ORDER BY
      COUNT(AchternaamDeelLink.Achternaam_ID) DESC
   
)

(Met de score bereken ik welke het meest overeenkomt met de zoektermen)

Damn! dat werkt tegenover de andere manier retesnel (13 sec tegenover > 1 minuut)! Maar toch niet snel genoeg... Ik wil bijvoorbeeld per pagina slechts 10 achternamen afbeelden, maar een LIMIT is niet in de subquery te plaatsen omdat MySQL (5) dan klaagt dat die functie niet geimplementeerd is. Deze limit moet dus bij de buitenste query, wat betekend dat voor de subquery wel alle resultaten worden opgehaald.

Ik heb verder de benodigde indexen aangemaakt, maar zoals hieronder uit de EXPLAIN van MySQL blijkt, wordt er nogsteeds een trage filesort gebruikt.

12   DEPENDENT SUBQUERY   AchternaamDeel   range   PRIMARY,AchternaamDeel   AchternaamDeel   32   N   55   Using where; Using temporary; Using filesort


Iemand een idee hoe ik dit verder kan optimaliseren? (Of pak ik het verkeerd aan?)
pi_43344267
quote:
Op dinsdag 7 november 2006 19:05 schreef splendor het volgende:

En wat ik ook graag wil weten, hoe kun je het beste controleren of een formulier ook écht door jou webserver is verstuurd? Met spoofing kunnen ze een hoop headers veranderen las ik ergens dus dat is niet echt wat ik zoek. Is een random value aanmaken in een hidden input en die controleren met een session een veilige en goede methode?
Volgens mij bestaat er geen waterdicht methode om dat te controleren. Maar als je alles goed controleert is dat niet echt een issue.

Overigens heb je sinds php 5.2 Input filtering. Misschien kan je inspiratie opdoen door daar eens een kijkje naar te nemen.
..///
pi_43349435
quote:
Op vrijdag 3 november 2006 23:36 schreef Chandler het volgende:
Weet iemand een goed script dat excel sheets kan uitlezen in php, ik heb er wat gevonden maar ze konden allemaal (behalve hele dure) niet overweg met &#tekens...

Weet iemand een goed script? google had veel maar helaas niet wat ik zocht (gratis , of ongv 10 euro oid)


Nu ben ik zelf even opzoek gegaan en heb aardig informatie gevonden over excel com. En met wat voorbeelden heb ik het volgende gemaakt.
[ code verwijderd ]

echter als ik het bestand uitlees krijg ik nog steeds vage teksten! wat is de inhoud dan zou je je afvragen!?

Rij A - Nederlandse tekst (arial)
Rij C - Thaise tekens (Angsana New)
Rij E - Engelse tekst (arial)

Maar als ik het uitlees krijg ik het volgende te zien.

[afbeelding]

Oftewel ik lees iets niet goed uit, volgens mij moet ik ergens nog kunnen instellen welk karakterset ik wil gebruiken... maar dat kan ik dus niet vinden liefst zou ik gewoon alle teksten van een cel in &# codes willen hebben maar goed.

Dit moet de uitkomst zijn ongv.

[afbeelding]

Iemand een idee
The people who lost my respect will never get a capital letter for their name again.
Like trump...
pi_43349587
quote:
Op woensdag 8 november 2006 08:03 schreef Chandler het volgende:

[..]

Iemand een idee
Daar zal iets fout gaan met encoding of de charset of iets dergelijks. Waarschijnlijk krijg je unicode binnen uit excel. Stuur je wel de goede headers? Gebruik je htmlspecialchars()?
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
  FOK!-Schrikkelbaas woensdag 8 november 2006 @ 08:47:51 #129
1972 Swetsenegger
Egocentrische Narcist
pi_43349883
quote:
Op dinsdag 7 november 2006 19:05 schreef splendor het volgende:

En wat ik ook graag wil weten, hoe kun je het beste controleren of een formulier ook écht door jou webserver is verstuurd? Met spoofing kunnen ze een hoop headers veranderen las ik ergens dus dat is niet echt wat ik zoek. Is een random value aanmaken in een hidden input en die controleren met een session een veilige en goede methode?
Dat is min of meer het idee achter een captcha.
Ik genereer een unieke code. Die unieke code plaats ik in een sessie en op beeld als een image. De gebruiker moet vervolgens de code die op het beeld staat overtikken als hij het formulier invult. Alsna de submit ($_POST['captcha'] != $_SESSION['captcha']) { die('spammert');}
pi_43350467
me php boek is opgestuurd
ben benieuwd
  FOK!-Schrikkelbaas woensdag 8 november 2006 @ 09:29:27 #131
1972 Swetsenegger
Egocentrische Narcist
pi_43350540
quote:
Op woensdag 8 november 2006 09:25 schreef mschol het volgende:
me php boek is opgestuurd
ben benieuwd
Welk boek?
pi_43350703
quote:
Op woensdag 8 november 2006 08:19 schreef SuperRembo het volgende:

[..]

Daar zal iets fout gaan met encoding of de charset of iets dergelijks. Waarschijnlijk krijg je unicode binnen uit excel. Stuur je wel de goede headers? Gebruik je htmlspecialchars()?
Sr, htmlspecialchars werkt helaas niet... krijg dezelfde output. en goede headers stuur ik inderdaad niet. Heb namelijk geen idee welke ik moet sturen die zowel gewone karakters als thaise karakters ondersteunen...
The people who lost my respect will never get a capital letter for their name again.
Like trump...
pi_43350728
quote:
Op woensdag 8 november 2006 09:29 schreef Swetsenegger het volgende:

[..]

Welk boek?
deze
  woensdag 8 november 2006 @ 09:53:57 #134
85514 ralfie
!Yvan eht nioj
pi_43350999
quote:
Op dinsdag 7 november 2006 20:31 schreef GVRuud het volgende:
heel verhaal
Je kunt natuurlijk ook de manier gebruiken die veel officiele instanties gebruiken
achternaam, tussenvoegsels

als in

Laan, van der
Jansen

Het wordt iets moeilijker om bijv 'van der Laan' te zoeken (dit zul je met php om moeten bouwen) maar verder denk ik dat het een goed alternatief is.
pi_43351932
Kleine vraag, ben nu bezig met een MYSQL class. Dit omdat bepaalde zaken gemakkelijker kunnen in php scripts. Echter wil ik deze class ook binnen andere functies in het globale script gebruiken. Nu moet ik echter voor ieder functie $mysql (de gestarte class) meegeven. Is er ook een andere manier zodat ik niet voor iedere lokale functie $mysql hoef mee te geven?

Tnx..

vb.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
class MySQL
{
    var
$db;

    function
connect()
    {
       
// connect
    
}

    function
do_query($sql)
    {
        
// doe de query...
    
}
}

function
testA()
{
     
$query = $mysql->run_query("QUERY");
}

function
testB($mysql)
{
     
$query = $mysql->run_query("QUERY");
}

$mysql = new MySQL;

$mysql->connect();

testA();
testB();
?>


testA werkt niet, testB wel.... somebody?
The people who lost my respect will never get a capital letter for their name again.
Like trump...
  woensdag 8 november 2006 @ 14:15:24 #136
85514 ralfie
!Yvan eht nioj
pi_43358052
Je kunt $GLOBALS['mysql'] gebruiken, of in elke functie 'global $mysql;' zetten, om de globale variabele aan te spreken.

Andere tip:
Je kunt mysql->connect() beter als constructor maken. Mocht je dat niet kennen, Constructors zijn functies die automatisch aangeroepen worden als een object gemaakt wordt
1
2
3
4
5
6
<?php
class MySQL {
function
__construct(){
mysql_connect($bla,$blaa,$blaa) or die("couldnt get database");
}
?>

wanneer je nu $x=new MySQL; doet, zal __construct() aageroepen worden (bij <php 5 heeft de constructor de naam van het object zelf (in dit geval 'function MySQL()' ). Scheelt weer een regel.
pi_43359334
@ralfie.. ah, ik had er wel wat overgehoord maar had de klepel nog niet zien hangen Die construct is inderdaad erg handig! maar dacht dat $GLOBALS nogal vies was om mee te coden of mag dat tegenwoordig wel weer

Maaruh nog iets over die construct! Indien je die gebruikt voor bv connecten, dan moet je toch alle gegevens continue in het script zelf hardcoden (username/pass/etc!?) En dat wil ik dus buiten deze class houden

[ Bericht 24% gewijzigd door Chandler op 08-11-2006 15:15:42 ]
The people who lost my respect will never get a capital letter for their name again.
Like trump...
  woensdag 8 november 2006 @ 21:51:22 #138
85514 ralfie
!Yvan eht nioj
pi_43375187
quote:
Op woensdag 8 november 2006 14:53 schreef Chandler het volgende:
@ralfie.. ah, ik had er wel wat overgehoord maar had de klepel nog niet zien hangen Die construct is inderdaad erg handig! maar dacht dat $GLOBALS nogal vies was om mee te coden of mag dat tegenwoordig wel weer

Maaruh nog iets over die construct! Indien je die gebruikt voor bv connecten, dan moet je toch alle gegevens continue in het script zelf hardcoden (username/pass/etc!?) En dat wil ik dus buiten deze class houden
$GLOBALS schijnt beter te zijn zelfs als een variabele global declareerd, omdat er dan opnieuw iets gedeclareert wordt en $GLOBALS al bestaat. Andere methoden om globalen aan te spreken ken ik niet.

De mysql_connect() was ter voorbeeld, je kunt hem ook zonder argumenten aanroepen zoals jij deed in je code
pi_43375743
quote:
Op woensdag 8 november 2006 14:15 schreef ralfie het volgende:

Andere tip:
Je kunt mysql->connect() beter als constructor maken. Mocht je dat niet kennen, Constructors zijn functies die automatisch aangeroepen worden als een object gemaakt wordt
[ code verwijderd ]

wanneer je nu $x=new MySQL; doet, zal __construct() aageroepen worden (bij <php 5 heeft de constructor de naam van het object zelf (in dit geval 'function MySQL()' ). Scheelt weer een regel.
Niet helemaal mee eens. Als je een class mysql maakt dan zou die voor verschillende projecten bruikbaar moeten zijn. En dat beperk je weer als je in de class zelf usernames en passwords enzo gaat zetten. Maar een constructor is natuurlijk ook een functie en kan ook parameters accepteren. Als je daar dingen voor username en password bjizet kun je die doorgeven naar de connect functie en kun je wel je configuratie centraal houden.
pi_43382339
Correct, al heb ik amper ooit meerdere databases moeten gebruiken maar goed . Daarvoor is het inderdaad handiger om de username ed in een appart bestand/variabel(en) te houden
The people who lost my respect will never get a capital letter for their name again.
Like trump...
pi_43384354
Hallo! Ik heb een vraagje.

Het is simpel om random iets uit een database te poepen met RAND(), maar wat nou als ik dat uit 3 verschillende databases tabellen wil doen? Dus:

- 'text' ophalen uit tabel 'bla'
- 'titel' ophalen uit tabel 'bla2'
- 'nogiets' ophalen uit tabel 'bla3'

Met RAND() maak ik dat ik uit tabel 'bla' random 'text' pak en dat in $text zet. Maar ik wil dus dat hij dat random doet uit alle tabellen.

Ik zat te denken om drie queries uit te voeren, dat in een array of string te gooien, en dan een ander scriptje gebruiken om daar weer van te kiezen. Maar dat leek mij heel omslachtig, ik denk tenminste dat dat handiger kan. Dit bevorderd ook niet eens de snelheid.

Het idee is namelijk dat ik een radiostream op Internet heb, en dat ik daar iedere 20 seconden met een cronjobje de titel van wil veranderen (de ene keer een nieuwstitel, de andere keer het weerbericht, weer de andere keer wat er op dat moment speelt).

Alvast bedankt voor tips/voorbeelden!
dit
is
mijn
signature.
pi_43391855
Een klein vraagje:

ik heb een dropdownbox:

1
2
3
4
5
6
7
8
<select name="requiredsoortklant" id="requiredsoortklant" tabindex="25">
            <?php 
      $result = mysql_query("SELECT * FROM `soortklant` ORDER BY `Naam` ASC"); 
           while (list($Naam) = mysql_fetch_row($result)){ 
           echo ("<option value=$Naam>$Naam</option>n");
         }
      ?>
        </select>


die gevuld wordt met waardes uit een tabel

Vervolgens kan je er een kiezen en deze door POST toevoegen in een ander tabel. Probleem is echter als er een waarde in zit waar een spatie in zit zoals "Albert Hein" dan wordt alleen "Albert" opgeslagen in de tabel. Hoe krijg ik dit opgelost ? anyone ?
It's time to kick ass and chew bubble gum... and I'm all out of bubble gum
pi_43392044
quote:
Op donderdag 9 november 2006 05:51 schreef RiderXXX het volgende:
Het is simpel om random iets uit een database te poepen met RAND(), maar wat nou als ik dat uit 3 verschillende databases tabellen wil doen?
Je kunt dat op dezelfde manier doen als je joinet:
1
2
3
4
5
6
SELECT t1.text, t2.naam, t3.etc
FROM tabel1 t1
LEFT JOIN tabel2 t2 ON t1.t2id = t2.id
LEFT JOIN tabel3 t3 ON t2.t3id = t3.id
ORDER BY RAND()
LIMIT 0, 3

Als de tabellen niet aan elkaar gerelateerd zijn kun je met subqueries werken.

Zoals ik in een aantal posts geleden opmerkte, MySQL werkt niet optimaal met ORDER BY RAND(). Als je heel veel records hebt kunnen de queries langzamer gaan werken, heb je er niet zo heel veel dan maakt het niets uit.
pi_43392113
quote:
Op donderdag 9 november 2006 12:58 schreef Xtr3mE het volgende:
Een klein vraagje:

ik heb een dropdownbox:
[ code verwijderd ]

die gevuld wordt met waardes uit een tabel

Vervolgens kan je er een kiezen en deze door POST toevoegen in een ander tabel. Probleem is echter als er een waarde in zit waar een spatie in zit zoals "Albert Hein" dan wordt alleen "Albert" opgeslagen in de tabel. Hoe krijg ik dit opgelost ? anyone ?
In (X)HTML moet je altijd de waarden van attributen omgeven door aanhalingstekens. Dus like that:
1           echo ("<option value=\"" . htmlentities($Naam) . "\">" . htmlentities($Naam) . "</option>n");

De htmlentities() is er om dingen als aanhalings naar & quot; om te zetten e.d.
pi_43394174
thx voor je reply volgens mij heb je de code nog aangepast want eerst kreeg ik een foutmelding
maar nu wel oke
It's time to kick ass and chew bubble gum... and I'm all out of bubble gum
pi_43395902
quote:
Op woensdag 8 november 2006 08:47 schreef Swetsenegger het volgende:

[..]

Dat is min of meer het idee achter een captcha.
Ik genereer een unieke code. Die unieke code plaats ik in een sessie en op beeld als een image. De gebruiker moet vervolgens de code die op het beeld staat overtikken als hij het formulier invult. Alsna de submit ($_POST['captcha'] != $_SESSION['captcha']) { die('spammert');}
Zo'n image verification script heb ik al eens gemaakt, dat is hetzelfde toch?
Maar om dat nu in elk formulier in te bouwen zie ik niet zitten. Ik ben bijvoorbeeld ook met een spelletje bezig en om in te loggen wil ik het gaan gebruiken maar zeker niet in het spel zelf.

wipes66 ook bedankt, goeie link is dat. Al ben ik wel bezig het met classes (OO) op te lossen, lijkt me toch net ff fijner werken, zeker met foutmeldingen.

Mocht er nog iemand anders ideeën hebben dan post gerust, ik blijf het topic volgen.
-
pi_43396514
ik wil een array maken in een array op deze manier:

$array["dit"]["dat"] = "blaat";

maar dat werkt niet?

hoe moet ik het schrijven?


[edit]
even dollartekentje dr voor gezet
As a rule, I never touch anything more sophisticated and delicate than myself.
  FOK!-Schrikkelbaas donderdag 9 november 2006 @ 15:22:29 #148
1972 Swetsenegger
Egocentrische Narcist
pi_43396625
quote:
Op donderdag 9 november 2006 15:19 schreef Desdinova het volgende:
ik wil een array maken in een array op deze manier:

array["dit"]["dat"] = "blaat";

maar dat werkt niet?

hoe moet ik het schrijven?
Zelf doe ik zoiets met een sessie:

$_SESSION['giftwrap'][$value]=$_POST[$value]

Dat werkt prima
pi_43396686
kan dit niet in een gewone variabele dan?
As a rule, I never touch anything more sophisticated and delicate than myself.
  FOK!-Schrikkelbaas donderdag 9 november 2006 @ 15:26:46 #150
1972 Swetsenegger
Egocentrische Narcist
pi_43396757
quote:
Op donderdag 9 november 2006 15:24 schreef Desdinova het volgende:
kan dit niet in een gewone variabele dan?
Lijkt me wel
heb je hier wat aan: http://onaje.com/php/article.php4/44
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')