Autor Zpráva
exColor
Profil *
Ahoj, chtel bych se zeptat jak mam osetrit vstup $_GET, ktery zni treba "clanek123"? Hledal jsem a nasel jsem na internetu toto:

//kontrola, zda je id string
if (!is_string($_GET["id"])): 
echo "Toto ne!";
else:
//escapovani nebezpecnych znaku
$id = mysql_real_escape_string($_GET["id"]);
$dotaz = "select * from clanky where id = '$id'";
endif;


Ale neni mi moc jasne proc se kontroluje za do je string, kdyz "clanek123 and 3=3" je take string, ne? Pak by me jeste zajimalo, proc je tam funkce mysql_real_escape_string() a proc tam nemuze byt addslashes()?
Byl bych moc rad, kdyby mi tuto problematiku nekdo trochu osvetlil a pokud mate nekdo lepsi kod jak to osetrit, budu mnohokrat rad.

Predem dekuji .)
ShiraNai7
Profil
Kdyz potrebujes z $_GET['id'] cislo, tak udelas jednoduse toto:

$id=(int)$_GET['id'];


$id bude celociselne cislo, kterym zadnou skodu napachat nelze.
mysql_real_escape_string pouzivam i ja pro vkladani retezcu do sql dotazu

edit: pokud vim, tak v poli get jsou vsechny koncove hodnoty typu string, i kdyz je vstupem platne cislo...
suky
Profil
exColor
Dam ti jen tip, vcera jsem si to procital a je to velmi zajimave a navic to probira komletni bezpecnost s PHP. (link)
exColor
Profil *
jj tomu rozumim, ale praveze v $_GET['id'] nebude cislo, ale retezec typu "clanek123" nebo "vse-o-psech1", "vse-o-psech2","novy-web" a podobne...
suky
Profil
ShiraNai7
edit: pokud vim, tak v poli get jsou vsechny koncove hodnoty typu string, i kdyz je vstupem platne cislo...
jj je to tak, ta kontrola nahore je uplne zbytecna
ShiraNai7
Profil
exColor
Kdyby bylo id od titulku oddelene pomlckou (coz by kvuli seo melo), tak bych ho z toto extrahoval takto (nevim, jestli to bude fungovat, netestoval jsem to):

id by bylo treba "psi-a-kocky-10" (10 je id clanku)

$id=$_GET['id'];
$id=explode('-', $id);
if(count($id)>=2){
  $id=(int)$id[(count($id)-1)]; //nacteni id z konce
}
else{
$id=-1; //neplatne id
}
exColor
Profil *
ShiraNai7
jo takhlee...ale toto nacte cislo a porovna, ale neda se to udelat nejakym zpusobem, ktery by kontroloval cely ten retezec? nestacilo by treba projed vstup $_GET['id'] funkci addslashes()? Neda se snad provest utok bez toho aniz by nekdo nepouzil apostrofy? kdyz je cely $_GET['id'] uzavreno v apostrofech v SQL dotazu
suky
Profil
exColor
Koukni na muj post a trochu si zastuduj najdes tam fakt vsechno, co odpovi na tve otazky...
edit: myslim muj prvni post
ShiraNai7
Profil
exColor
Nevím, co všechno potřebuješ načíst. Ten skript, co jsem psal, vypreparuje z ID to cislo na konci (v ciselnem formatu, sql injectinou neni mozne). To vypreparované číslo v $id potom můžeš bez obav použít v SQL dotazu bez nějakých addslashes, mysql_real_escape_string apod. Pokud potřebuješ použít v dotazu celý ten řetězec, co je v ID, prožeň ho tou mysql_real_escape_string a neměl by být problém...
exColor
Profil *
ShiraNai7
OK, diky..uz jsem to tak udelal a jeste bych se chtel zeptat jak to mam vyresit pri registraci uzivatelu, aby se mi neregistrovali uzivatele treba McDonald's nebo I'm_king a podobne, jde mi o ten apostrof. Jak vytvorim podminku, ktera napise ze tyto znaky nemohu pouzit? Popripade jake typy uvozovek a mam vypsat do podminky IF?
Ale byl bych radsi kdyby to bylo kontrolovano pres nejakou funkci, ktera by vracela zda je (true)nebo neni (false) pouzity nevhodny znak.
panmagor
Profil *
Mám pocit, že to by se dalo vyřešit přes regulérní výrazy. Kdyby se zaregistroval jako I`m_king, zaregistrovalo by ho to jak Im_king
ShiraNai7
Profil
Tuto funkci používám ve svém rs, můžeš ji klidně použít.

McDonald's by mela prepsat na mcdonalds, I'm_king na imking apod



//kod funkce
function _anchorStr($input, $lower=true){

  //diakritika
  $input=str_replace(
  array("é", "ě", "É", "Ě", "ř", "Ř", "ť", "Ť", "ž", "Ž", "ú", "Ú", "ů", "Ů", "ü", "Ü", "í", "Í", "ó", "Ó", "á", "Á", "š", "Š", "ď", "Ď", "ý", "Ý", "č", "Č", "ň", "Ň", "ä", "Ä", "ĺ", "Ĺ", "ľ", "Ľ", "ŕ", "Ŕ", "ö", "Ö"),
  array("e", "e", "E", "E", "r", "R", "t", "T", "z", "Z", "u", "U", "u", "U", "u", "U", "i", "I", "o", "O", "a", "A", "s", "S", "d", "D", "y", "Y", "c", "C", "n", "N", "a", "A", "l", "L", "l", "L", "r", "R", "o", "O"),
  $input
  );

  //mezery
  $input=str_replace(" ", "-", $input);

  //odfiltrovani nepovolenych znaku
  $output="";
  $len=mb_strlen($input);
  for($x=0; $x<$len; $x++){
  $char=mb_substr($input, $x, 1);
  if(in_array($char, array("A","a","B","b","C","c","D","d","E","e","F","f","G","g","H","h", "I","i","J","j","K","k","L","l","M","m","N","n","O","o","P","p","Q","q ","R","r","S","s","T","t","U","u","V","v","W","w","X","x","Y","y","Z", "z","0","1","2","3","4","5","6","7","8","9",".","-"))){$output.=$char; }
  }

  //dvojite symboly
  /*$output=preg_replace('|--+|', '-', $output);
  $output=preg_replace('|\.\.+|', '.', $output);
  $output=preg_replace('|\.-+|', '.', $output);
  $output=preg_replace('|-\.+|', '-', $output);*/
  $from=array('|--+|', '|\.\.+|', '|\.-+|', '|-\.+|');
  $to=array('-', '.', '.', '-');
  $output=preg_replace($from, $to, $output);
  
  //orezani
  $output=trim($output, "-_.");

  //prevod na mala pismena
  if($lower==true){
  $output=mb_strtolower($output);
  }

  //return
  return $output;

}

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: