首先,介绍

PHP是一种功能强大但相对容易学习的服务器端脚本语言。即使是有经验的程序员可以使用它来创建复杂的动态网站。然而,它往往具有实施的秘密和安全方面的互联网服务,许多困难。在这一系列文章中,我们将向您介绍读者必要的安全背景和PHP开发Web,特定的知识和代码,你可以保障安全你自己的Web应用程序的一致性。首先,我们简要回顾一下服务器的安全问题,告诉你如何访问私人信息共享的主机环境,所以从生产服务器开发商,保持最新的软件,提供加密的信道接入和控制系统为您。

然后,我们讨论PHP脚本实现中的常见漏洞。我们将解释如何保护脚本不受SQL注入、防止跨站点脚本编写和远程执行,以及防止劫持临时文件和会话。

在最后一章中,我们将实现一个安全的Web应用程序,您将学习如何验证用户身份,授权和跟踪应用程序,避免数据丢失,安全地执行高风险的系统命令,并能够安全地使用Web服务。你是否有足够的PHP安全开发经验,本系列文章将提供丰富信息可以帮助你建立更安全的在线应用。

两。什么是sql注入

如果你打算不再使用的一些数据,它是存储在一个数据库中没有意义,因为数据库的设计目的是为了方便访问数据库中的数据的操作。但如果你只是这样简单,它会导致一个潜在的灾难。这种情况并不主要是因为你可能不小心删除在数据库的一切,而是因为当你试图完成一个无辜的任务,你可能会被一些人利用你的破坏数据来取代你自己的数据劫持。我们称这种替代注射。

事实上,每当您请求用户输入构建数据库查询时,您就允许用户参与构建访问数据库服务器的命令。然而,恶意用户会试图找到一种方法来扭曲命令,导致命令的错误删除数据甚至做更危险的事情。作为程序员,你的任务是找到一种方法来避免这种恶意攻击。

三和sql注入原理

构建数据库查询是一个非常直接的过程。通常,它将遵循以下的想法。为了解释这个问题,我们假设您有一个葡萄酒数据库表葡萄酒

1。提供了一个表单,允许用户提交的内容进行搜索。让我们假设用户选择一个Lagrein 搜索型酒。

2。检索用户的搜索词并保存它-通过将其分配给变量,如下所示:

下面是代码片段:

各种_post美元美元= { 'variety};

因此,变量$的值现在是:

拉格莱恩

三.然后,使用这个变量在WHERE子句中构建数据库查询:

下面是代码片段:

从多样性的葡萄酒中选择*;

因此,变量$查询的值现在如下所示:

下面是代码片段:

SELECT * FROM葡萄酒品种= 'lagrein

4。将此查询提交到MySQL服务器。

5。MySQL返回酒中的表在各种领域的价值是Lagrein所有记录。

到目前为止,这应该是一个过程,你很熟悉,很轻松。不幸的是,有时这个过程我们熟悉和舒适会导致自满。现在,让我们重新分析查询你刚建的。

1。您创建的查询的固定部分以一个引号结束,您将使用它来描述变量值的开始:

下面是代码片段:

查询选择*;

2。使用原始的固定部分和包含用户提交的变量的值:

下面是代码片段:

$ = $;

三.然后,将这个结果与另一个单引号连接起来,即变量值的结束:

下面是代码片段:

$查询。;

因此,查询的值如下所示:

下面是代码片段:

SELECT * FROM葡萄酒品种= 'lagrein

本工程的成功取决于用户的输入,在本文的例子中,你使用一个词(或一组字)来表示一个类型的葡萄酒。因此,查询是没有任何问题,其结果将是你所期望的一个Lagrein 葡萄酒名单。现在让我们来想象一下,因为你的用户没有输入一个简单的Lagrein 酒型

lagrein'or 1 = 1;

现在,继续使用前面的固定部分来构建查询(在这里,我们只显示查询变量的结果值):

从品种多样的葡萄酒中选择*

然后,您连接一个包含用户输入内容的变量的值(这里是粗体):

SELECT * FROM葡萄酒品种= 'lagrein'or 1 = 1;

最后,在下面加上下面的引号:

SELECT * FROM葡萄酒品种= 'lagrein'or 1 = 1;

作为一个结果,查询结果是从你的期望完全不同。事实上,你的查询不包含一个指令,但是两指令,因为最后的分号进入由用户,这已经结束了第一条指令(记录选择),从而开始一个新的指令,在这种情况下,第二指令意义除了一个简单的单引号;然而,第一个指令是不是你想做的事。当用户把一个单引号在其输入端的中间,他预期变量的值,并提出了另一种状态。因此,它不再是检索这些记录各种Lagrein 自1以来一直是1,所以你将检索所有记录!

您可能反对:我不是使用双引号代替单引号来描述用户提交的变量吗这很好,至少可以减缓恶意用户的攻击。(在以前的文章中,我们提醒您应该禁止所有虚假通知消息给用户。如果我们在这里生成错误消息,它可能有助于攻击者提供具体的解释,说明为什么他的攻击失败。)

在实践中,这样你的用户可以看到所有的记录,乍一看不只是其中的一部分似乎不太麻烦,但事实上,这确实是一个很大的麻烦;看到所有的记录可以很容易地为他提供了内部结构上,这也给他未来实现的邪恶更为重要的参考。如果你的数据库不包含,显然是无害的信息,它包括一个列表包含员工的年收入。刚才所描述的情况尤其正确。

从理论上看,这种攻击确实是一件可怕的事情,因为在你的查询中注入意外的内容,这个用户可以把你的数据库访问转化为实现他自己的目标,所以现在,你的数据库已经向他打开,就像你对你开放一样。

四,php和mysql注入

正如我们前面所描述的,PHP从它自己的设计中没有做任何特殊的事情——除非按照您的说明,因此,如果恶意用户使用它,它就如我们前面描述的那样,允许允许特殊设计的攻击。

我们假设您不会有意或无意地创建破坏性数据库查询。所以我们假设问题来自于用户的输入方面。现在,让我们更详细地分析用户向脚本提供信息的方式。

五。用户输入类型

今天,用户影响脚本的行为变得越来越复杂。

用户输入最明显的来源是,当然,一个窗体上的文本输入字段,使用这样的领域,你只是煽动用户输入任意数据。更重要的是,你的用户提供一个大的输入范围。没有办法预先限制用户可以输入的数据类型(尽管您可以选择限制其长度),这就是大多数注入攻击源主要来自无保护窗体域的原因。

然而,其他的攻击仍然存在,并且稍微考虑一下技术-你会想到一种方法来形成潜在的背景!通过分析URI浏览器的导航工具栏显示,细心的用户可以很容易地看到哪些信息是通过一个脚本。虽然URI通常是以编程方式生成,但没有什么措施来防止恶意用户只需提供一个适当的URI的变量输入值给浏览器-这可能会开启一个可能数据库的滥用。

限制用户的输入提供一个形成一个选择框,一个共同的政策,而不是一个输入框。这种控制可以强制用户选择从一组预定义的值,在一定程度上防止用户输入所需的内容,但作为一个攻击者可能哄骗一个URI(那是,创造一个可以模仿可信但无效的URI),他可以模仿和创造你自己的版本,因此非法使用而不是预定义的安全选项在选项框。这样做是非常简单的;他只需要查看源代码,然后复制粘贴窗体的源代码都打开了大门,他。

在修改了选择之后,他将能够提交一个表单,并且他的无效指令将被接受,就像它们是原始指令一样,因此,用户可以使用许多不同的方法来尝试将恶意代码注入脚本。