mysql_real_escape_string

bunchevi

Registered
От доста време чета за защитата на входно изходните данни и постоянно попадам на противоречиви теми. Тоест не мога да разбера кое е по- добрия вариант- mysql_real_escape_string или addslashes(htmlspecialchars(...))

Някъде прочетох дори че mysql_real_escape_string ще бъде премахнат от PHP 6. Засега за защита на данните съм си направила валидация на полетата за непозволени знаци и после като вкарвам в базата данни информацията минава през mysql_real_escape_string . Мислите ли че трябва да правя допълнителни защити или това е достатъчно?

Също друг въпрос, който не разбрах много е не е ли по- добре да се използва addcslashes вместо addslashes тъй като доколкото прочетох той работи с повече символи.

Trim() трябва ли да се използва също при добавяне на инф. в БД или се използва само при извеждане и такива неща.
 
А извинявам се но забравих и друг въпрос да добавя :) разликата между mysql_real_escape_string и mysqli_real_escape_string ? И въобще защо има такава разлика във функциите, какво значи тя.
 
С две думи накратко:
trim() се ползва при импортиране на данни
mysql_real_escape_string() е по-добрия вариант отколкото htmlspecialchars(addslashes());
 
Добре е trim да го използваш при вкарване на информацията в БД.
Mysql_real_escape_string е за PHP4, в PHP5 използвай PHP PDO
Ето един прост пример на употреба:

Така се прави връзката към базата данни:
Код:
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

// PDO използва Exceptions
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

Ето тук е същинската част, която те предпазва от SQL Injection-ите:
Код:
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();

Трябва да прочетеш единствено за
PDO::__construct, PDO::prepare, PDO::exec, PDO::execute, PDOStatement::bindParam, PDOStatement::fetch и PDOStatement::errorInfo
:)
 
Благодаря за разяснението. В такъв случай ще прочета за нещата които си писал за PDO. Ако има нещо ще питам пак.
 
То trim() се използва за изчистване на интервалите!

А относно mysql_real_escape_string() не прави никаква грешка с nl2br() в повечето случай най-добрия вариант е следния

mysql_real_escape_string(trim(nl2br($promenliva)));
и няма никакви проблеми!

Karcho ако използваш по стара версия на php е нормално да възниква грешка но в версия 5.3.3 всичко работи повече от перфектно!

Поздрави: Радослав.
 
Пробвай да види, дали не ти прецаква nl2br, аз когато имам mysql_real_escape_string (5-та версия ми е не съм идиот) след това като му сложа nl2br и не ми слага <br>-та, ами ми вади \r\n където има нов ред.
 
еми направете си функция nl2br
preg_replace('/\r\n|\n|\r/', '<BR />', $text)
mysql_real_escape_string e по добре от addslashes
Защото addslashes променя кавичките и при показване текста не е същия.
 
Karcho, аз нямам такива проблеми :wink:

agent_bg, това е решение ако не смяташ да правиш промени после.
Ако правиш промени ще ти се визуализират в полето таговете и ще трябва да минаваш стринга през някъв реплейс да ги махнеш, което не е оферта. А и ако целиш да заема по-малко място в базата данни... пак не е оферта да вмъкваш с nl2br. Да не говорим че може да води до кофти резултати при търсене :)
 
Сега гледах да свалям драйвърите за PDO но в php.net пише че вървели само до 5.3 версия. В такъв случай има ли въобще такива които да стават и за после или тези трябва да ползвам. И къде се свалят точно?
 
Работят си и след 5.3, домашния ми сървър е с 5.3.3 и PDO с иработи безотказно :)
Принципно PDO пакетите вървят по подразбиране с инсталацията на PHP, само трябва да ги пуснеш от php.ini и да рестартираш сървъра :)
Виж тук как да си ги пуснеш: http://www.php.net/manual/en/pdo.installation.php
 
А защо пред някои extentions има точка и запетая и има ли значение къде ще ги сложа под extension=php_pdo.dll
 
Като направя промените в php.ini и рестартирам сървъра ми дава че не открива odi.dll и че не може да открие още едно две от тези допълнителни неща които написах- едното беще informix-a.
 
В php.ini " ; " е знак за коментар както # и /**/ :)
Дай си секцията с extension-ите да видим какво има и какво няма :)
Ако може напиши и съдържанието на папката с екстенжъните на PHP и кажи с каква ОС си :)
 
