• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела killoff лично.

Помощь запретить голосование за себя

В чем проблема просто передать НИК ? Обычный ник, да можно остослать, но КОМУ НУЖНО РАДИ ЛАЙКА ? Бред использовать не нужные еще запросы.
В чём проблема просто его не передавать и защитить скрипт?

К тому же и правок в коде меньше... Потом на новую версию переходить проще... Логика приложения не меняется и безопасно...

Остальное уже объяснил в посте выше. есть нормы программирования и нарушать их нельзя
 
В чём проблема просто его не передавать и защитить скрипт?

К тому же и правок в коде меньше... Потом на новую версию переходить проще... Логика приложения не меняется и безопасно...

Остальное уже объяснил в посте выше. есть нормы программирования и нарушать их нельзя
А может перепишешь полностью без скрипта ? Там ведь и id новости с комментарием можно подделать и самое главное количество.
 
А может перепишешь полностью без скрипта ? Там ведь и id новости с комментарием можно подделать и самое главное количество.
ID новости и комментария - это волеизъявление пользователя... Собственно, наша задача проверить - имеет ли права он на это и, если да - выполнить запрос.
А вот ID пользователя - это как раз то самое ограничение, по которому проверяется, может ли он это делать или нет.

Надо чётко разделять данные на вводимые пользователем и имеющиеся у скрипта...

Это всё равно, что пульт сигнализации от машины будет передавать не команду и свой уникальный номер (читай куку), а команду и номер машины... Машина должна проверять ключ и решать выполнять команду или нет, а не пульт какой машине он даёт команду...

И ещё раз говорю - не имеет значения критичность и опасность обхода проверки... Все проверки и решения всегда должен принимать только сервер, а пользователь передавать только что он хочет и свою куку. Опасность обхода ты никогда 100% верно не определишь.

С тем же лаком - может быть это сайт с инвайтами и будет конкурс на порше... И именно через эту уязвимость человек выиграет этот порше с перевесом в 1 голос... И твоя уязвимость в 1 лайк превратилась в уязвимость в 3 ляма деревянных...
 
ID новости и комментария - это волеизъявление пользователя...
А по существу уже нечего уже ответить ? Не нравится мой вариант ? Твои проблемы,по твоим же словам запрос полностью можно подделать а это уже получается сам скрипт не безопасен. Не вижу дальше смысла флудить.
 
в первом news_id а во втором просто id вся ошибка у тебя и зачем
Код:
$user_id = $row =
?
PHP:
if ($member_id['user_group'] != 5) {
    if ($col == 'news_id') {
        $select = "SELECT `user_id` FROM " . PREFIX . "_post_extras WHERE news_id = $id";
        $user_id = /*$row =*/ $db->super_query($select);
    } else {
        $select = "SELECT `user_id` FROM " . PREFIX . "_comments WHERE id = $id";
        $user_id = /*$row =*/ $db->super_query($select);
    }
}
 
А по существу уже нечего уже ответить ? Не нравится мой вариант ? Твои проблемы,по твоим же словам запрос полностью можно подделать а это уже получается сам скрипт не безопасен. Не вижу дальше смысла флудить.
В отличии от тебя, я привёл кучу аргументов в пользу безопасного скрипта... С твоей стороны аргументом было лишь то, что можно подделать ID новости, за которую человек голосует... Да и ради бога... Если он имеет права проголосовать за ту новость, но он с тем же успехом кликнет по другому ярлыку и получит тоже самое... Запрос правомерен = выполнен. И пусть он правит как угодно ID статьи - любой правомерный запрос будет выполнен, неправомерный - отклонён. А вот смена юзера приведёт к выполнению неправомерного запроса...

Я уже не знаю как тебе объяснить...

Любые данные, изменить которые пользователь ИМЕЕТ право, можно передавать через GET/POST, любые данные, которые он НЕ ИМЕЕТ право изменять (как в нашем случае автора комментария юзер менять не может, а ID выбранного комментария - может) - передавать нельзя.

Мля, 21 век на дворе, доказываешь, что нужно кодить безопасные скрипты... Докатились...

А вот двойное равенство - да, мой косяк... Спасибо

Итоговый код должен быть таким:
PHP:
<?php
/*
=============================================================================
Easy Like - модуль организации системы лайков для DLE
=============================================================================
Автор:   ПафНутиЙ
URL:     http://pafnuty.name/
twitter: https://twitter.com/pafnuty_name
google+: http://gplus.to/pafnuty
email:   pafnuty10@gmail.com
=============================================================================
*/

