mysqli_real_escape_string

stoqnski

Registered
Здравейте,доколкото прочетох в документацията за тази ф-я , би трябвало да ескейпне всички специални знаци,но при мен не става :D

Имам един формуляр и правя:
//процедурно
$zaglavie = mysqli_real_escape_string($con,$_POST['zaglavie']);

Всичко се добавя , но проблема е , че като добавя запис от сорта на
<font color='red'>test</font> и всичко гръмва ...
 
Точно това подаваш към базата и съвсем нормално е да се запише точно това. Не ескейпваш html символи и тагове, а такива, които биха дали негативни отражения, при конструирането на самата SQL заявка. В твоя случай са се ескейпнали знаците ' но в крайния резултат в базата е идентичен с подаваните параметри :)
 
Ахам , а реално mysqli_real_escape.... (баси дългото име :D) за какво служи?Като ескейпна с htmlspecialchars,trim и подобни после да напиша
mysqli_real_escape_string($con,$clear-for-bd-string); ?
 
stoqnski каза:
Ахам , а реално mysqli_real_escape.... (баси дългото име :D) за какво служи?Като ескейпна с htmlspecialchars,trim и подобни после да напиша
mysqli_real_escape_string($con,$clear-for-bd-string); ?
Значи.
Има две неща. Едното е sql injection, а другото е xss.

mysql escape string блокира sql injection
html special chars блокира xss
[Edit:] Може да ползваш htmlentities вместо последното: http://stackoverflow.com/questions/3623236/htmlspecialchars-vs-htmlentities-when-concerned-with-xss

Трябва и от двете да се предпазиш. Кое кога да използваш?

Когато имаш insert използваш само mysql real escape.
Когато имаш echo html използваш само html special chars.

Схващаш ли? ("само" в случая означава, че не ползваш другата функция, когато ползваш едната. т.е. не ползваш mysql real escape при echo html и обратното.)
Възможен проблем при изкарването на данни от DB е да получиш <font color\'... В зависимост от настройките, това може да го има или да го няма. Ако го има, използваш strip slashes, както ти казах по-горе. Извеждането ще стане така:

PHP:
$row = mysqli fetch assoc (...);
$text = $row['text'];

//първо махаме наклонените черти
$text = stripslashes($text);
//после ползваме това:
$text = htmlspecialchars($text);

// или накратко:
$text = htmlspecialchars(stripslashes($text));
 
Когато вкарваш даннив базата (записваш) ползвай mysqli_real_escape_string() или най-добре prepared заявка, без да модифицираш данните с htmlspecialchars() и каквото там се сетиш. Последните решават проблеми при визуализацията - мястото им е веднага след извличането на "суровите" данни от базата и непосредствено реди визуализацията им.
 
От мнението разбрах , къде имам add.php (insert)

пиша така:

$ime = mysqli_real_escape_string($con,$_POST['ime']);

и mysqli_query($con,"INSERT ...)

А при view.php (select)

пиша така:

mysqli_query(SELEC...)

fetch_object примерно :

$ime = htmlspecialchars(stripslashes($row->ime));
$opisanie = htmlspecialchars(stripslashes($row->opisanie));

така ли ?
 
stoqnski каза:
От мнението разбрах , къде имам add.php (insert)
пиша така:
$ime = mysqli_real_escape_string($con,$_POST['ime']);
и mysqli_query($con,"INSERT ...)
А при view.php (select)
пиша така:
mysqli_query(SELEC...)
fetch_object примерно :
$ime = htmlspecialchars(stripslashes($row->ime));
$opisanie = htmlspecialchars(stripslashes($row->opisanie));
така ли ?
Да. НО!
Едва ли не си чувал за prepare, bindparam и разни подобни?
Разгледай примерите в документацията на тази функция: http://php.net/manual/en/mysqli.prepare.php

И се опитай да си преправиш кода както е показано и дай да видим какво си свършил :D, защото вече mysqli real escape е немодерно... :)
По този начин единствената ти грижа ще е да използваш htmlspecialchars при echo-то. Останалата работа по "оная дългата функция" ще я свърши bind_param-функцията (която я има в примерите).

Ако не схванеш само от примерите, търси още примери и уроци относно това:
https://www.google.bg/search?q= каза:
mysqli prepared statements
 
А каква е разликата ако вкарвам така:

htmlspecialchars(addslashes(trim($_POST['name'])));

и изкарвам просто с $row->name;

без mysqli_real_escape_string
оня пич го е написал по-горе всъщност ...
Но реално ако използвам:

htmlspecialchars(addslashes(trim($_POST['name'])))

би трябвало да съм защитен?
 
stoqnski каза:
А каква е разликата ако вкарвам така:

htmlspecialchars(addslashes(trim($_POST['name'])));

и изкарвам просто с $row->name;
Не си първият, който се пита за това :)
http://stackoverflow.com/questions/4882307/when-to-use-htmlspecialchars-function
stackoverflow каза:
You should only call this method when echoing the data into HTML.

Don't store escaped HTML in your database; it will just make queries more annoying.
The database should store your actual data, not its HTML representation.

Ето го и моето обяснение: ако по някаква причина в DB-то имаш записани html тагова, когато ги изараш, те няма да са филтрирани.

Това, на което ти разчиташ, е, че само ти ще добавяш данни. Затова си сигурен, че те са филтрирани. Но ако не са?
А и ако в бъдеще ти се наложи да редактираш записаните данни, ще е много по-лесно, ако са записани в чист вид.
 
До сега гледах уроците на gatakka .
Доколкото разбрах мога да се защитя от инжекциите на анонимните :D
с нещо такова:

$ime = mysqli_real_escape_string($con,$_POST['ime']);

При Insert .

И като го вади със SELECT не използва никакви stripslashesh и т.н. ами просто $row[ime] ...

Тези mysqli prepared stmt... са хубаво нещо , но нищо не ми пречило да си карам с по-горния код .

горния код ми давал 99.9% защита от sql injection-и ,което ме устройва напълно :D , сега трябва да се защитя от XSS ли и как ?
 
Тези mysqli prepared stmt... са хубаво нещо , но нищо не ми пречило да си карам с по-горния код .
Да, така е.
Просто ако ти се наложи на 10 променливи да слагаш mysql real escape ще бъде досадно.

сега трябва да се защитя от XSS ли и как ?
Чети по-внимателно: :D:D http://web-tourist.net/forum/viewtopic.php?t=127665#661797

Има две неща. Едното е sql injection, а другото е xss.

mysql escape string блокира sql injection
html special chars блокира xss
[Edit:] Може да ползваш htmlentities вместо последното:
http://stackoverflow.com/questions/3623236/htmlspecialchars-vs-htmlentities-when-concerned-with-xss
 
Да сложа на 10 променливи real_.... не е досадно , досадно е при всяко изкарване да сложа htmlspecialchars на всеки $row :(
 

Back
Горе