Личный Вопрос для ax64: К предыдущему вопросу... (php+mysql)

программирование базы данных

К вопросу: http://otvety.google.ru/otvety/thread?tid=30637f640c3537cc
из phpinfo:
magic_quotes_gpc On On
magic_quotes_runtime Off Off
magic_quotes_sybase Off Off

Тогда каким образом обезопасить поля ввода, если не через mysql_real_escape_string()?

Примечание:
Что-то вроде того?

if (!get_magic_quotes_gpc()) {
$test = addslashes($test);
}

Примечание:
ax64, спасибо за развернутый ответ!

К сожалению, мне, как новичку в этом деле, пока не особо понятны все аспекты. Однако, мне посоветовали (знакомые программисты) во всех запросах к БД использовать mysql_real_escape_string().

Ситуация следующая: magic_quotes я отключил, теперь у меня все данные в запросах к бд отсылаются через mysql_real_escape_string(). И все, вроде бы, замечательно (ну, на первый взгляд), только не могу понять, в чем у меня косяк теперь...

Регистрирую пользователя 1'2'3, в БД он также заносится как 1'2'3. На сайте у меня используется вывод данных через htmlspecialchars(), и в некоторых местах данные выводятся корректно (то есть логин выводится как 1'2'3), а в некоторых - не выводится совсем, либо только цифра 1. Ошибку пишет следующую:

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 1 on MySQL result index 14 in /home/l/lukonin/linuksoidi.rf/public_html/myprofile.php on line 38

Выдержка из myprofile.php:

if( isset( $_COOKIE['time'] ) && isset( $_COOKIE['user_login'] ) && check() == TRUE )
{
$profiledatasearch = mysql_query( "SELECT user_login, user_f, user_i, user_o, user_mail FROM users WHERE user_login = '" . mysql_escape_string( $_COOKIE['user_login'] ) . "' LIMIT 1" );
$username = htmlspecialchars(mysql_result($profiledatasearch, $username, user_login));
$user_f = htmlspecialchars(mysql_result($profiledatasearch, $user_f, user_f));
$user_i = htmlspecialchars(mysql_result($profiledatasearch, $user_i, user_i));
$user_o = htmlspecialchars(mysql_result($profiledatasearch, $user_o, user_o));
$user_mail = htmlspecialchars(mysql_result($profiledatasearch, $user_mail, user_mail));

echo
"На этой странице Вы можете изменить свои регистрационные данные, <a href='/профиль'>$username</a>."

Далее следует таблица, в одной из строк которой присутствует переменная $username.

38-я строка - это следующий код:
$username = htmlspecialchars(mysql_result($profiledatasearch, $username, user_login));

В этом случае не выводятся значения $username.

Пробовал заменить просто на:
$username = htmlspecialchars($username);

Тогда в первом случае выводится правильно, а во втором (в поле таблицы) выводится только цифра 1.

Что не так? И правильно ли (логически) я строю защиту?

Примечание:
Я так понимаю, что здесь опять надо через спецфункции аргументы к mysql_result подставлять... Вот только не пойму через какие... С нормальными логинами все работает прекрасно, а вот где кавычки встречаются, там фиг, ошибку выдает.

Примечание:
Фух, все, разобрался (вроде бы)... по крайней мере, теперь ошибок не выдает.

Сделал так:

if( isset( $_COOKIE['time'] ) && isset( $_COOKIE['user_login'] ) && check() == TRUE )
{
$pro = mysql_query( "SELECT user_f WHERE user_login = '" . mysql_escape_string( $username ) . "' LIMIT 1" );
echo $pro;
$profiledatasearch = mysql_query( "SELECT user_f, user_i, user_o, user_mail FROM users WHERE user_login = '" . mysql_escape_string( $username ) . "' LIMIT 1" );
$username = htmlspecialchars($username);
$user_f = htmlspecialchars(mysql_result($profiledatasearch, $user_f, user_f));
$user_i = htmlspecialchars(mysql_result($profiledatasearch, $user_i, user_i));
$user_o = htmlspecialchars(mysql_result($profiledatasearch, $user_o, user_o));
$user_mail = htmlspecialchars(mysql_result($profiledatasearch, $user_mail, user_mail));

echo
"На этой странице Вы можете изменить свои регистрационные данные, <a href='/профиль'>$username</a>.
}

Однако, там, где поле таблицы, идет value='$username', и в итоге выдается только 1, т.к. следующая кавычка закрывает значение value.

Epsiloncool, чем правильнее? Я, например, во всех запросах к бд наоборот убираю одинарные наклонные кавычки.

Примечание:
Эм... просто value написал без кавычек, теперь работает нормально. То есть:
<td ... value=$username>
Ответы:
если следующие данные установлены в ON, происходит следующее:
magic_quotes_gpc — автоматическое закавычивание входных данных ($_GET, $_POST, $_COOKIE)
magic_quotes_runtime — автоматическое закавычивание данных, принимаемых во время выполнения (например, данные из mysql)
magic_quotes_sybase — используются кавычки в стиле Sybase (одинарная кавычка заменяется на 2 одинарных: '' вместо \')
$username = htmlspecialchars(mysql_result($profiledatasearch, $username, user_login));
Ещё одно правило:


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.