2010-09-11 2 views
2

Этот вопрос развивался в моем сознании, как полностью остановить пользователей от ввода каких-то сумасшедших инъекций SQL. не является mysql_real_escape_string достаточно мощным, чтобы остановить его? Я следил за некоторыми рекомендациями, хотя здесь были некоторые пользователи, которые критиковали мой код и давали мне большие пальцы для безопасности. я не мог понять причину этого. хотя я не использую $ _GET, единственный пользовательский ввод - через систему комментариев. Я просто хочу убедиться, что я не ошибаюсь. вот мой пример кода.Помогите мне остановить пользователя от ввода вредоносных кодов

$name = htmlspecialchars(strip_tags(mysql_real_escape_string($_POST['com_name']))); 

Я использовал то же самое для некоторых 5 полей. что вы берете на себя над моим кодом?

ответ

1

Идея состоит не в том, чтобы запретить пользователям входить в нее, а в том, чтобы безопасно вводить их в запрос базы данных. Это означает, что с помощью mysql_real_escape_string или с помощью параметризованных запросов с mysqli:

/* Prepare an insert statement */ 
$query = "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)"; 
$stmt = mysqli_prepare($link, $query); 

mysqli_stmt_bind_param($stmt, "sss", $val1, $val2, $val3); 

Вы также должны убедиться, что ваши правильно HTML поля закодировать вы считанных из базы данных, чтобы избежать этого, пользователь может вводить HTML (а также Javascript)

+0

Я не хочу, чтобы мой пользователь вводил какие-либо коды html или javascript, это должен быть просто обычный текст по крайней мере для этого проекта. разве вы не думаете, что мой код заботится об этом? –

+0

Ваш общий код должен позволять пользователю вставлять любые (действительные) данные в БД. Если вам нужна дополнительная фильтрация, вы должны сделать это на отдельной фазе проверки, а не при вводе ее в базу данных. – Quamis

+0

@Quamis Я предполагаю, что это то, что я делаю, я сначала фильтрую код, а затем передаю его в базу данных, я никогда не передавал его непосредственно в базу данных. исправьте меня, если я ошибаюсь. –

2

Если вы вводите пользовательский ввод в базу данных, то достаточно mysql_real_escape_string. Еще лучше, используйте подготовленные заявления - PDO или MySQLi.

Если вы просто отображение пользовательских данных на странице, вы должны использовать htmlspecialchars() или htmlentities()

Что касается коды вы публикуемая. Давайте сломаем его.

  • htmlspecialchars - преобразует HTML символов в соответствующие субъект.
  • strip_tags - Полоски HTML и PHP тегов из кода
  • mysql_real_escape_string - ускользает символов перед входом DB.

Итак, как вы можете видеть, первые две функции, которые вы используете, кажутся скорее контрпродуктивными. Вы создаете HTML-символы в сущности, но вы также снимаете теги.

Чтобы убедиться, что вы обеспечиваете ввод пользователя перед вводом БД mysql_real_escape_string, этого будет достаточно. Или, как я упоминал ранее, используйте подготовленные заявления.

+0

mysql_real_escape_string не хватит. mysql_real_escape_string ** плюс кавычки ** будет –

2

Возможно, ваш вызов mysql_real_escape_string не удастся, если соединение с вашей базой данных невозможно найти или создать.

Я стараюсь, чтобы такие звонки были как можно глубже, прежде чем я действительно выполнил запрос. Это может немного уйти от моей производительности, но мне не нужно беспокоиться о том, что вам не хватает параметра выше (относительно SQL-инъекции), и я знаю, что у меня всегда есть действующее соединение с базой данных в этой точке.

Первое, что я делаю на всех входах пользователя, это запустить через filter_var с FILTER_SANITIZE_SPECIAL_CHARS, прежде чем что-либо делать с ним.

+0

нечего убивать ни одной производительности, но вы не видите правильную причину, чтобы положить экранирование «прямо перед запросом». Дело не в том, что для входных данных необходимо ускользнуть, как думают все в этом бедном мире. Но для SQL-запроса. Таким образом, прямо перед запросом - ТОЛЬКО возможное место. –

+0

Ах да, я вижу, что ты выходишь. Спасибо, что указали, что не так очевидно, как должно быть. :) – 2010-09-11 14:20:51

2

Нет, ваш код не совсем безопасен и даже менее чувствителен.

a complete answer about SQL injections I posted before
Одним словом, mysql_real_escape_string сам по себе не защищает. Он работает, только если вы поместите свои данные в кавычки.

Что касается htmlspecialchars/strip_tags, то оба они вообще не имеют никакого отношения к SQL, это защита HTML, а не SQL. И использование обоих из них является избыточным. Просто одного из них достаточно. Я бы предпочел htmlspecialchars.

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