PHP-данные санировать
Я новичок в мире кодирования и 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;
}
4 ответов
ваш пример сценария не велик - так называемая очистка строки просто обрезает пробелы с каждого конца. Полагаясь на это, ты быстро попадешь в большие неприятности.
существует не один размер подходит всем решение. Вам нужно применить правильную очистку для вашего приложения, которая будет полностью зависеть от того, какой ввод вам нужен и где он используется. И вы должны дезинфицировать на нескольких уровнях в любом случае - скорее всего, когда вы получаете данные, когда вы их храните и, возможно когда вы это делаете.
стоит прочитать, возможные дураки:
каков наилучший метод очистки пользовательского ввода с помощью PHP?
этот скрипт имеет некоторые полезные функции, но он не делает хорошую работу по дезинфекции!
в зависимости от того, что вам нужно (и хочется принять) вы можете использовать:
abs()
для положительных чисел (обратите внимание, что он принимает поплавки также)preg_replace
('/[^a-zA-Z0-9 .-]/','',$var)
для очистки любых специальных символов из строк илиpreg_replace('/\D/','',$var)
удалить все нецифровые персонажиctype_* functions
например.ctype_digit($var)
filter_var()
иfilter_input()
функцииtype-cast например.
(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 для вставки параметров в ваши запросы.