Hjälp mig göra mitt script(insert) helt säkert? MySQL/PHP

Permalänk
Medlem

Hjälp mig göra mitt script(insert) helt säkert? MySQL/PHP

Hej, jag håller nu på med ett script där det är extremt viktigt att inget kan raderas eller något annat negativt. Skulle någon kunna gå igenom det och lägga till eventuella bra saker? Uppskattas enormt!

Kod: http://pastie.org/1541282

Tack på förhand!

Permalänk
Medlem
Skrivet av csmannen:

Hej, jag håller nu på med ett script där det är extremt viktigt att inget kan raderas eller något annat negativt. Skulle någon kunna gå igenom det och lägga till eventuella bra saker? Uppskattas enormt!

Kod: http://pastie.org/1541282

Tack på förhand!

Själva skriptet där är helt säkert men variablerna är inte! Fyller man i namn och sådant själv? Då kan man inplantera diverse php-kod.

http://www.w3schools.com/php/php_ref_filter.asp

Beroenda på vad de olika variablera får innehålla så kan du välja lite olika vilkor.

Typ:

$Namn = mysql_real_escape_string($Namn); $Namn = htmlentities($Namn);

Permalänk
Medlem

Så om jag vill göra så att "email" blir en säker input skriver jag:

$eamil = FILTER_SANITIZE_NUMBER_FLOAT($email);

Skulle det där vara 100% säkert? Om jag gör liknande på allt annat, fast med passande filter?

Permalänk
Medlem

Vad är bäst att använda: FILTER_SANITIZE_NUMBER_FLOAT eller mysql_real_escape_string ? Den första gör så att bara siffror och +- är tillåtna, och den andra lägger ett / innan fraliga tecken. Det känns som den första är bäst, men kan man ha båda? Det vore det optimala!

Permalänk
Medlem

Är det här ärtt och säkert? (kan inte testa själv):

http://pastie.org/1541643

Permalänk
Medlem

Visst kan du filtrera en sträng två gånger, en gång med vardera funktion. Men täntke du använder filter_sanitize_number_float på e-mejladressen? Så vitt jag vet så består e-mejladresser inte bara av +, - och siffror, utan vanligtvis även bokstäver, punkter, understreck, @ o.s.v...

Permalänk
Medlem

Eller är det så här man gör:

$_POST['namn']; =mysql_real_escape_string($namn);
? Det verkar så, men gör man likadant med phpfilter?

Permalänk
Medlem

Du borde byta plats på variablerna. Alltså:

$namn = mysql_real_escape_string($_POST['namn']);

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem
Skrivet av Tazavoo:

Visst kan du filtrera en sträng två gånger, en gång med vardera funktion. Men täntke du använder filter_sanitize_number_float på e-mejladressen? Så vitt jag vet så består e-mejladresser inte bara av +, - och siffror, utan vanligtvis även bokstäver, punkter, understreck, @ o.s.v...

Nej, den skulle vara för personnummer, ålder osv. Men hur ska jag använda det? I koden då?

Permalänk
Medlem
Skrivet av Xburk:

Du borde byta plats på variablerna. Alltså:

$namn = mysql_real_escape_string($_POST['namn']);

tack, gör jag på samma sätt med php-filter?

Permalänk
Medlem
Skrivet av csmannen:

tack, gör jag på samma sätt med php-filter?

Jadu.. Skulle tippa på det, men vet inte riktigt hur de där fungerar. (Antar att du menar "FILTER_VALIDATE_EMAIL", m.fl.)
Ta en titt på: http://se.php.net/manual/en/book.filter.php

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem
Skrivet av Xburk:

Jadu.. Skulle tippa på det, men vet inte riktigt hur de där fungerar. (Antar att du menar "FILTER_VALIDATE_EMAIL", m.fl.)
Ta en titt på: http://se.php.net/manual/en/book.filter.php