// Ввсякие обязательные штуки для ajax DLE
@error_reporting ( E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( 'display_errors', true );
@ini_set ( 'html_errors', false );
@ini_set ( 'error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE );
$count = (int)$_REQUEST['count'];
$news_id = (int)$_REQUEST['news_id'];
$comment_id = (int)$_REQUEST['comment_id'];

if( $news_id < 1 && $comment_id < 1) die( "Hacking attempt!" );

define( 'DATALIFEENGINE', true );
define( 'ROOT_DIR', substr( dirname(  __FILE__ ), 0, -12 ) );
define( 'ENGINE_DIR', ROOT_DIR . '/engine' );

include ENGINE_DIR . '/data/config.php';
include ENGINE_DIR . '/modules/easylike/easylike_config.php';

if( $config['http_home_url'] == "" ) {
    $config['http_home_url'] = explode( "engine/ajax/easylike.php", $_SERVER['PHP_SELF'] );
    $config['http_home_url'] = reset( $config['http_home_url'] );
    $config['http_home_url'] = "http://" . $_SERVER['HTTP_HOST'] . $config['http_home_url'];
}

require_once ENGINE_DIR . '/classes/mysql.php';
require_once ENGINE_DIR . '/data/dbconfig.php';
require_once ENGINE_DIR . '/modules/functions.php';
if ($config['version_id'] > 9.6) {
    dle_session();
} else {
    @session_start();
}


// Финт со скином, чтобы не сабмитить его в форме.
$_REQUEST['skin'] = totranslit($config['skin'], false, false);

if( $_REQUEST['skin'] == "" OR !@is_dir( ROOT_DIR . '/templates/' . $_REQUEST['skin'] ) ) {
    die( "Hacking attempt!" );
}

$user_group = get_vars( "usergroup" );
if( ! $user_group ) {
    $user_group = array ();
    $db->query( "SELECT * FROM " . USERPREFIX . "_usergroups ORDER BY id ASC" );
    while ( $row = $db->get_row() ) {
        $user_group[$row['id']] = array ();
        foreach ( $row as $key => $value ) $user_group[$row['id']][$key] = stripslashes($value);
    }
    set_vars( "usergroup", $user_group );
    $db->free();
}
require_once ENGINE_DIR . '/modules/sitelogin.php';

// Проверяем возможность голосования
if(!$is_logged) $member_id['user_group'] = 5;
if(!$user_group[$member_id['user_group']]['allow_rating']) die(":-(");
// Получаем IP посетителя
$ip = $db->safesql($_SERVER['REMOTE_ADDR']);

// Определяем переменные в запрос.
if ($is_logged) {
    // Если юзер авторизован
    $name = $db->safesql($member_id['name']);
    $where = "user_name = '{$member_id['name']}'";
} else {
    // Если неавторизован
    $name = "";
    $where = "ip ='{$ip}'";
}

// Проверяем лайки у новости или комментария
if ($news_id > 0) {
    $likes = $db->super_query( "SELECT news_id, likes FROM " . PREFIX . "_easylike_count WHERE news_id = $news_id ");
    $like_id = $likes['news_id'];
    $col = 'news_id';
    $id = $news_id;
    $is_comment = false;
}
if ($comment_id > 0) {
    $likes = $db->super_query( "SELECT comment_id, likes FROM " . PREFIX . "_easylike_count WHERE comment_id = $comment_id ");
    $like_id = $likes['comment_id'];
    $col = 'comment_id';
    $id = $comment_id;
    $is_comment = true;
}

if (!$likes['likes']) {
    $likes['likes'] = 0;
}

$user_id['user_id'] = -1;

if (count(explode('.', $ip)) == 4 ) {
    // Если получен IP посетителя - работаем.
    if ($member_id['user_group'] != 5) {
        if ($col == 'news_id') {
            $select = "SELECT `user_id` FROM " . PREFIX . "_post_extras WHERE {$col} = $id";
            $user_id = $db->super_query($select);
        } else {
            $select = "SELECT `user_id` FROM " . PREFIX . "_comments WHERE id = $id";
            $user_id = $db->super_query($select);
        }
    }
    
    if ($member_id['user_id'] != $user_id['user_id']) {
        
        if (!$like_id) {
            // Если записи о лайках нет - добавим.
            $db->query("INSERT INTO " . PREFIX . "_easylike_count ($col, likes) VALUES ($id, '1')");
            $easyLike = setLog($col, $likes['likes'], $id, $name, $ip);
            sendNotify($id, $name, $is_comment);
        } else {
            // Если запись есть, то проверяем, не лайкал ли этот посетитель.
            $select = "SELECT {$col} FROM " . PREFIX . "_easylike_log WHERE {$col} = $id AND {$where}";
            $row = $db->super_query($select);
            
            if ($member_id['user_id'] != $user_id['user_id']) {        
                if (!$row[$col]) {
                    // Если не лайкал - работаем.
                    $db->query("UPDATE " . PREFIX . "_easylike_count SET likes=likes+1 WHERE {$col} ='".$id."'");
                    $easyLike = setLog($col, $likes['likes'], $id, $name, $ip);
                    sendNotify($id, $name, $is_comment);
                } else {
                    // Если лайкал - шлём ему привет :).
                    $easyLike = ':-)';
                }
            }
        }
    }
    else {
        $easyLike = ':-)';
    }
} else {
    // Если IP не получили (бывает такое с ipv6 :)) - показываем грустный смайлик.
    $easyLike = 'bad ip';
}

$db->close();

@header( "Content-type: text/html; charset=" . $config['charset'] );
echo $easyLike;



/**
* Записываем даные в лог
* @param string  $col
* @param integer $count
* @param integer $id
* @param string  $name
* @param string  $ip
*/
function setLog($col = 'news_id', $count = 0, $id = 1, $name = '', $ip = '') {
    global $config, $db;

    $db->query( "INSERT INTO " . PREFIX . "_easylike_log ($col, user_name, ip) values ('$id', '{$name}', '$ip')" );
    if ($config['version_id'] > 9.4) {
        if (($config['allow_alt_url'] && $config['allow_alt_url'] != 'no') && !$config['seo_type']) {
            $cprefix = 'full_';
        } else {
            if ($col == 'comment_id') {
                $row = $db->super_query("SELECT post_id FROM ".PREFIX."_comments WHERE id='{$id}'");
                $id = $row['news_id'];
            }
            $cprefix = 'full_'.$id;
        }
        clear_cache(array('news_', 'rss', $cprefix));
    } else {
        clear_cache();
    }


    return $count + 1;
}


/**
* Отправляем уведомление на почту
* @param  integer $id         ID новости или комментария
* @param  boolean $is_comment Если комментарий - нужно поставить true
* @return  отправка почты
*/
function sendNotify($id = 0, $member_name = 'Гость', $is_comment = false) {
    global $config, $db, $easylikeConfig;

    $id = (int)$id;
    $member_name = ($member_name == '') ? 'Гость' : $member_name ;
    $notSendNotify = false;

    if ($is_comment) {
        $getName = $db->super_query("SELECT post_id, autor FROM ".PREFIX."_comments WHERE id='{$id}'");
    } else {
        $getName = $db->super_query("SELECT autor FROM ".PREFIX."_post WHERE id='{$id}'");
    }
    $userName = $db->safesql($getName['autor']);

    $ml = $db->super_query("SELECT email, name, allow_mail, user_group FROM ".USERPREFIX."_users WHERE name='{$userName}'");

    if (in_array($ml['name'], $easylikeConfig['not_send_email']['users']) || in_array($ml['user_group'], $easylikeConfig['not_send_email']['groups_id'])) {
        $notSendNotify = true;
    }

    if($ml['allow_mail'] && !$notSendNotify) {
        include_once ENGINE_DIR . '/classes/mail.class.php';
        $mail = new dle_mail($config, true);

        if($config['allow_alt_url'] && $config['allow_alt_url'] != 'no') {
            $user_link = $config['http_home_url'] . "user/" . urlencode($member_name) . "/";
        } else {
            $user_link = $config['http_home_url'] . "?subaction=userinfo&amp;user=" . urlencode($member_name);
        }
        $userLinkText = ($member_name == 'Гость') ? "<b>{$member_name}</b>" : "<a href=\"{$user_link}\" target=\"_blank\">{$member_name}</a>";

        // Специально продублировал код для комментария и новости, что бы была возможно сть задавать соё оформление для этих писем.
        if ($is_comment) {
            $mail_subj = $member_name." лайкнул Ваш комментарий!";
            $mail_text = <<<HTML
            <p>Привет, <b>{$ml['name']}</b>!</p>
            <p>Пользователь {$userLinkText} лайкнул Ваш <a href="{$config['http_home_url']}?newsid={$getName['post_id']}#comment-id-{$id}" target="_blank">комментарий</a>.</p>
            <p>---------------------------------------------</p>
            <p><small>&ndash; С наилучшими пожеланиями, администрация <a href="{$config['http_home_url']}" target="_blank">{$config['home_title']}</a></small></p>
HTML;
        } else {
            $mail_subj = $member_name." лайкнул Вашу новость!";
            $mail_text = <<<HTML
            <p>Привет, <b>{$ml['name']}</b>!</p>
            <p>Пользователь {$userLinkText} лайкнул Вашу <a href="{$config['http_home_url']}?newsid={$id}" target="_blank">новость</a>.</p>
            <p>---------------------------------------------</p>
            <p><small>&ndash; С наилучшими пожеланиями, администрация <a href="{$config['http_home_url']}" target="_blank">{$config['home_title']}</a></small></p>
HTML;
        }

        $mail->send($ml['email'], $mail_subj, $mail_text );
    }
}

?>
 
  • Нравится
Реакции: SPoX
Назад
Сверху