2011-11-21 2 views
2

Предположим, что мы ожидаем только строки или цифры с данными, отправленными пользователем. Достаточно ли безопасно проверять данные с помощью функций ereg и preg_match? Есть ли способ подделать их? Должны ли мы использовать mysql_real_escape_string?Пользовательский ввод в базу данных

+0

«ereg» является плохим (устаревшим) и обычно обеспечивает правильный тип (отлитие с помощью '(int)') лучше (вы не можете случайно допустить что-то плохое) и даже проще, чем проверка, если у вас нет хорошей библиотеки, выполняющей все валидация для вас. – ThiefMaster

ответ

1

достаточно безопасно относительно ваших собственных потребностей. Если вы по какой-то причине хотите избежать mysql_real_escape_string, я сначала хочу спросить, почему.

Мой ответ: конечно ... в зависимости от условий

вы можете PREG матч против [0-9a-г] и нечего бояться. Попробуйте передать многобайтовый символ, чтобы быть в безопасности. Пока ваше условие не позволяет вам ничего делать, если совпадение не соответствует вашим требованиям, тогда нет сложной работы, о которой я знаю, чтобы проскальзывать злонамеренными персонажами на таком строгом правиле.

но термин «строка» очень открыт. включает ли пунктуацию? какой вид и т. д. Если вы разрешаете стандартные символы ввода как то, что вы называете «String», тогда мой ответ больше не является уверенным.

Но я все же рекомендую mysql_real_escape_string() для всех представленных пользователем сведений, независимо от того, как вы пытаетесь очистить его перед рукой.

+0

Пятно на, если вы preg_match против только [0-9a-z] ... там не могут быть введены вредоносные данные, насколько я знаю. Но да, я согласен с тем, что все входные данные пользователя не должны быть доверенными и должны всегда быть проверенный - он должен быть практичным, когда это возможно. – Nonym

3

Это будет короткий ответ ...

Использование PDO:

Например Zend famework использует этот двигатель.

+1

+1 FWIW, Zend Framework также имеет адаптер для mysqli. –

+2

Я ценю ваш ответ. Но это не отвечает на мой вопрос. – tuze

+0

Согласно вашему первому вопросу: Да, это будет достаточно безопасно. Но вы все равно должны использовать 'mysql_real_escape_string()', потому что вы только человек, как и все мы. В любом случае, используйте PDO, поэтому вам не придется задавать этот вопрос на SO и использовать PDO - очень, очень хорошая практика с PHP. В других языках программирования ** вы не можете делать запрос без определения типа столбца. Использование PDO - элегантный и современный способ использования БД. (извините за мой плохой английский) – Peter

0

Если вы используете регулярное выражение для соответствия действующему вводу, и оно завершается успешно, то вход пользователя действителен. При этом, если у вас нет вредоносных символов в действительном вводе (в частности, кавычки или потенциально многобайтовые символы), вам не нужно звонить mysql_real_escape_string. Тот же принцип применим и к чему-то вроде:

$user_in_num = intval($_POST['in_num']); // Don't need mysql_real_escape_string here 

Так что-то вроде следующего:

$subject = $_POST['string_input']; 
if(!preg_match('/[^a-z0-9]/i', $subject)) 
{ 
    exit('Invalid input'); 
} 

Это нормально/безопасно использовать $subject в запросе SQL, как только preg_match успешно.

+0

Я бы по-прежнему использовал строку mysql_real_escape. Почему нет? Что делать, если вы создаете регулярное выражение? – Galen

+0

@Galen - Это действительно не проблема, особенно для такого простого регулярного выражения. Сдвиг для неопределенного «Что, если ...?» вопрос неосведомлен. Что делать, если вы делаете ** ЛЮБОЮ ** другую ошибку программирования, которая вызывает уязвимость безопасности? Здесь применяется тот же принцип. – nickb

+0

Могу сказать, что нет причин не запускать все через 'mysql_real_escape_string'. – Galen

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