Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Анти SQL injection (https://forum.antichat.xyz/showthread.php?t=55520)

guest3297 11.12.2007 07:14

Анти SQL injection
 
Можно легко обезапасить любю cms поставив грамотную фильтрацию, так что если вы не уверненны в своем движке или в чужом просто просто проводите все запросы через эту функцию.

PHP код:

<?

error_reporting
(0);

function 
HLSQL($Query)
{
    
$Query=preg_replace("/(\s{1})(JOIN)/""\\1\nJOIN"$Query);
    
$Query=preg_replace("/([^a-zA-Z]{1})([\d0-9]+)/""\\1<span style=\"color:6666CC\">\\2</span>"$Query);

    
$Query=preg_replace("/('[^']+')/""<span style=\"color:FF9900\">\\1</span>"$Query);
    
$Query=preg_replace("/(#.*\n)/""<span style=\"color:999999\">\\1</span>"$Query);
    
$Query=preg_replace("/FROM[\s+](\S+)\s/""FROM <span style=\"color:339900;text-decoration:underline\">\\1</span> "$Query);

    
$Query=preg_replace("/JOIN[\s+](\S+)\s/""JOIN <span style=\"color:339900;text-decoration:underline\">\\1</span> "$Query);
    
$Query=preg_replace("/(COUNT|SUM)\(([^\)]+)\)/""<span style=\"color:FF0000;font-weight:bold\">\\1</span>(\\2)"$Query);


    
$Query=preg_replace("/\s{1}(FROM|JOIN|GROUP|WHERE|ORDER|LIMIT|AND|ON)\s{1}/"" <span style=\"color:0000FF;font-weight:bold;\">\\1</span> "$Query);
    
$Query=preg_replace("/\s{1}(BY|OR|AS|IN|BETWEEN)\s{1}/"" <span style=\"color:000000;font-weight:bold;\">\\1</span> "$Query);
    
$Query=preg_replace("/(SELECT)/"" <span style=\"color:0000FF;font-weight:bold;\">\\1</span> "$Query);
    
$Query=preg_replace("/\(/""<span style=\"font-weight:bold;\">(</span>"$Query);
    
$Query=preg_replace("/\)/""<span style=\"font-weight:bold;\">)</span>"$Query);


    return 
"<p style=\"color:000000; font-size:12px;\">".nl2br($Query)."</p>";
}

?>


VampiRUS 11.12.2007 07:52

а про placeholders вы не слышали?

XopoIII 11.12.2007 08:02

Цитата:

Сообщение от VampiRUS
а про placeholders вы не слышали?

я не слышал=) обьясняй=)

VampiRUS 11.12.2007 08:09

http://rumchten.rsl.ru/2005/ru/upload/doc/1103016958.doc

XopoIII 11.12.2007 09:09

попробовал эту библиотеку, сразу же застрял кричит ошибка
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in
в этой стрке
PHP код:

$whonline=mysql_fetch_array($user_online); 

до нее
PHP код:

$online =sql_placeholder('SELECT * FROM users_reg WHERE '.time().'-`login_time` <= 60*2');
$user_online mysql_query($online); 


XopoIII 11.12.2007 09:18

пробовал уже и так и этак, эффект одинаковый, но вот если отрубаю библиотеку и ставлю обычные ковычки то все работает=)) бредд

.:EnoT:. 11.12.2007 13:38

Имхо, вполне хватит фильтрации основных опасных символов чтобы противостоять иньекции. ну плюс-минус конечно
PHP код:

<?php
   $query 
$_POST['query'];
   
$query str_replace("'",''$query);
   
$query str_replace('-',''$query);
   
$query str_replace('+',''$query);
   
$query str_replace('/',''$query);
   
$query str_replace('*',''$query);
   
$query str_replace(' ','',$query);
   
$query str_replace('%','',$query);
?>

