2010-07-05 2 views
5

У меня есть простая форма обратной связи PHP, которую я хотел бы улучшить, добавив данные $ _SERVER [HTTP_USER_AGENT] в строку в базе данных, которую я сохраняю.Как сохранить PHP HTTP_USER_AGENT в поле MySQL

Я продолжаю получать ошибки разбора при попытке простой вставки, передавая '$ _SERVER [HTTP_USER_AGENT]' в качестве типичной строки. Должен ли я связать его каким-то образом, чтобы символы, используемые в этой переменной сервера, не вызывали такие ошибки?

(Запрос INSERT прекрасно работает без этой области, кстати.)

Спасибо.

+0

Без ошибочного кода и точных сообщений об ошибках ваш вопрос совершенно бессмыслен. Пожалуйста, научитесь предоставлять такую ​​информацию в будущих вопросах. –

ответ

6

Моя ставка заключается в том, что в строке агента пользователя есть ', вызывающие ошибку анализатора.

Строка User-Agent, возвращаемая PHP, находится под управлением локального браузера, что означает, что вам нужно относиться к ней не иначе, как от обычного ввода пользователя. Злоумышленник или пользователь, зараженный вирусом/трояном/червем, могут изменить строку пользовательского агента, чтобы вызвать атаку SQL-инъекций. По крайней мере, вам нужно сбежать от него (например, с . Моя ставка заключается в том, что как только вы это сделаете, ваши ошибки парсера также должны исчезнуть. Еще лучше попытайтесь перейти на использование prepared statements, если ваша система позволяет это.

+0

Спасибо за объяснение решения и его аргументацию. – Yaaqov

+0

@ Andrew Идеально информировать его об ошибке безопасности. Спасибо, что поделились своими знаниями –

2

ли

mysql_query(" 
INSERT INTO 
    db_table 
VALUES (
    ... 
    '" . mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']) . "' 
    ... 
)"); 

не работает? Можете ли вы показать нам весь свой запрос? Каковы точные ошибки-сообщения?

+0

Вы всегда пишете весь свой код в виде одного оператора? –

+0

Что вы подразумеваете под «единственным оператором»? Если вы имеете в виду это, я не указываю поля и использую только оператор VALUES': ответ «нет», –

0

Без фактического сообщения об ошибке это трудно сказать, какая именно проблема вы столкнулись с.
Но для решения всех возможных вопросов,

  • Прежде всего, вы должны прочитать официальную страницу руководства, чтобы заставить себя понять PHP строк синтаксис: http://php.net/types.string

  • Тогда вы должны понимать, Mysql правильный синтаксис. Я объяснил это уже here

  • Наконец, вы должны поставить все вместе

как это:

$agent = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']); 
$sql = "INSERT INTO `table` set useragent = '$agent'"; 
$res = mysql_query($sql) or trigger_error(mysql_query.$sql); 

Выполнение ваших запросов таким образом, вы никогда не будете иметь никаких проблем. Или, по крайней мере, полное сообщение об ошибке.

Смежные вопросы