Avatar billede Smitche Praktikant
19. december 2012 - 16:13 Der er 42 kommentarer og
1 løsning

Hvordan bruges htmlspecialchars()? Til fx $_POST, $_GET og input felter?

Hvordan bruges htmlspecialchars()? Til fx $_POST og input felter?

Lad os sige jeg vil sikre at en bruger skriver en email-adresse?
Og hvad bruger man det ellers til?

Her er min form-kode:

<form action="insert.php" method="post" class="">

<input type="text" name="username" id="username" class="" placeholder="Navn" required/> <br> <br>
<input type="text" name="email" id="email" class="" placeholder="E-mail" required/> <br> <br>
<input type="password" name="password" id="password" class="" placeholder="Password" required/> <br> <br>
<input type="submit" value="Opret bruger" class="btn"/>

</form>

Dette sendes videre til insert.php med $_POST, og indsættes i en database:

$username = $_POST['username'];
$email      = $_POST['email'];
$password = sha1($_POST['password']);

På forhånd tak!
Avatar billede arne_v Ekspert
19. december 2012 - 16:28 #1
htmlspecialchars() bruges ikke til input men kun til output.
Avatar billede arne_v Ekspert
19. december 2012 - 16:29 #2
med hensyn til valifdering af email adresse, saa kan man lave et hurtigt convenience check paa om det er noget @ noget med mindst et punktum.

Bedre checks kraever at man sender en email med et confirmation link.
Avatar billede Smitche Praktikant
19. december 2012 - 16:36 #3
Hvordan gøres dette?