После фильтрации этих символов sql-инъекция уже и так будет невозможна....Ещё в одном учебнике по php читал что одинарную кавычку лучше не просто фильтровать а заменять на обратную ` .. не знаю насколько эт лучше и сопстна зачем))
Ну Кэш всё равно молодец, лови + :)

VampiRUS 11.12.2007 13:59

ну собственно это я кинул для описания сути placeholders
сам я успользую простенькую функцию, взятую из учебника Котерова, мне пока хватает.

guest3297 11.12.2007 14:17

Цитата:

<?php
$query = $_POST['query'];
$query = str_replace("'",'', $query);
$query = str_replace('-','', $query);
$query = str_replace('+','', $query);
$query = str_replace('/','', $query);
$query = str_replace('*','', $query);
$query = str_replace(' ','',$query);
$query = str_replace('%','',$query);
?>
Если в самой переменной не заданно что данные только пост ac. фильтрацию легко можно обойти постав данные гет.

Macro 11.12.2007 14:29

<?php
$query = $GLOBALS['query'];
$query = str_replace("'",'', $query);
$query = str_replace('-','', $query);
$query = str_replace('+','', $query);
$query = str_replace('/','', $query);
$query = str_replace('*','', $query);
$query = str_replace(' ','',$query);
$query = str_replace('%','',$query);
?>

guest3297 11.12.2007 14:31

фильтры работающие таким образом несовершенны смотри защиту sweb

VampiRUS 11.12.2007 15:03

PHP код:

function sql_query(){
        unset(
$this->result);
        
$args func_get_args();
        
$tmpl =& $args[0];
        
$tmpl str_replace("%""%%"$tmpl);
        
$tmpl str_replace("?""%s"$tmpl);
    
        foreach (
$args as $i=>$v){
            if (!
$i) continue;        // это шаблон
            
if (is_int($v)) continue; // целые числа не нужно экранировать
            
$args[$i] = "'".mysql_real_escape_string($v)."'";
        }

        
$args[count($args)] = 'UNKNOWN_PLACEHOLDER';
        
$query=call_user_func_array("sprintf"$args);
        
$this->result=@mysql_query($query) or die(mysql_error());
        return 
$this->result;
    } 

вот метод класса обёртка, приемущество в том, что нет возможности забыть провести проверку входных данных.

VampiRUS 11.12.2007 17:30

[ cash ]мож я туплю (только сейчас просмотрел код (: ) , непонял назначение т.е. каждый запрос прогоняем и смотрим визуально правильно написали или нет?(хотя подсветка мне понравилась + )
по коду, думаю надо регулярки с модификатором /i
и в [\d0-9]+ помойму что то одно лишнее.

}{0TT@БЬ)Ч 11.12.2007 18:50

вот собственно по сабжу, сам батька nerezus писал)))))
http://forum.antichat.ru/thread30641.html

Digimortal 11.12.2007 19:15

Цитата:

Сообщение от [ cash ]
Можно легко обезапасить любю cms поставив грамотную фильтрацию, так что если вы не уверненны в своем движке или в чужом просто просто проводите все запросы через эту функцию.

PHP код:

<?

error_reporting
(0);

function 
HLSQL($Query)
{
    
$Query=preg_replace("/(\s{1})(JOIN)/""\\1\nJOIN"$Query);
    
$Query=preg_replace("/([^a-zA-Z]{1})([\d0-9]+)/""\\1<span style=\"color:6666CC\">\\2</span>"$Query);

    
$Query=preg_replace("/('[^']+')/""<span style=\"color:FF9900\">\\1</span>"$Query);
    
$Query=preg_replace("/(#.*\n)/""<span style=\"color:999999\">\\1</span>"$Query);
    
$Query=preg_replace("/FROM[\s+](\S+)\s/""FROM <span style=\"color:339900;text-decoration:underline\">\\1</span> "$Query);

    
$Query=preg_replace("/JOIN[\s+](\S+)\s/""JOIN <span style=\"color:339900;text-decoration:underline\">\\1</span> "$Query);
    
$Query=preg_replace("/(COUNT|SUM)\(([^\)]+)\)/""<span style=\"color:FF0000;font-weight:bold\">\\1</span>(\\2)"$Query);


    
$Query=preg_replace("/\s{1}(FROM|JOIN|GROUP|WHERE|ORDER|LIMIT|AND|ON)\s{1}/"" <span style=\"color:0000FF;font-weight:bold;\">\\1</span> "$Query);
    
$Query=preg_replace("/\s{1}(BY|OR|AS|IN|BETWEEN)\s{1}/"" <span style=\"color:000000;font-weight:bold;\">\\1</span> "$Query);
    
$Query=preg_replace("/(SELECT)/"" <span style=\"color:0000FF;font-weight:bold;\">\\1</span> "$Query);
    
$Query=preg_replace("/\(/""<span style=\"font-weight:bold;\">(</span>"$Query);
    
$Query=preg_replace("/\)/""<span style=\"font-weight:bold;\">)</span>"$Query);


    return 
"<p style=\"color:000000; font-size:12px;\">".nl2br($Query)."</p>";
}

?>


>> Можно легко обезапасить любю cms поставив грамотную фильтрацию

с каких это пор функции для подсветки синтаксиса кода стали "грамотной фильтрацией" ? +))

>> просто проводите все запросы через эту функцию.

ога, я бы посмотрел на такую cms.. +)

Meanor 11.12.2007 23:38

А если в каждый скрипт (или в тот, который вызывается в каждом):
PHP код:

foreach ($_GET as $check_url) {
   if (!
preg_match("/[a-zA-Z0-9]/",$check_url)) {
   die (
"access forbidden");
   }
}
unset(
$check_url); 

Это только для Get, для постов надо настроить по своему регулярное выражение...

k8^cat.YOU 12.12.2007 15:50

2 Enot and Meanor, use $_REQUEST.

$query = $_POST['query']; -> $query = $_REQUEST['query'];
....

foreach ($_REQUEST as $check_url)
....

куки, пост, гет, файл - все в одной куче ;)


PS. хотя..... я права насчет REQUEST или как?

.:EnoT:. 12.12.2007 18:44

Цитата:

2 Enot and Meanor, use $_REQUEST.

$query = $_POST['query']; -> $query = $_REQUEST['query'];
....

foreach ($_REQUEST as $check_url)
....

куки, пост, гет, файл - все в одной куче
Ну это личное дело каждого. Лично я предпочитаю какой метод использую, такой и указываю,мне так проще)

Цитата:

PS. хотя..... я права насчет REQUEST или как?
Насчёт $_REQUEST при использовании POST и GET да.
К кукам это совсем не относится, там HTTP_COOKIE_VARS масть держит))

VampiRUS 13.12.2007 05:06

.:EnoT:. ты отстал от жизни теперь уже $_COOKIE
Цитата:

php.net
Переменные, передаваемые скрипту через HTTP cookies. Аналог старого массива $HTTP_COOKIE_VARS (который по-прежнему доступен, но не рекомендуется).


Время: 21:09