ОС-то ми е windows xp
Съдържанието на php.ini с extension-ите е:
extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_dba.dll
;extension=php_dblib.dll
extension=php_mbstring.dll
extension=php_exif.dll
extension=php_fileinfo.dll
extension=php_gd2.dll
extension=php_gettext.dll
;extension=php_gmp.dll
extension=php_imap.dll
;extension=php_interbase_firebird.dll
;extension=php_interbase_interbase.dll
;extension=php_intl.dll
;extension=php_ldap.dll
extension=php_mcrypt.dll
;extension=php_mssql.dll
;extension=php_mysql_mysqlnd.dll
extension=php_mysql_libmysql.dll
;extension=php_mysqli_mysqlnd.dll
extension=php_mysqli_libmysql.dll
;extension=php_oci8.dll
extension=php_pdo.dll
;extension=php_pdo_dblib.dll
extension=php_pdo_firebird.dll
;extension=php_pdo_firebird_firebird.dll
;extension=php_pdo_firebird_interbase.dll
extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
;extension=php_pdo_mysql_mysqlnd.dll
extension=php_pdo_mysql_libmysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
;extension=php_pdo_sqlite_external.dll
;extension=php_pgsql.dll
;extension=php_pspell.dll
;extension=php_shmop.dll
;extension=php_snmp.dll
extension=php_soap.dll
extension=php_sockets.dll
extension=php_sqlite.dll
extension=php_sqlite3.dll
;extension=php_sybase_ct.dll
;extension=php_tidy.dll
extension=php_xmlrpc.dll
extension=php_zip.dll

[PECL]
;extension=php_apc.dll
;extension=php_dbase.dll
;extension=php_fbsql.dll
extension=php_ming.dll
;extension=php_msql.dll
extension=php_pdflib.dll
;extension=php_pdo_oci.dll
;extension=php_rar.dll

;zend_extension = "C:\Program Files\xampp\php\ext\php_eaccelerator.dll"
;zend_extension = "C:\Program Files\xampp\php\ext\php_xdebug.dll"

а съдържанието на папката с extension-ите на php е:
php_apc.dll
php_bz2.dll
php_curl.dll
php_dba
php_dbase
php_dblib
php_eaccelerator.dll
php_exif
php_fbsql
php_fileinfo
php_gd2
php_gettext.dll
php_gmp
php_imap
php_interbase
php_interbase_firebird
php_interbase_interbase
php_intl
php_ldap
php_mbstring
php_mcrypt
php_ming
php_msql
php_mssql
php_mysql
php_mysql_libmysql
php_mysql_mysqlnd
php_mysqli
php_mysqli_libmysql
php_mysqli_mysqlnd
php_oci8
php_pdflib
php_pdo
php_pdo_dblib
php_pdo_firebird
php_pdo_firebird_firebird
php_pdo_firebird_interbase
php_pdo_mssql
php_pdo_mysql
php_pdo_mysql_libmysql
php_pdo_mysql_mysqlnd
php_pdo_oci
php_pdo_odbc
php_pdo_pgsql
php_pdo_sqlite
php_pdo_sqlite_external
php_pgsql
php_pspell
php_rar
php_shmop
php_snmp
php_soap
php_sockets
php_sqlite3
php_sqlite
php_sybase_ct
php_tidy
php_xdebug
php_xmlrpc
php_zip

Това е.
 
Такам, като за начало си пусни php_curl ( ще ти трябва ) :)
Изглежда, че PDO е пуснат както трябва.
Проблема идва от там, че има пуснати пакети, които ги няма в директорията. Просто коментирай редовете в php.ini (постави ; в началото) и рестартирай.
За работещо PDO ти трябва само php_pdo.dll и php_pdo_mysql.dll (Ако ползваш MySQL )
Ако пак не стане дай грешката, която ти вади при стартиране.
 
Ами аз доколкото виждам curl го имам пуснато, или греша /доколкото разбрах тази ; е коментар а не пускане на нещо/

Сега след като сложих коментар пред тези които ми ги търсеше ми изписва само това съобщение:
Warning: Module 'pdo_mysql' already loaded

пред него пробвах и с коментар и без коментар и все тая, пак си излиза това.
 
Разбирам, че това е на вашия компютър. Може би ще го ползвате за проби.
Може да си инсталирате някой пакет, който съдържа Apache, PHP, MySQL, phpMyAdmin. Такива са XAMPP, WAMP и др.
Аз мога да гарантирам, че WAMP съдържа PDO и е включена по подразбиране.
Но преди това трябва да сте деинсталирали предишня сървър!
Защо сте се насочили към PDO?
 

Back
Горе