Пользовательский ввод в базу данных - PullRequest
2 голосов
/ 22 ноября 2011

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

Ответы [ 3 ]

3 голосов
/ 22 ноября 2011

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

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

Например, Zend Famework использует этот движок.

1 голос
/ 22 ноября 2011

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

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

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

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

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

0 голосов
/ 22 ноября 2011

Если вы используете регулярное выражение для сопоставления с допустимым вводом, и оно успешно выполняется, то пользовательский ввод действителен.Тем не менее, если в допустимом вводе нет вредоносных символов (в частности, кавычек или потенциально многобайтовых символов), вам не нужно вызывать 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, как только* успешно.

...