2010-01-31 3 views
2

У меня есть простая функция javascript для проверки формы (RSform! Pro в Joomla) на submit. Проблема заключается в том, что боты могут отправлять форму без скрипта проверки подлинности, когда они отключены javascript. Единственный вариант, о котором я могу думать, чтобы предотвратить этот случай, - это использовать php вместо javascript. Может ли кто-нибудь помочь мне с этим преобразованием или предложить альтернативу?Преобразование простого сценария Javascript в PHP

function validateEntreeCount(theForm) 
    { 
    if (parseInt(document.getElementById('Attendees').value) != 
parseInt(document.getElementById('Beef').value) + 
parseInt(document.getElementById('Chicken').value) + 
parseInt(document.getElementById('Vegetarian').value)) 
    { 
     alert('The total amount of attendees does not match the total amount of entrees selected'); 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
    } 

Спасибо за вход каждого!

+2

Вы правы, чтобы проверить это на стороне сервера.Никогда, никогда не полагайтесь на JavaScript для обеспечения безопасности; если вы когда-либо передадите такой контроль клиенту, вы просто попрошайничеством за неприятности. – avpx

ответ

2

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

Моей вымышленной HTML страницы, содержащая форму с несколькими типов входных , общее количество участников, число, указывающее, сколько заказов какого типа обеда и кнопка отправки. Обратите внимание, что метод формы: сообщение и действие yourfile.php.

<form name="my_form" method="post" action="yourfile.php"> 
    <input type="text" value="Attendees"></input> 
    <input type="text" value="Beef"></input> 
    <input type="text" value="Chicken"></input> 
    <input type="text" value="Vegetarian"></input> 
    <input type="submit" value="submit"></input> 
</form> 

Ваш PHP-страница, которая будет получать значения формы:

<?php 
    function validateEntreeCount() { 
    // used for validation purposes 
    if (!isset($_POST['submit']) { 
     // form was submitted without data, silly bots. 
    echo "We've encountered a problem, please re-enter your data"; 
     // possible redirect back to the page. 
    }  
    // convert the data into integers. 
    $total = intval($_POST["Attendees"]); 
    $beef = intval($_POST["Beef"]); 
    $chicken = intval($_POST["Chicken"]); 
    $veg  = intval($_POST["Vegetarian"]); 

    // if all is well, everything should be equal 
    if ($total == ($beef + $chicken + $veg)) { 
     return true; 
    } 
    // something went wrong 
     echo "The total amount of attendees does not match the total amount of entrees selected"; 
     return false; 
    } 
?> 

Это не был проверен или скомпилирован, просто демонстрирует, как функция сравнения будет выглядеть в PHP. Есть много вещей, над которыми нужно работать, особенно для проверки ввода и проверки ошибок.

Надеюсь, это поможет вам или направит вас в правильном направлении.

+0

Это сравнение $ должно быть двойным равным (==), иначе оно всегда будет возвращать true. – Matthew

+0

@konforce, спасибо, что указали это, отредактировал мой ответ. –

0

Я не могу помочь с преобразованием прямо сейчас, но для борьбы с ботами вы также можете скрыть кнопку отправки от пользователей и использовать javascript, чтобы включить его на странице.

0

Вам нужно будет найти, где в коде отправляется форма. Но это не идентификатор элемента, который он получает, но имя.
В php вы ищете $ _GET ['name of element'] и $ _POST ['name of element in post request']
Когда у вас есть результат строки, вы можете использовать intval ('') для преобразования в a int

1

Я бы сказал, что всегда полезно иметь валидацию как на стороне клиента (с javascript), так и на стороне сервера (с помощью того, что вы используете).

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

Я думаю, что словом здесь является изящная деградация. Я имею в виду, что вы можете использовать свой сайт без javascript, даже если у вас не было такого опыта, как если бы вы его использовали. И формы для этого не нужны, особенно из-за важности очистки данных, прежде чем вы сможете реально ее использовать.

1

Вы можете пойти что-то вроде этого:

function validateEntreeCount() 
{ 
if (intval($_POST['Attendees']) != 
intval($_POST['Beef']) . 
intval($_POST['Chicken']) . 
intval($_POST['Vegetarian'])) 
{ 
    print('The total amount of attendees does not match the total amount of entrees selected'); 
    // exit/redirect/return false or whatever 
} 
else 
{ 
    return true; 
} 
} 

Вы убедитесь, что значения в вар POST приходят туда. а также, если вы сравниваете цифры, вам нужно указать +, а не точку, как показано выше.

Смежные вопросы