0

我在页面加载时保存了一个 javascript 变量,稍后我将使用它。用户是否可以更改此变量。我试图找出一种方法,当用户输入某些内容时,创建一个 ajax 帖子并返回几个值。

加载时会触发 initialize() ,因此在页面加载时很快就会获得变量数量。

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

然后我通过查询带有状态的数据库来检索运费。

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;
?>

运输总额的处理方式发生在 getRate() 函数的最后一部分

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

当我把它们放在一起时,它可以工作,但我担心在计算总数之前可能会改变数量。

我正在考虑在函数 php 中计算运费后将运输表格发布并返回到自身。

我正在看的例子。

购物车教程

4

2 回答 2

2

用户是否可以更改此变量。

可能,但更重要的是,您基本上不能信任从客户端发送给您的任何信息。“信任,但验证”我相信这句话......所以除了你在客户端为了方便或 UI 做的任何事情之外,必须仔细检查它 server-side

特别是在你的情况下,你说你有:

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

正如所写的那样,这似乎要么依赖于全局quantity变量,要么更糟糕的是,通过隐式全局的恐怖来创建一个。无论哪种情况,是的,用户可以轻松更改它。他们可以打开 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
})();

这至少可以防止它成为一个全球性的并且非常容易修改。但是还是很简单的,只要用任何现代浏览器,打开开发工具,在代码中下一个断点,到断点的时候,修改quantity.

无论如何,使用范围函数是个好主意,因为全局变量通常是坏消息。但是,这确实意味着,如果您使用老式的onXYZ属性来连接事件处理程序,您必须从这样做切换到使用 DOM 方法(或者当您使用 jQuery,它的on函数等),因为onXYZ属性只能调用可从全局范围访问的函数。

于 2013-08-02T17:10:50.873 回答
0

您只需要确保您有 Javascript 将任何价格发送回使用的服务器。这样,如果有人确实改变了它们,那也没关系。

您的服务器将需要一次查看价格以向用户显示它是多少,然后在另一次,当他们提交订单时,找出向他们(或他们的信用卡)收费的总额。

这样一来,您就可以控制价格,而不必在意用户是否愚弄它。

于 2013-08-02T17:11:07.410 回答