Og kan man så ikke sætte htmlspecialchars om mine $_POST variabler?
Avatar billede arne_v Ekspert
19. december 2012 - 16:54 #4
Hvis du bruger htmlspecialchars paa dit inout, saa gemmer du HTML i databasen, hvilket er et meget skidt design.
Avatar billede Smitche Praktikant
19. december 2012 - 17:17 #5
Findes der en PHP funktion der kan tjekke om brugeren fx skriver en e-mail? Har forsøgt at google mig frem til det, men har ikke kunne få det til at virke :(
Avatar billede arne_v Ekspert
19. december 2012 - 17:23 #6
Det er ret almindeligt at bruge regex til det.

Men det er som sagt langtfra et sikkert test.
Avatar billede Smitche Praktikant
21. december 2012 - 18:54 #7
Hvad kunne man i stedet som en sikker test?
Avatar billede Smitche Praktikant
21. december 2012 - 19:43 #8
Kan man ikke bruge htmlspecialchars til at rense et brugerinput for SQL-injections? Fx ved at sætte det rundt om alle sine $_POST variabler? Se eksempel:

$type = htmlspecialchars($_POST['type']);
Avatar billede arne_v Ekspert
21. december 2012 - 22:31 #9
Nej. 

htmlspecialchars haandterer ikke altid single quotes.
Avatar billede michael_stim Ekspert
22. december 2012 - 15:52 #10
#8
Hvorfor vil du, til hver en pris, bruge htmlspecialchars? Vil du undgå SQL-injection så brug PDO eller mysqli API og prepared statement. Tror du ikke du tænker på mysql_real_escape_string() når du nu snakker om SQL-injection? Men det er stadig ikke nok :o(
Avatar billede Smitche Praktikant
22. december 2012 - 16:07 #11
Det vil jeg bestemt heller ikke. Jeg har bare forstået det således at man kan bruge det til beskytte af sin hjemmeside (med brug af database), mod folk der kan manipulerer med SQL-injections til fx uautoriseret administratoradgang, hvor man har et databasekald, som fx når et bruger indtaster oplysninger til oprettelse af en bruger, eller logger ind.

Jeg har til en hjemmeside brugt en PDO forbindelse i en separat fil (connect.inc) (Hjemmesiden er et eksamensprojekt). Denne henter jeg senere hver gang jeg laver et database kald.

require_once('connect.inc.php');
$conn = dbConnect('pdo') or die('no connection');

Men gør også brug af mysqli (når en bruger logger ind) og mysql(til at oprette indhold med brug af en dropdown bar hvor data hentes med mysql_connect og msql_fect_array) extensions.
Avatar billede Smitche Praktikant
22. december 2012 - 16:15 #12
Jeg aner faktisk intet om validering og database-sikkerhed, vil bare gerne tage højde for det i mit projekt. Har brugt en sha1 til beskyttelse af kodeord fx. Har derudover hørt om SQL-injections og læste man skal "rense" brugerinput og troede htmlspecialchars blev brugt til dette, på sine $_POST og $_GET.
Avatar billede arne_v Ekspert
22. december 2012 - 17:15 #13
htmlspecialchars har absolut intet med beskyttelse af input mod SQL injection at goere.

Det er en funktion du kan bruge hvis du i output vil have vist HTML kode ufortolket.
Avatar billede arne_v Ekspert
22. december 2012 - 17:16 #14
SHA1 er ioevrigt ogsaa foraeldet. Brug SHA-256.
Avatar billede Smitche Praktikant
22. december 2012 - 19:43 #15
Mange tak for dine svar arne_v, kan du lægge et svar så kan jeg give dig pointene?
Avatar billede Smitche Praktikant
22. december 2012 - 20:11 #16
Hvilke forhold kan en udvikler tage for at undgå at blive offer for et SQL injection-angreb. Hvordan renser jeg ALT input hvad der nu måtte være farlige tegn. Hvilke specialtegn bør jeg filtrerer helt fra, eller konvertere (escapes - og hvordan gør man det?), så de ikke behandles aktivt, men bliver gemt, som det tegn de repræsenterer?
Avatar billede arne_v Ekspert
22. december 2012 - 20:31 #17
svar
Avatar billede arne_v Ekspert
22. december 2012 - 20:32 #18
Du beskytter dig mod SQL injection ved konsekvent at bruge prepared statement.

Derudover boer du generelt ogsaa validere input og checke alt for om det har det rigtige format (fordi udover SQL ibjection er der ogsaa XSS og andre grimme ting).
Avatar billede arne_v Ekspert
22. december 2012 - 20:35 #19
Test v.h.a. regex ses hyppigt brugt til at validere input med.
Avatar billede Smitche Praktikant
22. december 2012 - 20:54 #20
Er det korrekt, hvis man bruger PDO, at man sikrer sig mod SQL-injections?

Og hvis man bruger mysqli at man så kan bruge "mysql_real_escape_string" for at undgå SQL-injections?
Avatar billede arne_v Ekspert
22. december 2012 - 21:01 #21
2 x nej

Man beskytter sig mod SQL injections med PDO og mysqli extensions ved at bruge prepared statements. Det er nemt og naturligt, men man kan stadig snige en parameter konkatanering ind hvis man vil.

Man beskytter sig mod SQL injuections i mysql extension ved at bruge mysql_real_escape_string. Og det kraever lidt omtanke at faa detr gjordt korrekt.
Avatar billede Smitche Praktikant
22. december 2012 - 22:25 #22
Igen mange tak for dine svar arne_v, jeg beklager for min uvidenhed, men brænder for dette og er derfor meget interesseret i forstå det korrekt og lære så meget som muligt.

Men vil prøve at kigge mere på disse prepared statements, hvis jeg forstå det korrekt, kun er til brug med mysqli og PDO?
Avatar billede arne_v Ekspert
22. december 2012 - 22:35 #23
All moderne database API'er har prepared statements (Microsoft kalder dem for parameters).

PDO og mysqli extensions er moderne. mysql extension er ikke moderne.
Avatar billede arne_v Ekspert
22. december 2012 - 22:37 #24
Et hurtigt check viser at OCI (Oracle), DB2 og pgsql (PostgreSQL) alle har prepared.
Avatar billede Smitche Praktikant
03. januar 2013 - 13:43 #25
arne_v når du skriver "Hvis du bruger htmlspecialchars paa dit inout, saa gemmer du HTML i databasen, hvilket er et meget skidt design." - hvordan kan det være at det er skidt design?
Avatar billede Smitche Praktikant
03. januar 2013 - 15:09 #26
Fx ved at gøre således ligesom nedenstående eksempel:

"$type= htmlspecialchars($_POST['animaltype']);
$name= htmlspecialchars($_POST['animalname']);
$age= htmlspecialchars($_POST['animalage']);       
$descr= htmlspecialchars($_POST['animaldescription']);
$foto= htmlspecialchars($_POST['animalfotourl']);
$date=htmlspecialchars($_POST['animalhomelessdate']);



$sqlquery  = "INSERT INTO animals_tbl(animaltype, animalname, animalage, animaldescription, animalfotourl, animalhomelesssince) VALUES (':type',':name',':age',':descr', ':foto', ':date')";
   

$stmt = $conn->prepare($sqlquery);
$stmt->bindParam(':type',$type, PDO::PARAM_STR);
$stmt->bindParam(':name',$name, PDO::PARAM_STR);
$stmt->bindParam(':age',$age, PDO::PARAM_INT);
$stmt->bindParam(':descr',$descr, PDO::PARAM_STR);
$stmt->bindParam(':foto',$foto, PDO::PARAM_STR);
$stmt->bindParam(':date',$date, PDO::PARAM_STR);

$stmt->execute();"
Avatar billede arne_v Ekspert
03. januar 2013 - 15:54 #27
Man gemmer data i en database ikke praeformateret output.

Det er godt design at kunne genbruge de samme data for forskellige output formater.

PC browser----(HTML 4)-----web app----database
PC browser----(XHTML 1)-----web app----database
PC/smartphone browser----(HTML 5)-----web app----database
PC/smartphone browser----(XHTML 5)-----web app----database
PC/smartphone browser----(JSON)-----AJAX web app----database
PC/smartphone browser----(XML)-----AJAX web app----database
smartphone app----(JSON)-----web service----database
smartphone app----(XML)-----web service----database
desktop app----(XML)-----web service----database
desktop app----(binary)-----service----database
server----(XML)----web service----database
server----(SOAP XML)----web service----database
Avatar billede Smitche Praktikant
03. januar 2013 - 21:13 #28
Men er det ikke en anerkendt metode at bruge htmlspecialchars til sanitering?

http://en.wikipedia.org/wiki/HTML_sanitization
"HTML sanitization is the process of examining an HTML document and producing a new HTML document that preserves only whatever tags are designated "safe". HTML sanitization can be used to protect against cross-site scripting and SQL injection attacks by sanitizing any HTML code submitted by a user."

Så ved udtræk og præsentation pa&#778; klient-siden vil html-kode ikke blive fortolket af browseren med i stedet sta&#778; blot som ufortolket kode?

Så kan stadig ikke helt følge dig hvorfor det er skidt design?
Avatar billede Smitche Praktikant
03. januar 2013 - 21:22 #29
Har også læst mig frem til dette på stackoverflow:
http://stackoverflow.com/questions/414366/html-sanitization-bad-markup
"A method to sanitize any potentially dangerous tags from the provided raw HTML input using a whitelist based approach, leaving the "safe" HTML tags."
Avatar billede arne_v Ekspert
03. januar 2013 - 21:29 #30
htmlspecialchars bruges hvis du vil have vist HTML fremfor at faa det fortolket

<b>xxxx</b>

viser f.eks. tags fremfor at bolde teksten.


En feature som er mest relevant paa programmerings web sites.

----

HTML sanitizing er en god ting, men htmlspecialchars() goer at de farlige ting vises som ufarlig tekst - i de fleste tilfaelde vil man foretraekke at faa dem helt vaek.
Avatar billede arne_v Ekspert
03. januar 2013 - 21:30 #31
Har du laest og taenkt over #27 ?
Avatar billede Smitche Praktikant
03. januar 2013 - 23:46 #32
Ja, men forstår det desværre ikke rigtig?
Avatar billede arne_v Ekspert
03. januar 2013 - 23:54 #33
Hvis du har noget data i din database og det skal sendes til en gammel browser som HTML, som JSON til en nyere browser og som XML til en smartphone app er det saa smart at gemme data med HTML formatering?
Avatar billede Smitche Praktikant
04. januar 2013 - 00:01 #34
Det lyder det ikke som. Men forstår ikke rigtig hvorfor du snakker om JSON og XML?

Hvis man fx har et mini-cms CRUD webløsning, hvor brugere kan skrive nyheder og besøgende kan kommenterer, denne bliver lavet med HTML bliver det så fortolket som JOSN, XML og ikke HTML på andre platforme?

Har aldrig arbejdet med disse JOSN og XML.
Avatar billede Smitche Praktikant
04. januar 2013 - 00:04 #35
*Og her tænker jeg den er lavet med HTML5
Avatar billede arne_v Ekspert
04. januar 2013 - 00:09 #36
Der sker ikkke noget automatisk.

Men hvis du vil omskrive dit CMS til at bruge AJAX vil du typisk lade JavaScript hente i JSON eller XML format.

Hvis du vil lave en smartphone app til dit CMS (jeg er ikke sikker paa at det giver mening , men ...) saa vil du ogsaa typisk hente i JSON eller XML.
Avatar billede Smitche Praktikant
04. januar 2013 - 00:14 #37
Ja okay, nu forstår jeg hvad du mener. Så er det måske en god ide bare helt at fjerne disse tegn helt, for vil selvfølgelig ikke have HTML'en fortolket i mine input og heller ikke have dem vist. Kender du tilfældigvis en metode til dette?
Avatar billede Smitche Praktikant
04. januar 2013 - 01:52 #38
Men man kan vel bruge htmlspecialchars til output og beskytte sig mod XSS på den måde?
Avatar billede arne_v Ekspert
04. januar 2013 - 02:14 #39
Generelt er det bedre at tillade det gyldige fremfor at forbyde det ugyldige.

Saa det er bedre kun at acceptere bogstaver til et navn end det er at forsoege at strippe HTML ud.
Avatar billede arne_v Ekspert
04. januar 2013 - 02:15 #40
htmlspecialchars vil forhindre JS i at blive koert men alle vil kunne laese den JS - det ser ikke saa smart ud
Avatar billede Smitche Praktikant
05. januar 2013 - 14:48 #41
Så det ville være bedre at bruge fx http://htmlpurifier.org/? Som jeg har forstået det er en whitelist over det tilladte?
Avatar billede arne_v Ekspert
05. januar 2013 - 16:42 #42
Hvis der skal tillades HTML saa JA.

Et CMS vil maaske tillade HTML men mange andre web apps behover ikke tillade HTML.

Der kan man saa bare validere op imode noget regex som definerer hvad der er tilladt.
Avatar billede Smitche Praktikant
05. januar 2013 - 18:10 #43
Mange tak igen, jeg tror jeg begynder at se det hele i en større sammenhæng nu.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester