Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  40 1927
Crew lofotLAN 2012
PureRushh's Avatar
Hei,
Jeg prøver å lage et slaks sikkerhets system.
Det er at den skal skjekke om at alle feltene ikke inneholder <meta> tags osv.
Så jeg har laga et eks:

Kode

if($title!=="<meta>"):
				echo "<p>Du har ikke lov å ha slike koder i nyheten!!</p>";
			endif;
Men da får jeg "Parse error: syntax error, unexpected $end in Cxampp\htdocs\admin\post_news.php on line 140"
koden: http://pastebin.no/z3269

Kan jeg endre istede for å ha

Kode

if ($title || $body || $by):
{
	if($title!=="<meta>"):
				echo "<p>Du har ikke lov å ha hacka koder i scriptet!</p>";
			endif;
			if(!$body):
				echo "<p>innlegget mangler tekst!</p>";
				endif;
			if(!$date):
				echo "<p>Det mangler en dato</p>";
				endif;
heller ha:

Kode

if ($title&&$body&&$by):
{
	if($title&&$body&&$by!=="<meta>"):
				echo "<p>Du har ikke lov å ha hacka koder i scriptet!</p>";
eller kan noen en annen måte?
kan dette fungere?

Hilsen
Physic
Hva med preg_match_all?
- http://php.net/manual/en/function.preg-match-all.php

Edit: Du søker opp det du ønsker å forby og skriver det om før dataen havner i databasen.
Sist endret av s1gh; 1. november 2010 kl. 16:09.
Skal man ikke bruke { og } før og etter If 's?

Linje 84, bruk Isset()

Kode

if (isset($_POST['post']))
(Dette er bare et tips, ikke en fix)
Sist endret av onClipEvent; 1. november 2010 kl. 16:16.
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
hmm, jeg vil at visst dette er i input filedsa skal operasjonen bli avist altså echo "Det skjedde en feil" når slikt blir oppdaga
Sitat av onClipEvent Vis innlegg
Skal man ikke bruke { og } før og etter If 's?
Vis hele sitatet...
Man må ikke det. { og } brukes vel når man skal kjører flere linjer med kode.

Kode

if ($variabel == "test") {
   echo "Something";
   DoSomethingElse();
}
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
Hallo,
har forandre litt nå på koden: http://pastebin.no/326c
men nå fungerer ingen ting alt blir feil.
Hva gjør jeg galt?
if (!$title&&$body&&$by == "<meta>")

Denne går ikke.
  1. Når du bruker == vil den kun sjekke om strengen ER LIK <meta>, altså hvis hele innholdet i f.eks $title er <meta>. Den sjekker ikke om den inneholder <meta>
  2. Du kan ikke sjekke flere variabler på den måten

Kode

$title_pos = strpos($title, "<meta>");
$body_pos = strpos($body, "<meta>");

if($title_pos === true) {
  echo "Fant <meta> i tittel";
}

if($body_pos === true) {
  echo "Fant <meta> i body";
}

if( ($body_pos === true) | ($title_pos === true) ) {
  echo "Fant <meta> i enten body eller tittel";
}
Edit
Du mangler også en { etter else på linje 107.
Sist endret av Diox; 1. november 2010 kl. 17:01.
Det du gjør galt er å ikke gi folk noen feilmelding å forholde seg til.
Sitat av PhysicGaming Vis innlegg
Hallo,
har forandre litt nå på koden: http://pastebin.no/326c
men nå fungerer ingen ting alt blir feil.
Hva gjør jeg galt?
Vis hele sitatet...
Du gjør mye feil.

Kode

if (!$title&&$body&&$by == "<meta>")
Denne setningen vil være sånn dersom $title ikke er true, $body er true og $by er "<meta>".

Hvis man skal sjekke at ingen av variablene er lik "<meta>" må man gjøre noe sånt:

Kode

if($title != "<meta>" && $body != "<meta>" && by != "<meta>")
Så vidt jeg har forstått ønsker du å sjekke at f.eks. $title ikke inneholder "<meta>", og da må du bruke en helt annen fremgangsmåte. Hvis $title inneholder "<meta name="keywords" content="some keyword,another keyword" />", så vil den passere testen din uten problemer.

Du kan f.eks. bruke strip_tags() som vil fjerne tags. Alternativt har man også htmlspecialchars() som blant annet vil gjøre om "<" til "&lt;".

Det er lite poeng i å printe ut feilmeldinger til folk, det er bedre å bare fjerne eller uskadeliggjøre alle tags du ikke vil ha noe av.

Det finnes selvfølgelig bedre måter å sikre seg på, men disse er ganske grunnleggende og et godt sted å starte.
Sist endret av danielsk; 1. november 2010 kl. 17:06.
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
Sitat av Diox Vis innlegg
if (!$title&&$body&&$by == "<meta>")

Denne går ikke.
  1. Når du bruker == vil den kun sjekke om strengen ER LIK <meta>, altså hvis hele innholdet i f.eks $title er <meta>. Den sjekker ikke om den inneholder <meta>
  2. Du kan ikke sjekke flere variabler på den måten

Kode

$title_pos = strpos($title, "<meta>");
$body_pos = strpos($body, "<meta>");

if($title_pos === true) {
  echo "Fant <meta> i tittel";
}

if($body_pos === true) {
  echo "Fant <meta> i body";
}

if( ($body_pos === true) | ($title_pos === true) ) {
  echo "Fant <meta> i enten body eller tittel";
}
Edit
Du mangler også en { etter else på linje 107.
Vis hele sitatet...
Men, hvordan skal jeg putte dette inn i koden? Prøvde nå, å meta tags slapp forbi.

Sitat av danielsk Vis innlegg
Du gjør mye feil.

Kode

if (!$title&&$body&&$by == "<meta>")
Denne setningen vil være sånn dersom $title ikke er true, $body er true og $by er "<meta>".

Hvis man skal sjekke at ingen av variablene er lik "<meta>" må man gjøre noe sånt:

Kode

if($title != "<meta>" && $body != "<meta>" && by != "<meta>")
Så vidt jeg har forstått ønsker du å sjekke at f.eks. $title ikke inneholder "<meta>", og da må du bruke en helt annen fremgangsmåte. Hvis $title inneholder "<meta name="keywords" content="some keyword,another keyword" />", så vil den passere testen din uten problemer.

Du kan f.eks. bruke strip_tags() som vil fjerne tags. Alternativt har man også htmlspecialchars() som blant annet vil gjøre om "<" til "&lt;".

Det finnes selvfølgelig bedre måter å sikre seg på, men disse er ganske grunnleggende og et godt sted å starte.
Vis hele sitatet...
Bruker allerede den metoden. Men dette er jo for et seriøst firma så å få <meta> og alt det der i gjesteboken er ikke bra, men jeg kan vel også bare forby "<" så funker ingen ting?
z0p
uʍop ǝpısdn
z0p's Avatar
hva med å gjøre om til HTML entities istedet for å fjerne det helt? altså <meta> => &lt;meta&gt;
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
Sitat av z0p Vis innlegg
hva med å gjøre om til HTML entities istedet for å fjerne det helt? altså <meta> => &lt;meta&gt;
Vis hele sitatet...
ja, men ha det i gjesteboken blir stykt å rotete. Hvorfor ikke forby det helt?
Sitat av PhysicGaming Vis innlegg
ja, men ha det i gjesteboken blir stykt å rotete. Hvorfor ikke forby det helt?
Vis hele sitatet...
Hvis noen forsøker å inkludere HTML i innleggene sine så er det vel ikke meldinger du er noe interessert i å inkludere uansett, men måten du blokkerer dette på blir litt merkelig. Var jeg deg ville jeg brukt strpos til å sjekke om det finnes noen "kjente" tags i meldingen (script, meta, etc) og så nektet å godta meldingen hvis dette var tilstede. Etter denne første filtreringen, kjør strip_tags og/eller htmlspecialchars for å uskadeliggjøre annen HTML.

Om du ønsker støtte for f.eks. <img> eller <a> så bør du ta en titt på eksisterende BB-code-løsninger, for dette er det sinnsykt lett å gjøre feil og sårbart.
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
hehe, det jeg jobber med nå er strpos mye bedre funksjon som du sier.

http://pastebin.no/326e
Linjer: 95,96 103-125

der er strpos kommandoene, men nå funker ingenting, alt blir feil.
Sist endret av PureRushh; 1. november 2010 kl. 17:28. Grunn: link + info
Forsøk å bytt ut == med ===.
Strpos krever at du bruker tre isteden for to da du skal bruke funksjonen til ditt formål: http://php.net/manual/en/function.strpos.php
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
har bytta ut alt.
Nå får jeg posta alt og alle feilmeldingene kommer opp + at det ble postet.
http://pastebin.no/326g
Du har ikke gjort som jeg sa. Nå har du != istede for ==. Les posten min igjen.
Om du skal sammenligne noe med true eller false må man alltid ha 3x =
Sitat av danielsk Vis innlegg
Om du skal sammenligne noe med true eller false må man alltid ha 3x =
Vis hele sitatet...
Hæ?
Bruker man ikke "===" når man skal sammenligne verdier OG datatype?

Kode

$test1 = 10;
$test2 = "10";

// $test1 == $test2 er true
// $test1 === $test2 er false. Den ene er string og den andre er int.
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
hei,
Nå fungerer det når det er <meta> i begge men ikke når dem er en og en.
Pluss at man kan poste nyheter utn å ha noe i feltene.
pluss det er bugs med feilkodene.
http://pastebin.no/326h
z0p
uʍop ǝpısdn
z0p's Avatar
En liten ting jeg lurer på: Har du tenkt igjennom title-feltet i gjesteboken? Hvordan kommer man på en tittel til et gjestebokinnlegg?

PHP caster til boolean om den trenger, så følgende skal fungere

Kode

if ( strpos( $_POST['body'], '<meta' ) ) { exit( 'teksten inneholder ugyldig html' ); }
Og så kommer noen smarte folk og bruker <META> (store bokstaver!) og ødelegger hele det "fancy" opplegget ditt. Ta heller og blokker ethvert innlegg som inneholder < eller >.
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
Det skal brukes til news script å
Tenkte akkurat på det samme.

Du kan gjøre som z0p sier, eller så kan du bytte ut alle "=== true" med "!== false":

Kode

//Skjekker om noe har blitt postet inn
if($title_pos !== false) {
	echo "Fant <meta> i tittel";
}

if($body_pos !== false) {
	echo "Fant <meta> i body";
}

if( ($body_pos !== false) || $title_pos !== false) {
	echo "Fant <meta> i enten body eller tittel";
}
if($title_pos !== false || $body_pos !== false) {
	//setter inn dataen til databasen
	$insert = mysql_query("INSERT INTO news VALUES ('','$title','$body','$date','$by')") or die(mysql_error());
	echo "<h3 class='green'>Nyheten har blitt postet!</h3>";
}
Bytter du i tillegg ut strpos med strripos vil den være case insentitiv, altså ta <META> like godt som <meta>.
Hvorfor fokuserer du forresten på meta-taggene? Det er da mange tags som er mye mer skumle, som <script>. (Men siden alle tags kan inneholde javascript så er ALLE tags skumle, egentlig.)
For å lære han hvordan han kan bruke grunnleggende funksjoner slik at han kan bruke det til å utvide sikkerheten selv med andre tags.
Mulig jeg har misforstått nå, men hvorfor bruker du ikke htmlspecialchars($string)?

Kode

<?php
$test = "<script>alert(1)</script>";
$test = htmlspecialchars($test);

echo $test;

// Output blir: <script>alert(1)</script>
// Kildekoden blir: &lt;script&gt;alert(1)&lt;/script&gt;
?>

Edit: Du sier du vil forby farlige tags, men ved bruk av htmlspecialchars vil vel i alle fall ikke kodene bli kjørt. Selv om de vises på nettsiden.
Sist endret av s1gh; 1. november 2010 kl. 18:22.
Men det er å begynne i feil ende. Det finnes hundrevis av tags. Det er mye bedre å tillate noen få ting, enn å sperre ute ting etterhvert som du kommer på dem.
Ja, det er forsåvidt sant, ymgve.
Har kanskje fokusert litt for mye på hva han allerede har starta på..

Enkel måte å sjekke om det er HTML i det heletatt i en string:

Kode

if(strlen($tittel) != strlen(strip_tags($tittel)) {
  echo "Fant HTML i tittel";
}
Sjekker forskjellen på antall tegn i tittel og antall tegn i tittel uten HTML (strip_tags fjerner HTML tags fra stringen).
Hvis det er forskjell her betyr det at det var HTML i tittelen.
Sist endret av Diox; 1. november 2010 kl. 18:28.
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
Kan vel forbye mye mer? Med noen tegn elns? ',' || eller?
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av PhysicGaming Vis innlegg
Kan vel forbye mye mer? Med noen tegn elns? ',' || eller?
Vis hele sitatet...
Det er feil innfalsvinkel. Forby alt som default, og tillat enkelte ting som du sjekker grundig. Ellers ber du om at en eller annen finner en tag du ikkje har tenkt på at eksisterte.
Hvis du skal skrive en artikkel som handler om HTML da? Så vil du bruke htmltags i artikkelen?

Følg s1gh sitt råd, da vil ingen html-tags bli kjørt, men vises som ren tekst.
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
Pappa er blank på html så han blir å skrive helt vanlig.
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av PhysicGaming Vis innlegg
Pappa er blank på html så han blir å skrive helt vanlig.
Vis hele sitatet...
http://tinymce.moxiecode.com/
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
Får ikke til å installere den. Er ikke konge på javascript.
Sitat av s1gh Vis innlegg
Hæ?
Bruker man ikke "===" når man skal sammenligne verdier OG datatype?

Kode

$test1 = 10;
$test2 = "10";

// $test1 == $test2 er true
// $test1 === $test2 er false. Den ene er string og den andre er int.
Vis hele sitatet...
ja, derfor blir det riktig. For generelt er True == 1, og False == 0. Eller om jeg husker riktig fra PHP er den vel så generell at den sier noe slikt:

Kode

if i == 0 then False
else True.
Altså at alle andre verdier enn null blir regnet som true.

Dette betyr at om du lager en funksjon som f.eks. returnerer False om det skjer noe galt i funksjonen, og ellers returnerer den en integer-verdi, og den i dette tilfellet var 0, og du kjører en test:

Kode

if (return_value == False)
{
     // Error handling
}else{
     // Do Something
}
Så vil den gå i elsen om verdien er 0. Men om du endrer til

Kode

if (return_value === False)
{
     // Error handling
}else{
     // Do Something
}
vil den også sjekke om verdien er Boolean eller integer og gi ønsket effekt.
Jeg har tidligere skrevet litt om datatyper og PHP.

http://freak.no/forum/showpost.php?p...0&postcount=12

For å oppsummere, bruker du en funksjon som returnerer en integer; for guds skyld, håndter integeren som en integer og ikke noe annet. I tilfeller hvor du bruker strpos, ville jeg sjekker om den var større enn 0, og ikke true eller false. Man har ingen garanti for at true/false er lik 1/0.
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
Sitat av |d13m0b Vis innlegg
Jeg har tidligere skrevet litt om datatyper og PHP.

http://freak.no/forum/showpost.php?p...0&postcount=12

For å oppsummere, bruker du en funksjon som returnerer en integer; for guds skyld, håndter integeren som en integer og ikke noe annet. I tilfeller hvor du bruker strpos, ville jeg sjekker om den var større enn 0, og ikke true eller false. Man har ingen garanti for at true/false er lik 1/0.
Vis hele sitatet...
Skal jeg da i stede for true bruke 1?
z0p
uʍop ǝpısdn
z0p's Avatar
Sitat av |d13m0b Vis innlegg
Jeg har tidligere skrevet litt om datatyper og PHP.

http://freak.no/forum/showpost.php?p...0&postcount=12

For å oppsummere, bruker du en funksjon som returnerer en integer; for guds skyld, håndter integeren som en integer og ikke noe annet. I tilfeller hvor du bruker strpos, ville jeg sjekker om den var større enn 0, og ikke true eller false. Man har ingen garanti for at true/false er lik 1/0.
Vis hele sitatet...
jeg så på dok. til strpos i php manualen, og så at strpos returnerer en verdi som skal kunne evalueres som boolean false dersom det ikke finnes en posisjon å oppgi. I PHP kan likegjerne være NULL som en integer. Dersom man skal kunne skille et treff i posisjon 0 fra et resultat uten treff, må man sjekke om resultatet er lik FALSE og av samme type. !($resultat===FALSE) bør da implisere et treff.

jeg ser at etse egentlig oppsummerte dette greit tidligere
Crew lofotLAN 2012
PureRushh's Avatar
Trådstarter
if($title_pos !== false)
{ echo "En av disse tingene ble funnet $error ";
else
Insert osv.
}
kan jeg gjøre det slik?