Функция PHP для замены символов на коды символов, чтобы остановить SQL-инъекцию - PullRequest
1 голос
/ 15 июня 2009

Я пытаюсь написать функцию php, чтобы остановить попытки внедрения MySQL. Что я делаю, так это использую str_replace () для удаления символов и замены их кодом символов HTML Моя проблема в том, что все коды содержат & #; но я также хочу заменить эти символы их кодами. Как я могу сделать это, не меняя код на что-то вроде:

&#38&#59;&338&#59;#35&#59;32&#59;

Вот моя функция:

function replaceSymbols( $text )
{
   $text = str_replace( '#', '&#35', $text );
   $text = str_replace( '&', '&' $text ); 
   $text = str_replace( ';', '&#59', $text );

   $text = str_replace( ' ', ' ' $text );
   $text = str_replace( '!', '!' $text );
   $text = str_replace( '"', '"' $text );   
   $text = str_replace( '$', '$' $text );
   $text = str_replace( '%', '%' $text );  
   $text = str_replace(  "'" '&#39', $text );
   $text = str_replace( '(', '(' $text );
   $text = str_replace( ')', ')' $text );
   $text = str_replace( '*', '*' $text );   
   $text = str_replace( '+', '&#43', $text );
   $text = str_replace( ',', ',' $text );
   $text = str_replace( '-', '-' $text );
   $text = str_replace( '.', '.' $text );   
   $text = str_replace( '/', '&#47', $text );
   $text = str_replace( ':', ':' $text );   
   $text = str_replace( '<', '&#60;' $text );
   $text = str_replace( '=', '&#61;' $text );
   $text = str_replace( '>', '&#62;' $text );   
   $text = str_replace( '?', '&#63', $text );
   $text = str_replace( '[', '&#91', $text );
   $text = str_replace( '\\', '&#92;' $text );
   $text = str_replace( ']', '&#93;' $text );
   $text = str_replace( '^', '&#94;' $text );   
   $text = str_replace( '_', '&#95', $text );
   $text = str_replace( '`', '&#96', $text );
   $text = str_replace( '{', '&#123;' $text );
   $text = str_replace( '|', '&#124;' $text );   
   $text = str_replace( '}', '&#125', $text );
   $text = str_replace( '~', '&#126', $text );

   return $text;

}

Ответы [ 6 ]

11 голосов
/ 15 июня 2009

Вы смотрели на mysql_real_escape_string?

Выход из специальных символов в неэкранированная строка с учетом текущий набор символов соединение, чтобы его можно было безопасно разместить это в mysql_query ().

3 голосов
/ 15 июня 2009

Есть ли причина, по которой mysql_real_escape_string ($ text) не удовлетворяет вашим потребностям?

2 голосов
/ 15 июня 2009

Другие упоминали mysql_real_escape_string(), который работает очень хорошо. Если вы действительно хотите конвертировать в сущности, взгляните на htmlentities(). Если это все еще не конвертирует все символы, которые вы хотите, вы также можете использовать strtr() примерно так:

$entities = array(
    '#' => '&#35;',
    '&' => '&#38;',
    ....
);

$converted = strtr($input, $trans);
1 голос
/ 15 июня 2009

не пытайтесь решить такие фундаментальные проблемы - они уже решены. за исключением случаев, когда вы хотите изучить основы, но не использовать свои решения в производственной среде. проблема с запросом решена с помощью mysql_real_escape_string или параметризованных запросов, и это работает. Домашние решения часто имеют тонкие ошибки или особенности, которые делают их бесполезными. сейчас я не могу найти статью, но Джефф Этвуд из «ужаса кодирования» (или это был Джоэл?) написал о друге, который попытался выполнить свою собственную функцию strip_tags ... и потерпел неудачу. в последнее время то же самое относится и к шифрованию: доморощенный сбой почти всегда.

ваш метод:
... не очень подходит для поставленной задачи, потому что классическое экранирование строк полностью обратимо, в то время как ваш метод является односторонней функцией (не связанной с хешированием ^^).

0 голосов
/ 15 июня 2009

Я настоятельно советую вам следовать стандартным решениям, опубликованным другими, например, mysql_real_escape_string(). Тем не менее, ваша функция имеет серьезные недостатки. Когда вы что-то защищаете, ваша политика по умолчанию должна быть запрещать по умолчанию . Это означает, что вы предполагаете, что любой заданный ввод или запрос является атакой, а затем изучаете ввод и, если вы можете определить, что что-то определенно является не атакой, разрешите это. В контексте вашей функции это будет означать, что вы проверяете, содержит ли ввод набор известных, приемлемых символов, и избегаете всего остального. псевдокод:

function replaceSymbols(text):
    result = ""
    for each character c in text:
       if isalpha(c) or isdigit(c):
           append c to result
       else
           append escape(c) to result
    return result
0 голосов
/ 15 июня 2009

Почему вы не используете заполнители? ЛЮБОЙ вид экранирующей схемы не будет работать ни потому, что вы что-то забыли, либо потому, что внезапно вы захотите выводить данные в каком-то другом формате (где сущности символов HTML больше не работают).

В зависимости от драйвера, помимо безопасности, вы также можете получить дополнительные дополнительные преимущества от местозаполнителей, такие как более быстрая передача по сети (числа, передаваемые как собственные целые числа, числа с плавающей запятой и т. Д. Вместо строк) и анализ, скорость сети увеличивается благодаря использованию подготовленных операторов.

ОБНОВЛЕНИЕ По-видимому, интерфейс mysql_ не поддерживает заполнители. Это в основном означает, что это не безопасно и не подходит для любого типа развертывания, ищите другой драйвер.

...