攻击者能否有害地使用 inspect 元素?
Can an attacker use inspect element harmfully?
我知道这是一个广泛的问题,但我想我在这里遗漏了一些东西。攻击者是否有可能通过简单地使用检查元素并编辑 javascript 和 html 来对站点造成损害?例如,更改输入的最大长度似乎太容易了,上传太多数据可能会导致服务器崩溃,我知道在服务器上检查数据总是好的做法,但它似乎仍然太容易了。或者另一个更具潜在危险的示例是,如果攻击者可以扰乱 $.ajax
调用并将错误信息发送到服务器。这是我应该更担心的事情,还是攻击者浏览器上的更改只是暂时的?
你应该担心这个。永远不要相信来自客户的输入。不要指望您在客户端执行的任何检查都会真正执行。您始终需要检查服务器端的输入。
正如您已经提到的,用户可以使用各种检查工具来更改本地代码或完全手工制作恶意数据包。
这些更改在单个用户的浏览器上是暂时的。
但是,这些更改将允许该用户以他们选择的方式与您的后端进行交互。这是攻击网站的一种方式。
标准规则是永远不要相信来自用户/浏览器的输入。不要相信隐藏字段的值,不要相信它们没有改变长度,不要相信它们没有添加新值(例如下拉列表),不要相信在 Javascript,等等
一些示例:
- 过去一些购物网站会将要支付的金额作为隐藏字段包含在表单中。更改此值会更改向信用卡收取的金额,同时仍会批准交易。
- 具有 Javascript 验证规则的站点可以通过直接发布到后端服务来跳过这些规则,这会导致 SQL 和 HTML / 脚本注入攻击。
- 可以在表单中添加意外值的下拉菜单、单选按钮和复选框输入。
是的,他们可以。当他们检查元素时,他们可以在本地修改所有内容,因此这将是他们本地环境的临时修改,但是他们可以修改可能影响您的服务器的值。
例如,假设您有一家在线商店,并且有一个 "Edit Product" 选项。一旦你去那里,你有一个隐藏的字段,你存储产品 ID,这样当你尝试在后端更新该产品时,你将使用该 ID 来知道要更新哪个产品。攻击者可以轻松更改该值,现在他将能够修改任何其他产品(包括不属于他的产品)。
另一个经典示例可能是数字字段,您假设用户只能提交数值,因此在您的后端,您在查询中使用该数字,例如,
"SELECT * FROM Products WHERE Price > " + Price;
你期待一个数值,所以你认为攻击者无法发送文本进行 SQL 注入,但他可以轻松修改该值(通过更改输入的数字一个文本输入,在发送之前修改 javascript 值,或者拦截网络流量并从那里修改值),现在你可以得到类似的东西:
"SELECT * FROM Products WHERE Price > 0; DROP TABLE Products--"
这就是您永远不应该相信用户输入的主要原因。你期待一个数值吗?然后在使用它之前确保它是一个数字。您的用户正在更新产品吗?在更新产品之前,请确保该产品确实属于他。您的数据有最大长度 属性 吗?仔细检查您的服务器以确保它仍然具有有效长度。
这可能看起来非常容易和简单,但人们会犯错误。一个简单的例子是 "Heart Bleed" 错误,所有这些都可以通过验证请求的长度来避免,而不是信任用户提交的数据。
这就是为什么您需要从不信任用户提交的数据并始终在您的后端执行双重检查的主要原因。
是的,他们可以。他们可以看到你的代码,让他们有机会发现漏洞或制造漏洞并攻击漏洞。即使编辑是临时的并且只在攻击者的浏览器上进行,它们也会造成伤害。
我知道这是一个广泛的问题,但我想我在这里遗漏了一些东西。攻击者是否有可能通过简单地使用检查元素并编辑 javascript 和 html 来对站点造成损害?例如,更改输入的最大长度似乎太容易了,上传太多数据可能会导致服务器崩溃,我知道在服务器上检查数据总是好的做法,但它似乎仍然太容易了。或者另一个更具潜在危险的示例是,如果攻击者可以扰乱 $.ajax
调用并将错误信息发送到服务器。这是我应该更担心的事情,还是攻击者浏览器上的更改只是暂时的?
你应该担心这个。永远不要相信来自客户的输入。不要指望您在客户端执行的任何检查都会真正执行。您始终需要检查服务器端的输入。 正如您已经提到的,用户可以使用各种检查工具来更改本地代码或完全手工制作恶意数据包。
这些更改在单个用户的浏览器上是暂时的。
但是,这些更改将允许该用户以他们选择的方式与您的后端进行交互。这是攻击网站的一种方式。
标准规则是永远不要相信来自用户/浏览器的输入。不要相信隐藏字段的值,不要相信它们没有改变长度,不要相信它们没有添加新值(例如下拉列表),不要相信在 Javascript,等等
一些示例:
- 过去一些购物网站会将要支付的金额作为隐藏字段包含在表单中。更改此值会更改向信用卡收取的金额,同时仍会批准交易。
- 具有 Javascript 验证规则的站点可以通过直接发布到后端服务来跳过这些规则,这会导致 SQL 和 HTML / 脚本注入攻击。
- 可以在表单中添加意外值的下拉菜单、单选按钮和复选框输入。
是的,他们可以。当他们检查元素时,他们可以在本地修改所有内容,因此这将是他们本地环境的临时修改,但是他们可以修改可能影响您的服务器的值。
例如,假设您有一家在线商店,并且有一个 "Edit Product" 选项。一旦你去那里,你有一个隐藏的字段,你存储产品 ID,这样当你尝试在后端更新该产品时,你将使用该 ID 来知道要更新哪个产品。攻击者可以轻松更改该值,现在他将能够修改任何其他产品(包括不属于他的产品)。
另一个经典示例可能是数字字段,您假设用户只能提交数值,因此在您的后端,您在查询中使用该数字,例如,
"SELECT * FROM Products WHERE Price > " + Price;
你期待一个数值,所以你认为攻击者无法发送文本进行 SQL 注入,但他可以轻松修改该值(通过更改输入的数字一个文本输入,在发送之前修改 javascript 值,或者拦截网络流量并从那里修改值),现在你可以得到类似的东西:
"SELECT * FROM Products WHERE Price > 0; DROP TABLE Products--"
这就是您永远不应该相信用户输入的主要原因。你期待一个数值吗?然后在使用它之前确保它是一个数字。您的用户正在更新产品吗?在更新产品之前,请确保该产品确实属于他。您的数据有最大长度 属性 吗?仔细检查您的服务器以确保它仍然具有有效长度。
这可能看起来非常容易和简单,但人们会犯错误。一个简单的例子是 "Heart Bleed" 错误,所有这些都可以通过验证请求的长度来避免,而不是信任用户提交的数据。
这就是为什么您需要从不信任用户提交的数据并始终在您的后端执行双重检查的主要原因。
是的,他们可以。他们可以看到你的代码,让他们有机会发现漏洞或制造漏洞并攻击漏洞。即使编辑是临时的并且只在攻击者的浏览器上进行,它们也会造成伤害。