2013-08-02 2 views
0

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

initialize() запускается при загрузке, поэтому переменная величина получается довольно скоро в загрузке страницы.

function initialize() { 
    quantity = parseInt(document.getElementById('shipping_quantity').value); 
} 

Затем я получаю скорость доставки, запрашивая db с условием для ставки.

getRate(){ 
    var rate = ''; 
    $.post('getrate.php', {state: state}, function(data){ 
     rate = parseInt(data); 
     $("input#shipping_rate").val('$' + rate); 

Вот getrate.php

<? 
include_once ('includes/config.php'); 
$state = "OK"; 
if(isset($_POST['state'])){ $state = $_POST['state'];} 
$con = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD); 
$st = $con->prepare('SELECT rate FROM freight WHERE administrative_area_level_1 = :state'); 
$st->bindParam(':state', $state, PDO::PARAM_STR, 2); 
$st->execute(); 
$row = $st->fetch(); 
$rate = $row['rate']; 
echo $rate; 
?> 

И как общая доставка перерабатывается происходит на последней части функции

var total = (rate * quantity); 
    $("input#shipping_total").val('$' + total); 
}); 

getRate() Когда я положил все это вместе он работает, но я обеспокоен тем, что количество может быть изменено до того, как сумма будет рассчитана.

Я подумываю о том, чтобы отправить почтовую форму и вернуться к себе после расчета в php тарифах.

Пример, на который я смотрю.

Shopping Cart Tutorial

+0

Да, пользователь может изменить абсолютно что-либо на странице до ее отправки. Вы должны проверить все значения на своем сервере. – Pointy

+0

** предупреждение ** ваш код уязвим для SQL-инъекций. –

+0

Вы имеете в виду установку async в false? Это приведет к блокировке функции до тех пор, пока запрос не будет выполнен. –

ответ

2

Возможно ли пользователю изменять эту переменную.

Возможно, но что более важно, вы, по сути, не можете доверять любой информации, посланной вам от клиента. «Доверяй, но проверь», я считаю, была фраза ... Поэтому в дополнение ко всему, что вы делаете на стороне клиента для удобства или пользовательского интерфейса, вы должны проверить его на стороне сервера.

Конкретно в вашем случае, вы сказали, что есть:

function initialize() { 
    quantity = parseInt(document.getElementById('shipping_quantity').value); 
} 

Как написано, что, кажется, либо полагаться на глобальную переменную quantity или, что еще хуже, создать один через The Horror of Implicit Globals. В любом случае, да, пользователю легко изменить его. Они могут открыть консоль JavaScript и ввести:

window.quantity = 42; 

и нажмите Enter.

Вы можете защититься от этого и сделать его немного сложнее, поставив весь свой код в функции обзорного:

(function() { 
    // Your code here, e.g.: 

    var quantity = 0; 

    function initialize() { 
     quantity = parseInt(document.getElementById('shipping_quantity').value); 
    } 

    // ...and so on 
})(); 

что, по крайней мере мешает ему быть глобальным и быть так легко изменить. Но это все еще очень просто, все, что им нужно сделать, это использовать любой современный браузер, открыть Dev Tools, поместить контрольную точку в код, и когда точка останова будет достигнута, измените значение quantity.

Использование функции обзора является хорошей идеей в любом случае, потому что глобальные значения, как правило, плохие новости. Это означает, однако, что если вы используете устаревшие атрибуты onXYZ для подключения обработчиков событий, вам нужно переключиться с этого на использование методов DOM (или, как вы используете jQuery, его функцию on и т. Д.), Потому что атрибуты onXYZ может вызывать только функции, доступные из глобальной области.

0

Вам просто нужно убедиться, что у вас есть Javascript для отправки любых цен на сервер, который будет использоваться. Таким образом, если кто-то изменит их, это не имеет значения.

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

Таким образом, вы контролируете цену, и вам не нужно заботиться, если пользователь обманывает ее.

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