Предпазване от '

Hous

Registered
Направих си една проста форма която да вкарва информация в полета в таблица, обаче когато в полето за заглавие се попълнят разни символи като & или ' се прецаква заявката
PHP:
Name:<input class='box' type='text' name='ctitle' size='60' maxlength='250'>
....
$ctitle=$_POST['ctitle'];//zaglavie
....
$save = mysql_query("INSERT INTO TABLE (item_title) VALUES ('$ctitle')") or die(mysql_error());
if(save)
{
echo "<br>Zapisyt <b>$ctitle</b> was recorded succesfully";
}
....


нещо със htmlspecial chars или както е там функцията но не знам как точно да го направя, някой да помогне в моя пример?
 
PHP:
Name:<input class='box' type='text' name='ctitle' size='60' maxlength='250'>
....
$ctitle=htmlspecialchars(addslashes($_POST['ctitle']));//zaglavie
....
$save = mysql_query("INSERT INTO TABLE (item_title) VALUES ('$ctitle')") or die(mysql_error());
if(save)
{
echo "<br>Zapisyt <b>$ctitle</b> was recorded succesfully";
}
 
Няма смисъл от това, което са ти дали горе. Просто си го кастни.
PHP:
Name:<input class='box' type='text' name='ctitle' size='60' maxlength='250'>
....
$ctitle=(int)$_POST['ctitle'];//zaglavie
....
$save = mysql_query("INSERT INTO TABLE (item_title) VALUES ('$ctitle')") or die(mysql_error());
if(save)
{
echo "<br>Zapisyt <b>$ctitle</b> was recorded succesfully";
}
....
 
PHP:
$ctitle =  preg_replace('/[^a-zA-Z0-9],_/', '', $_POST['ctitle']);

Това е най-сигурният начин, премахва всичко нежелано от стринга, оставя само малки и големи букви, числа и знака _ ако желаеш да си добавиш още разрешени символи просто ги отделяш със запетайка след _
 
Radko каза:
...
Това е най-сигурният начин, премахва всичко нежелано от стринга, оставя само малки и големи букви, числа и знака _ ако желаеш да си добавиш още разрешени символи просто ги отделяш със запетайка след _

Да но така няма ли да ги премахн за постоянно и да не бъдат записани както трябва в дб-то?

@eddyy93 идеята ми свърши работа, записва правилно записа и в същото време не прецаква синтаксиса на mysql, а пък и не ми трябва да е толкова сигурна формата , защото все пак само администраторите ще вкарват записи, въпроса е да не прави проблеми понеже ' е доста често срещан символ както , и & друга защита не ми трябва.
:?:
 
Radko каза:
PHP:
$ctitle =  preg_replace('/[^a-zA-Z0-9],_/', '', $_POST['ctitle']);

Това е най-сигурният начин, премахва всичко нежелано от стринга, оставя само малки и големи букви, числа и знака _ ако желаеш да си добавиш още разрешени символи просто ги отделяш със запетайка след _

Това
PHP:
$ctitle =  preg_replace('/[^a-zA-Z0-9],_/', '', $_POST['ctitle']);

не трябва ли да е така?

PHP:
$ctitle =  preg_replace('/[^a-zA-Z0-9_\.\-]', '', $_POST['ctitle']);

това е само пример да разберат и как се отделят по специалните елементи в регулярния израз :lol:
 
PHP:
Name:<input class='box' type='text' name='ctitle' size='60' maxlength='250'>
....
$ctitle=$_POST['ctitle'];//zaglavie
$ctitle =str_replace("'","",$ctitle);
$ctitle =str_replace("&","",$ctitle);
$ctitle =str_replace(",","",$ctitle);
....
$save = mysql_query("INSERT INTO TABLE (item_title) VALUES ('$ctitle')") or die(mysql_error());
if(save)
{
echo "<br>Zapisyt <b>$ctitle</b> was recorded succesfully";
}
....

Ето това премахва символите ', § и , може да добавиш още символи да премахва ;)

Може също да се направи да дава грешка ако се използва някои от тези символи.
 
а да ви попитам защо когато спамят ''''''''''''''''''' (единични кавички си работи правилно) но когато се спамят """ двойни кавички ми изкача грешка 403 а имам дериктория за нея ?
 
Hous каза:
обаче когато в полето за заглавие се попълнят разни символи като & или ' се прецаква заявката
Нормално е единичната кавичка да доведе до синтактична грешка в заявката ти.Все едно да изпълниш в phpmyadmin следната заявка:

[sql]INSERT INTO `TABLE` (`item_title`) VALUES ('Plov'div')[/sql]

Ако те притеснява амперсант-а "&" и двойни и единични кавички си ги преобразувай в хтмл единици с htmlspecialchars за да няма проблеми:
PHP:
$ctitle=htmlspecialchars($_POST['ctitle'],ENT_QUOTES);//zaglavie

Така няма да имаш загуба на символи и заявката ще се изпълнява без проблем.

Относно постовете на Radko и kikity_94 и двамата не сте прави.Значи в материята на регулярните изрази няма метасимвол запетая "," това си е обикновен символ и регулярния израз на Radko има коренно различно значение.Относно регулярния израз на kikity_94 е правилен, но при него се ескейпват излишно метасимволи.ЗАПОМНЕТЕ метасимволите(специалните знаци както ги наричате) ГУБЯТ своето значение в класовете и се зачитат като обикновенни символи.Относно символа "-" в класа е правилно да се ескейпва,защото играе ролята на онзначаване на диапазон в клас, но САМО когато НЕ е най-отпред или най-отзад в класа,защото тогава структурата на диапазон се разваля.
Израза на Radko би изглеждал възможно най-съкратено така:
PHP:
preg_replace('/\W/', '', $_POST['ctitle']);
Израза на kikity_94 правилно написан би изглеждал така:
PHP:
preg_replace('/[^a-zA-Z0-9_.-]', '', $_POST['ctitle']);
а съкратено :
PHP:
preg_replace('/[^\w.-]', '', $_POST['ctitle']);


Надявам се да няма сърдити от градивна критика. :wink:
 
$queryString = strtolower($_SERVER['QUERY_STRING']);
if (strstr($queryString,"<") OR strstr($queryString,">") OR strstr($queryString,"(") OR strstr($queryString,")") OR
strstr($queryString,"..") OR
strstr($queryString,"%") OR
strstr($queryString,"*") OR
strstr($queryString,"+") OR
strstr($queryString,"!") OR
strstr($queryString,"@"))

при мене е така но когато се ползват двойните кавички и ме праща в
класическата страница 403 а не тази която съм направил при единичните нямам проблеми... но при двойните ми е кусура :( някой може ли да помогне пробвах да добавя и тези :


strstr($queryString," ' ") OR
strstr($queryString," " ") OR
strstr($queryString,' " ') OR
но ми дава грешка в php файла
 
какъв е смисъла да правиш 1000 проверки за непозволени знаци, като можеш да направиш една за позволени?
 

Горе