Det står lite där, men jag fattar inte. Om jag vill ha filter_validate_email i min kod, samt mysql_real_escape_string hur gör jag då?

Permalänk
Medlem

Om du bara skriver $namn=$_POST['namn']; kommer du få varningar när du kör i strict mode. Kan vara bra att lära sig i början.

//Bra funktioner function ifsetor(&$variable, $default = null) { if (isset($variable)) $tmp = $variable; else $tmp = $default; return $tmp; } function validate_string($string, $html = false) { if(!$html) $string = htmlspecialchars($string); $string = trim($string); if(get_magic_quotes_gpc()) { $string = stripslashes($string); } return mysql_real_escape_string($string); } //Använd även `` mysql_query("INSERT INTO hemligt (`namn`,`personnummer`) VALUES ('$namn', '$personnummer')");

Visa signatur
Permalänk
Medlem
Skrivet av XzaR:

Om du bara skriver $namn=$_POST['namn']; kommer du få varningar när du kör i strict mode. Kan vara bra att lära sig i början.

//Bra funktioner function ifsetor(&$variable, $default = null) { if (isset($variable)) $tmp = $variable; else $tmp = $default; return $tmp; } function validate_string($string, $html = false) { if(!$html) $string = htmlspecialchars($string); $string = trim($string); if(get_magic_quotes_gpc()) { $string = stripslashes($string); } return mysql_real_escape_string($string); } //Använd även `` mysql_query("INSERT INTO hemligt (`namn`,`personnummer`) VALUES ('$namn', '$personnummer')");

Kan du göra ett exempel elelr föklara hur jag tillämpar funktionerna när jag har namn och personnummer som värde? Vore asschysst!

Permalänk
Medlem

Nu har jag fixat scriptet, hoppas jag iaf. Här är det: http://pastie.org/1542574

Jag använder mig nu av båda php-filters för att få bort oönskade tecken, och även mysql_real_escape_string för att sätta / framför skadliga tecken för att förhindrar drops och liknande. Kommer det här att fungera? Kan det göras säkrare?

Tack för all hjälp hittills! Och tack på förhand!

Permalänk
Medlem

till exempel:

//Kan vara submit knappen på en form. if(isset($_POST['login'])) { $name = ifsetor($_POST['name'],""); //Istället för "" kan du ha ett default värde om du vill när inte $_POST['name'] finns, bäst lämna tomt om du vill sedan kolla om fältet har blivit skriven eller inte. $name = validate_string($name); } //Tror den här är bättre än den förra då htmlspecialchars tar extra plats i en databas. function validate_string($string, $html = false, $mysql = true) { $string = trim($string); if(!$html) $string = htmlspecialchars($string); if($mysql) { if(get_magic_quotes_gpc()) { $string = stripslashes($string); } return mysql_real_escape_string($string); } return $string; } $name = validate_string($name); //använd för att skriva till databasen samt visa utan html. $name = validate_string($name,true,false); //använd för att bara visa med html.

Du behöver bara använda ifsetor när du inte vet om en variabel kommer användas eller inte.

Visa signatur
Permalänk
Medlem
Skrivet av csmannen:

Nu har jag fixat scriptet, hoppas jag iaf. Här är det: http://pastie.org/1542574

Jag använder mig nu av båda php-filters för att få bort oönskade tecken, och även mysql_real_escape_string för att sätta / framför skadliga tecken för att förhindrar drops och liknande. Kommer det här att fungera? Kan det göras säkrare?

Tack för all hjälp hittills! Och tack på förhand!

Dom 2 sista raderna på escapen är skrivna fel.
Sen har du glömt ett ( på $datum raden.

$betalsatt=$_POSTmysql_real_escape_string['betalsatt']); $storlek=$_POSTmysql_real_escape_string['storlek']);

Sen undrar jag varför du anger variabelnamnen med ett _ i filter_var satsen?

$namn_s = filter_var ($_namn, FILTER_SANITIZE_STRING );

Med mysql_real_escape_string så skickar du ju in värdet i $namn och inte i $_namn.

Permalänk
Medlem

Nu har jag gjort om det, dock så sket jag i php-filter, men här är det:

http://pastie.org/1556982 Kommer det funka?

Permalänk
Medlem

Nja det ser ganska fel ut. Har hjälpt dig lite nu för att se hur det kan se ut men du måste fixa egna funktioner själv eller använda de som finns. Sen behöver du inte kommentera varje variable eller rad...

<?php $con = mysql_connect("hemligt","hemligt","hemligt"); if(!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("hemligt", $con); //IfSetOr function ifsetor(&$variable, $default = null) { if(isset($variable)) $tmp = $variable; else $tmp = $default; return $tmp; } //Validate String function validate_string($string, $tags = "", $html = true, $mysql = true) { $string = trim($string); if($tags) { if($tags == "all") $string = strip_tags($string); else $string = strip_tags($string,$tags); } if(!$html) $string = htmlspecialchars($string); if($mysql) { if(get_magic_quotes_gpc()) { $string = stripslashes($string); } return mysql_real_escape_string($string); } return $string; } //exempel funktion för att förklara ett giltigt namn. function validate_name($name) { $e = ""; if(strlen($name) < 2) { $e .= "A"; } if(strlen($name) > 15) { $e .= "B"; } if(!preg_match("/^[-A-Öa-ö]+$/i",$name)) { $e .= "C"; } return $e; } if(isset($_POST['uppgifter'])) { $namn = ifsetor($_POST['namn'],""); $namn = validate_string($namn); //exempel funktion $error_namn = validate_name($namn); $personnummer = ifsetor($_POST['personnummer'],""); $personnumer = validate_string($personnummer); $adress = ifsetor($_POST['adress'],""); $adress = validate_string($adress); $postnummer = ifsetor($_POST['postnummer'],""); $postnummer = validate_string($postnummer); //sen behöver du inte använda validate string alltid. Om du vet att det bara ska vara ett nummer så kan du använda funktioner som (int), is_numeric $ort = ifsetor($_POST['ort'],""); $ort = validate_string($ort); $land = ifsetor($_POST['land'],""); $land = validate_string($land); $alder = ifsetor($_POST['alder'],""); $alder = validate_string($alder); $email = ifsetor($_POST['email'],""); $email = validate_string($email); $mobil = ifsetor($_POST['mobil'],""); $mobil = validate_string($mobil); $datum = ifsetor($_POST['datum'],""); $datum = validate_string($datum); $betalsatt = ifsetor($_POST['betalsatt'],""); $betalsatt = validate_string($betallsatt); $storlek = ifsetor($_POST['name'],""); $storlek = validate_string($storlek); $output_text = ""; if($error_namn == "") //<- && $error_personnummer == ""... { mysql_query("INSERT INTO hemligt (`namn`,`personnummer`,`adress`, `postnummer`, `ort`, `land`, `mobil`, `datum`, `betalsatt`, `storlek`, ) VALUES ('$namn', '$personnummer', '$adress', '$ort', '$land', '$email', '$mobil', '$betalsatt', '$storlek')"); } else { $output_text .= "<ul>"; if(strstr($error_namn,"A")) $output_text .= "<li>Namnet är för kort.</li>"; if(strstr($error_namn,"B")) $output_text .= "<li>Namnet är för långt.</li>"; if(strstr($error_namn,"C")) $output_text .= "<li>Namnet använder ogilitiga tecken.</li>"; $output_text .= "</ul>"; print $output_text; } } else { //skickar dig till formen där du ska skriver in uppgifterna header("Location: uppgifter_skriv.php"); } ?>

Jag brukar bara använda engelska ord när jag skriver i PHP så det har blivit lite blandat i din kod.
Sen kan du änven seperera funktionerna i en egen fil och använda require("adressen"); för använda dem.

Visa signatur