Это безопасный способ фильтрации данных и предотвращения SQL-инъекций и других атак? - PullRequest
3 голосов
/ 07 декабря 2011

Я создал две простые функции для фильтрации вставленных данных до их ввода в запрос mysql.

Для полей формы (я также использую регулярные выражения для проверки каждого поля по отдельности.

// 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; 
}

Затем для идентификаторов (отправленных в 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);
} 

Есть предложения по добавлению или удалению из этих простых функций? И это "безопасно"?

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

Вы используете устаревшую функцию как magic_quotes и ereg_*.Чтобы предотвратить внедрение Sql, вы должны использовать подготовленный оператор (я предлагаю использовать PDO ), а для предотвращения XSS вы должны использовать strip_tags () , как вы делаете.

2 голосов
/ 07 декабря 2011

Используйте параметры в своих запросах вместо конкатенации строки.

Фильтры и очистители обычно недостаточно безопасны.

1 голос
/ 07 декабря 2011

Если вы используете целочисленные идентификаторы, idFilter() можно безопасно сократить до

function idfilter($idfilter) {
  return (int)$idfilter;
} 

Как и предполагали другие, использование параметризованных запросов - правильный путь.

...