Lleo Kaganov недавно возрадовал скриптом голосовалки. Ну, не в обиду одному из моих любимых (not gay!) авторов, затестил я его по второму варианту. Нет, а извините, а как ещё? Если цель - нахождение багов, то надо изначально настраиваться на то, что «скрипт - [далее по тексту]», а иначе заведомо ничего не выйдет.
В общем, затестил я его с двух браузеров под двумя IP-адресами и результат получил несколько странный. С одной стороны, проголосовать повторно скрипт мне не дал. С другой стороны, диагностику выдал несколько невнятную.
А тут ещё дело в том, что Lleo избегает выкладывать исходники своих скриптов на всеобщее обозрение. С одной стороны, оно и правильно бы - не зная исходного кода, труднее искать уязвимости. С другой стороны, это в корне ложно по той же самой причине.
Ладно, выкладываю, как и обещал, скриншот и ключевые фрагменты моей собственной голосовалки:
Далее показываю реализацию голосовалки у меня на obninsk.name:
[вызывающий скрипт]
[...]
if( ($vn!="") && ($qn!="") ) // $qn - номер вопроса, $vn - номер ответа для данного вопроса. Переданы как параметры.
echo "<link rel="stylesheet" href="http://obninsk.name/vote/style.php?qn=$qn">"; //вызываем обработчик голосовалки
[...]
[вызываемый style.php]
[...]
$res=mysql_query("SELECT voted".((int)$vn)." FROM votes WHERE id=".((int)$qn) );
$r=mysql_result($res, 0, $field);
$votedp1=1+$r;
$res=mysql_query("SELECT id FROM voteip WHERE qid=".$qn." AND ip='".$ip."' AND dat='".$dat."'");
if(mysql_num_rows($res)==0) {
$res=mysql_query("INSERT INTO voteip (qid, ip, vn, dat) VALUES (".((int)$qn).", '".$ip."', ".((int)$vn).", '".$dat."')");
mysql_query("UPDATE votes SET voted".((int)$vn)."=".$votedp1." WHERE id=".((int)$qn));
}
echo "<STY"."LE type="text/css"> ";
echo "body { color:red; } ";
echo ".mxvote { font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px;} "; /* height:".$qn."px; width=".$votedp1."px; */
echo "</STY"."LE>";
[...]
И наконец, замечу, что и у моего, и у кагановского, и у большинства других скриптов есть ещё огромный недостаток: жадность. Для того, чтобы увидеть результаты, необходимо проголосовать. Нет голоса - нет результатов! Ну, моему-то скрипту простительно, он писался лет 5 тому назад, тогда на подобные мелочи внимания не обращали, "работает - и ладно". Да и то, как выберу время, непременно займусь переделкой. А то нехорошо получ Откуда посетителю знать, что его голос действительно зачтён, а не выданы цифры с потолка? В связи с последними политическими веяниями, доказывать, что ты не мухлюешь, в рунете приходится на каждом шагу!
Анекдот в тему:
ВЦИОМ провёл опрос "Доверяете ли Вы (безусловно доверяю, почти всегда доверяю, почти никогда не доверяю, не доверяю) опубликованным в российской прессе результатам опросов ВЦИОМ". Подделывать результаты пришлось от балды, так как программы впадали в рекурсию и зависали.