黑客预防

时间:2013-08-02 17:06:40

标签: javascript jquery mysql ajax pdo

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

初始化()在加载时触发,因此很快就会在页面加载中获得可变数量。

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运费后返回自己。

我正在看的例子。

Shopping Cart Tutorial

2 个答案:

答案 0 :(得分:2)

  

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

可能,但更重要的是,您基本上不能信任从客户端发送给您的任何信息。 &#34;信任,但要验证&#34;我相信这句话......所以除了你为了方便或用户界面而做的任何事情,必须仔细检查服务器端

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

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
})();

这至少可以防止它成为一个全球性的,并且很容易修改。但它仍然非常简单,他们所要做的就是使用任何现代浏览器,打开开发工具,在代码中放置一个断点,当达到断点时,修改quantity的值。

使用范围函数是一个好主意无论如何,因为全局变量通常是坏消息。但是,它确实意味着,如果您使用传统的onXYZ属性来连接事件处理程序,则必须从执行此操作切换到使用DOM方法(或者当您使用jQuery时,它的on函数而且,因为onXYZ属性只能调用可从全局范围访问的函数。

答案 1 :(得分:0)

您只需确保让Javascript将任何价格发回给使用过的服务器。这样,如果某人确实改变了它们,那就无所谓了。

您的服务器需要一次性查询价格以向用户显示该金额是多少,然后再次提交订单时,计算出要向他们(或他们的信用卡)收费的总额。

这样你可以控制价格,而且你不必在乎用户是否愚弄它。