Обход проверки на SQL-inj

Discussion in 'Уязвимости' started by FurA, 16 Nov 2006.

  1. FurA

    FurA Member

    Joined:
    1 Aug 2005
    Messages:
    18
    Likes Received:
    5
    Reputations:
    0
    Доброго времени суток, опять я и опять с вопросом о SQL-inj.

    Есть функция, которая проверяет входящую переменную на banwords. Очень хочется обойти эту проверку. В примудростях MSSQLа я не разбираюсь, поэтому прошу помощи.
    Code:
    function antiinjection($str) {
    	$banwords = array ("'", ",", ";", "--");
    	if ( eregi ( "[a-zA-Z0-9]+", $str ) ) {
    		$str = str_replace ( $banwords, '', strtolower ( $str ) );
    	} else {
    		$str = NULL;
    	}
    	return $str;
    }
    
    Заранее спасибо

    ПиСи
    Еще раз повторюсь - платформа MSSQL
     
  2. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    жестко они :) пробиться вроде никак низя..
    хотя странно они сделали - нафиг одновременно и регулярка на буквы-цифры и еще вырезание спецсимволов, которые никогда не попадут под эту регулярку
     
  3. Alexkz

    Alexkz New Member

    Joined:
    23 Sep 2006
    Messages:
    19
    Likes Received:
    2
    Reputations:
    0
    _Great_, в принципе да, лишнего много, но, видишь,они не сделали эти две фильтрации параллельно, а сделали зависимыми!
    Т.е. если переменная $str содержит НЕ только латинские буквы обоих регистров и цифры
    if ( eregi ( "[a-zA-Z0-9]+", $str ) )
    тогла происходит фильтрация на спец символы!
    Хотя я вообще не пойму зачем такая фильтрация...
    Я считаю переменные нужно фильтровать
    htmlspecialchars() и addslashes()
    В мускуле
    htmlspecialchars() и если идет запись в базу mysql_escape_string()
    Если целлочисленное значение(например id и прочее), тогда только intval() !