Предположим, что мы ожидаем только строки или цифры с данными, отправленными пользователем. Достаточно ли безопасно проверять данные с помощью функций ereg и preg_match? Есть ли способ подделать их? Должны ли мы использовать mysql_real_escape_string?Пользовательский ввод в базу данных
ответ
достаточно безопасно относительно ваших собственных потребностей. Если вы по какой-то причине хотите избежать mysql_real_escape_string, я сначала хочу спросить, почему.
Мой ответ: конечно ... в зависимости от условий
вы можете PREG матч против [0-9a-г] и нечего бояться. Попробуйте передать многобайтовый символ, чтобы быть в безопасности. Пока ваше условие не позволяет вам ничего делать, если совпадение не соответствует вашим требованиям, тогда нет сложной работы, о которой я знаю, чтобы проскальзывать злонамеренными персонажами на таком строгом правиле.
но термин «строка» очень открыт. включает ли пунктуацию? какой вид и т. д. Если вы разрешаете стандартные символы ввода как то, что вы называете «String», тогда мой ответ больше не является уверенным.
Но я все же рекомендую mysql_real_escape_string() для всех представленных пользователем сведений, независимо от того, как вы пытаетесь очистить его перед рукой.
Пятно на, если вы preg_match против только [0-9a-z] ... там не могут быть введены вредоносные данные, насколько я знаю. Но да, я согласен с тем, что все входные данные пользователя не должны быть доверенными и должны всегда быть проверенный - он должен быть практичным, когда это возможно. – Nonym
+1 FWIW, Zend Framework также имеет адаптер для mysqli. –
Я ценю ваш ответ. Но это не отвечает на мой вопрос. – tuze
Согласно вашему первому вопросу: Да, это будет достаточно безопасно. Но вы все равно должны использовать 'mysql_real_escape_string()', потому что вы только человек, как и все мы. В любом случае, используйте PDO, поэтому вам не придется задавать этот вопрос на SO и использовать PDO - очень, очень хорошая практика с PHP. В других языках программирования ** вы не можете делать запрос без определения типа столбца. Использование PDO - элегантный и современный способ использования БД. (извините за мой плохой английский) – Peter
Если вы используете регулярное выражение для соответствия действующему вводу, и оно завершается успешно, то вход пользователя действителен. При этом, если у вас нет вредоносных символов в действительном вводе (в частности, кавычки или потенциально многобайтовые символы), вам не нужно звонить 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
успешно.
Я бы по-прежнему использовал строку mysql_real_escape. Почему нет? Что делать, если вы создаете регулярное выражение? – Galen
@Galen - Это действительно не проблема, особенно для такого простого регулярного выражения. Сдвиг для неопределенного «Что, если ...?» вопрос неосведомлен. Что делать, если вы делаете ** ЛЮБОЮ ** другую ошибку программирования, которая вызывает уязвимость безопасности? Здесь применяется тот же принцип. – nickb
Могу сказать, что нет причин не запускать все через 'mysql_real_escape_string'. – Galen
- 1. Пользовательский ввод в базу данных mySQL
- 2. Ввод в базу данных
- 3. Ввод в базу данных
- 4. Ввод данных в базу данных
- 5. Пользовательский ввод в Python не записывается в базу данных
- 6. Мой PHP код не посылает пользовательский ввод в базу данных
- 7. Пользовательский ввод не добавляется/обновляется в базу данных SQL
- 8. Пользовательский ввод testfields не попадает в базу данных firebase
- 9. Динамический ввод в базу данных
- 10. Сохранить ввод в базу данных
- 11. Ввод данных в нормализованную базу данных?
- 12. ввод полученных данных в базу данных
- 13. PHP - ввод данных в базу данных
- 14. Ввод данных в базу данных многими пользователями
- 15. Ввод скребковых данных в базу данных
- 16. Ввод данных в базу данных и чтение
- 17. Перенос данных из всплывающего оповещения (ввод пользователя) в базу данных
- 18. Spinners - пользовательский ввод
- 19. Ввод ввода радиокнопки в базу данных
- 20. Ввод специальных символов в базу данных
- 21. Ввод даты в базу данных (phpMyAdmin, SQL)
- 22. Ввод пустого значения в базу данных
- 23. Не Ввод значений в базу данных
- 24. django imporperly ввод datetime в базу данных
- 25. CheckBox [Ввод индекса в базу данных]
- 26. Ввод нескольких флажков в базу данных MySQL
- 27. Ввод объекта в мою базу данных C#
- 28. Как сохранить ввод в базу данных
- 29. Запрос на ввод в базу данных Readonly?
- 30. Ввод текущей даты в базу данных
«ereg» является плохим (устаревшим) и обычно обеспечивает правильный тип (отлитие с помощью '(int)') лучше (вы не можете случайно допустить что-то плохое) и даже проще, чем проверка, если у вас нет хорошей библиотеки, выполняющей все валидация для вас. – ThiefMaster