Я создал две простые функции для фильтрации вставленных данных до того, как они были введены в запрос mysql.
Для formfields (я также использую регулярные выражения для проверки каждого поля отдельно.
// Form filter function filter($var) { // HTML is not allowed $var = strip_tags(trim($var)); // Check magic quotes and stripslashes if(get_magic_quotes_gpc()) { $var = stripslashes($var); } // Not using it right now, is it recommended? // $var = htmlentities($var, ENT_QUOTES); // Escape $var = mysql_real_escape_string($var); // Return return $var; }
Затем для id (отправлено в URL) я использую этот фильтр:
// ID filter function idfilter($idfilter) { // Delete everything except numbers $idfilter = ereg_replace("[^0-9]", "", $idfilter); // Round numbers $idfilter = round($idfilter); // Test if the input is indeed a number if(!is_numeric($idfilter) || $idfilter % 1 != 0) { $idfilter = 0; } // Filter using the formfilter (above) return filter($idfilter); }
Есть ли предложения добавить или снять эти простые функции? И это «безопасно»?
Вы используете устаревшую функцию как magic_quotes
и ereg_*
. Чтобы предотвратить инъекцию Sql, вы должны использовать подготовленный оператор (я предлагаю использовать PDO ), и для предотвращения XSS вы должны использовать strip_tags (), как вы это делаете.
Используйте параметры в своих запросах вместо конкатенации строки.
Фильтры и очистители обычно недостаточно безопасны.
Если вы используете целые идентификаторы idFilter()
можно безопасно удалить до
function idfilter($idfilter) { return (int)$idfilter; }
Как предложили другие, использование параметризованных запросов – это правильный путь.