【问题标题】:Can the DOM be modified for SQL injection attacks or other malicious attacks?是否可以针对 SQL 注入攻击或其他恶意攻击修改 DOM?
【发布时间】:2016-11-05 15:28:07
【问题描述】:

我的页面上有按钮调用 JS 函数:

<button onclick="addProduct(100100)" type="button">Add</button>

(我这样做是因为我在同一页面上有多个订单)

JS函数addProduct(ordernum)获取订单号并提交ajax请求将数据处理到我的数据库中。

PHP

$sql = "INSERT INTO orders ( ... ) VALUES ( ... ) WHERE sku = :sku AND ordernum = $_POST['ordernum']";
$statement = $this->con->prepare($sql);
$statement->bindParam(':sku', $_GET['sku']);
$statement->execute();

在上面的代码中,我在$_GET['sku'] 变量上使用了bindParam() 来转义可以很容易地注入到url 中的特殊字符(正如你应该这样做的那样)。

但是我没有对$_POST['ordernum'] 做同样的事情,因为该值存储在 DOM 中并且无法修改。或者可以吗?那是我的问题。可以修改 DOM 上的信息以进行恶意攻击吗?

显然,为了安全起见,我可以使用 bindParam() 转义特殊字符,但攻击者能否更改我在 DOM 上的参数值?

【问题讨论】:

  • 是的,绝对可以。任何来自浏览器的东西都不能被信任。
  • HTTP 请求可能是恶意的。假设所有输入都是危险的,直到你彻底清理它。
  • 谢谢!我必须找到另一种方法来存储表示 DOM 上每个订单的订单号变量。我现在能想到的唯一方法是创建一个表单并包含隐藏的输入。

标签: javascript php html security dom


【解决方案1】:

任何存储在客户端的东西都可以被操纵。

对您系统的请求是一个简单的 POST 请求:

POST /somepage.php?sku=123 HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 15

ordernum=ABCDEF

任何攻击者都可以使用Burp Suite等简单工具来操纵ordernum并实现SQL注入,因此您应该参数化所有动态参数(包括使用的任何cookie或标头值) .

当然,攻击者可以将ordernum 更改为另一个有效的订单并对其进行更改,而不是她正在编辑的订单。为了缓解这种情况,您应该在服务器端验证当前用户是否有权编辑给定的ordernum

【讨论】:

    【解决方案2】:

    您还需要对其进行参数化,因为有人可能会在不使用您的表单的情况下发布到您的页面。

    【讨论】:

    • 或者用开发者工具给表单打补丁。或者拦截并更改HTTP post数据。
    • @Jeff Puckett 我从未听说过。你有好的文档链接吗?
    • @David 好好想想你是如何制作表格的。您有一个 action 属性,它指定要发布到哪个页面。我可以根据需要制作自己的表单,并使用我的action 指定 your 页面
    • 除了硬表单之外,在纯 JS 方法中将您的页面指示为 URL 是微不足道的,并且表单(以及随后的表单提交)甚至都不需要。这在基本的 JavaScript 中是微不足道的,但 here's an obligatory jQuery link 显示了界面是多么简单。
    • @JeffPuckettII 我明白你的意思了。但我根本没有在我的页面上使用表格。我必须通过 ajax 用 JS 发布数据。
    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2020-03-26
    相关资源
    最近更新 更多