Я новичок в мире кодирования, поэтому PHP хотел бы узнать, как лучше всего дезинфицировать данные формы, чтобы избежать неправильных страниц, инъекций кода и тому подобного. Является ли пример сценария, который я нашел ниже хорошего примера?
Код, первоначально опубликованный по адресу http://codeassembly.com/How-to-sanitize-your-php-input/
/** * Sanitize only one variable . * Returns the variable sanitized according to the desired type or true/false * for certain data types if the variable does not correspond to the given data type. * * NOTE: True/False is returned only for telephone, pin, id_card data types * * @param mixed The variable itself * @param string A string containing the desired variable type * @return The sanitized variable or true/false */ function sanitizeOne($var, $type) { switch ( $type ) { case 'int': // integer $var = (int) $var; break; case 'str': // trim string $var = trim ( $var ); break; case 'nohtml': // trim string, no HTML allowed $var = htmlentities ( trim ( $var ), ENT_QUOTES ); break; case 'plain': // trim string, no HTML allowed, plain text $var = htmlentities ( trim ( $var ) , ENT_NOQUOTES ) ; break; case 'upper_word': // trim string, upper case words $var = ucwords ( strtolower ( trim ( $var ) ) ); break; case 'ucfirst': // trim string, upper case first word $var = ucfirst ( strtolower ( trim ( $var ) ) ); break; case 'lower': // trim string, lower case words $var = strtolower ( trim ( $var ) ); break; case 'urle': // trim string, url encoded $var = urlencode ( trim ( $var ) ); break; case 'trim_urle': // trim string, url decoded $var = urldecode ( trim ( $var ) ); break; case 'telephone': // True/False for a telephone number $size = strlen ($var) ; for ($x=0;$x<$size;$x++) { if ( ! ( ( ctype_digit($var[$x] ) || ($var[$x]=='+') || ($var[$x]=='*') || ($var[$x]=='p')) ) ) { return false; } } return true; break; case 'pin': // True/False for a PIN if ( (strlen($var) != 13) || (ctype_digit($var)!=true) ) { return false; } return true; break; case 'id_card': // True/False for an ID CARD if ( (ctype_alpha( substr( $var , 0 , 2) ) != true ) || (ctype_digit( substr( $var , 2 , 6) ) != true ) || ( strlen($var) != 8)) { return false; } return true; break; case 'sql': // True/False if the given string is SQL injection safe // insert code here, I usually use ADODB -> qstr() but depending on your needs you can use mysql_real_escape(); return mysql_real_escape_string($var); break; } return $var; }
Ваш примерный сценарий невелик – так называемая санитация строки просто обрезает пробелы с каждого конца. Опираясь на это, вы быстро столкнетесь с множеством проблем.
Существует не один размер подходит для всех решений. Вам необходимо применить правильную санитацию для вашего приложения, которая будет полностью зависеть от того, какой ввод вам нужен и где он используется. И вы должны санировать на нескольких уровнях в любом случае – скорее всего, когда вы будете получать данные, когда вы храните их и, возможно, когда вы их визуализируете.
Стоит прочитать, возможные обманы:
Каков наилучший метод для дезинфекции пользовательского ввода с помощью PHP?
Чистая и безопасная строка в PHP
У этого сценария есть несколько приятных функций, но он не делает хорошую работу по санированию!
В зависимости от того, что вам нужно (и хотите принять), вы можете использовать:
abs()
для положительных чисел ( обратите внимание, что он также принимает поплавки )
preg_replace
('/[^a-zA-Z0-9 .-]/','',$var)
для очистки любых специальных символов из строк или preg_replace('/\D/','',$var)
до удалить все символы без цифр
ctype_* functions
например. ctype_digit($var)
filter_var()
и filter_input()
тип-литой, например. (int)$_GET['id']
конвертировать, например. $id=$_GET['id']+0;
Как правило, если вы используете PHP и MySQL, вы захотите дезинформировать данные, поступающие в MySQL, следующим образом:
$something = mysql_real_escape_string($_POST['your_form_data']);
http://php.net/manual/en/function.mysql-real-escape-string.php
Это не плохо.
Для SQL лучше было бы избежать необходимости рисковать сценарием вообще, используя PDO для вставки параметров в ваши запросы.