PHP网页编程之将 Oracle 内置的平安特征用于 PHP
掌握静态网页的制作技术是学习开发网站的先决条件,这一点就讲到这里,因为这篇文章不是教程文章,也就不对技术进行深入的刨析了。 <P style="TEXT-INDENT: 2em">现今大多半 Web 使用法式都需求最少采取某种根基的平安战略。例如,供应用口令回护的内容的网站、仅具有办理员后真个网站、网志和团体杂志、电子商务网站、企业内联网,等等。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">构建这些类型的 Web 使用法式最经常使用的设计办法是将平安战略整合到 Web 使用法式的营业逻辑中,即由使用法式决意某个用户是不是有权会见数据库中的某个数据。在这类情况下,数据库的脚色仅为存储数据和依恳求供应数据。换句话说,假如 Web 使用法式号令数据库供应特定信息,则数据库会直接履行该号令而不反省用户的权限。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">在该文中,您将进修若何使用 Oracle 内置的平安特征在数据库级履行使用法式平安划定规矩,以进步使用法式的全体平安性。作为附带的优点,直接在数据库中完成数据会见平安不仅有助于进步使用程的平安性,并且有助于下降庞杂性。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">对数据库端平安性的需求 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">从 Web 使用法式掌握数据会见会怎样?大多半情形下没有成绩;这是个不错的处理计划,特别是在触及的数据为非义务关头或绝密的时分。很多书和在线资本中都用到了该办法。实践上,有本很受接待的 PHP/MySQL 书明白否决每一个使用法式创立一个以上的数据库用户帐户,这是由于“额定的用户或庞杂的权限会因某个操作在持续前要反省更多的信息而下降 MySQL 的履行速度”。的确如斯;然而,在保持将平安性整合到数据库逻辑中的设法前能够要思索几件工作。咱们来看以下示例。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">假定创立一个内容办理体系 (CMS)。个中利用数据库来存储网站上宣布的内容。大局部数据是公然的,答应匿名 Web 用户读取;但只答应编纂更改数据。利用单一数据库帐户会见和修正数据库中的纪录,并经由过程用口令回护仅办理员可以会见的页面的会见权限用 PHP 代码掌握平安性。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">假如 Web 使用法式的公共端蒙受了一个诸如公共搜刮表单(即编码不敷周密的表单)上的 SQL 注入的进击,则该入侵者能够可以对该公共帐户可以会见的数据库对象履行恣意 SQL 语句。固然,就这里的情况而言,履行 SELECT 语句不会形成甚么大成绩,这是由于数据原本就是公共的。但因为公共权限和办理权限利用统一数据库帐户,因而入侵者还能履行 UPDATE 和 DELETE 语句,乃至是从数据库中删除表。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">怎样才干避免该情形的产生呢?最复杂的办法就是完全限制公共数据库帐户修正数据的权限。咱们来看看 Oracle 是若何处理这个成绩的。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">Oracle 平安性根基概述 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">Oracle 数据库为 Web 开辟人员供应了掌握数据会见的很多办法,从办理对特定命据库对象(如表、视图和进程)的会见到掌握一般行或列的数据的会见。很明显,对 Oracle 每一个平安特征或可用选项的会商超越了本文的局限。在这里,咱们将不触及过量细节,而仅引见 Oracle 数据会见平安性的最根基方面: 验证和用户帐户、权限、脚色 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">验证和用户帐户。 与其他数据库一样,恳求会见 Oracle 的每一个用户(数据库帐户)必需经由过程验证。验证任务可以由数据库、操作体系或收集办事来做。除根基的验证(口令验证)外,Oracle 还撑持强验证机制,如Kerberos、CyberSafe、RADIUS,等等。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">脚色。 Oracle 脚色是一个权限的着名集。虽然可以直接授与用户帐户权限,但利用脚色可以极大简化用户办理,特别是需求办理大批用户时。创立易办理的小脚色,然后依据用户的平安级别授与用户一个或多个脚色,如许做的效力十分高。更不必说修正权限变得若何复杂了 ― 只需修正脚色联系关系的脚色便可,无需修正每一个用户帐户。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">为了简化新用户创立早期的任务,Oracle 自带了三个预界说的脚色: <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">CONNECT 脚色 ― 该脚色利用户可以毗连数据库和履行根基的操作,如创立本人的表。默许情形下,该脚色不克不及会见其他用户的表。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">RESOURCE 脚色 ― RESOURCE 脚色与 CONNECT 脚色类似,但它答应用户具有较多的体系权限,如创立触发器或存储进程。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">DBA 脚色 ― 答应用户具有一切体系权限。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">利用中的受权和权限 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">在本局部中,咱们将会商若何利用 Oracle 的受权和权限来进步本文开首局部会商的谁人复杂 CMS 示例的平安性。假定,供应给使用法式用户的内容存储在 WEB_CONTENT 表中。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">起首,创立该表。启动 Oracle 数据库出格版,以体系办理员身份登录。假如还没有释放示例 HR 用户,请将其释放。依照出格版装置附带的入门指南中的唆使操作。请注重,默许情形下,HR 用户被付与 RESOURCE 脚色。在这里,付与该用户 DBA 脚色,如许就能够利用该帐户办理 CMS 使用法式的数据库方面了。固然,不会利用 HR 用户帐户停止在线会见,只用它办理数据库。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">如今,可使用对象阅读器或经由过程履行 SQL Commands 窗口创立新表。上面是创立该表的代码: <P style="TEXT-INDENT: 2em">CREATE TABLE WEB_CONTENT ( page_id NUMBER PRIMARY KEY, page_content VARCHAR2(255) );<P style="TEXT-INDENT: 2em">因为该表是利用 HR 用户帐户创立的,因而该表归 HR 帐户一切并位于 HR 形式中,而且在明白授与其他用户会见该表的权限前,其他用户没法会见该表。假如不信,可以创立一个新用户,用该用户会见 WEB_CONTENT 表尝尝。 <P style="TEXT-INDENT: 2em">如今,创立两个新用户,CMS_USER 和 CMS_EDITOR。终究,将授与 CMS_USER 对 WEB_CONTENT 表的只读权限,并将该用户用作为匿名 Web 用户供应内容的数据库帐户。CMS_EDITOR 帐户将在该表上具有更多权限,将被用作 CMS 编纂的帐户(该帐户需求更改和保护该表中的数据)。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">可使用 XE 的图形界面或经由过程履行以下号令创立新用户: <P style="TEXT-INDENT: 2em">CREATE USER cms_user IDENTIFIED BY cms_user; CREATE USER cms_editor IDENTIFIED BY cms_editor;<P style="TEXT-INDENT: 2em">(出于简化的目标,此处的口令与用户名对应。) <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">为了让这两个帐户都登录数据库,咱们需求付与它们 CONNECT 脚色。为此,在 XE 图形界面的 Administration/Database Users 局部选顶用户信息下的 CONNECT 复选框,或履行以下号令: <P style="TEXT-INDENT: 2em">GRANT CONNECT to cms_user; GRANT CONNECT to cms_editor;<P style="TEXT-INDENT: 2em">如今,假如测验考试以 CMS_USER 或 CMS_EDITOR 用户登录并试图从 WEB_CONTENT 表读取数据 (select * from hr.web_content;),将碰到以下毛病: <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">ORA-00942:table or view does not exist <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">为了会见数据或仅是看到表,需求授与 CMS_USER 和 CMS_EDITOR 帐户对 WEB_CONTENT 表的只读权限: <P style="TEXT-INDENT: 2em">GRANT SELECT on hr.web_content to cms_user; GRANT SELECT on hr.web_content to cms_editor;<P style="TEXT-INDENT: 2em">以上代码使这两个帐户可以对 WEB_CONTENT 表履行 SELECT 语句。假如测验考试履行其他语句,则会碰到毛病。例如,拔出一行: <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">INSERT INTO hr.web_content (page_id,page_content) VALUES (1,'hello world'); <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">将发生毛病动静: <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">ORA-01031:insufficient privileges; <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">要答应 CMS_EDITOR 更改该表的内容,需求授与以下权限: <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">GRANT INSERT,UPDATE,DELETE on hr.web_content to cms_editor; <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">从如今起,CMS_EDITOR 帐户可以对 WEB_CONTENT 表履行 INSERT、UPDATE 和 DELETE 语句。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">您看,这有多复杂!可见经由过程脚色办理权限是更无效的办法。假如利用的 Oracle 数据库不是 XE,可以履行以下操作: <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">创立脚色: <P style="TEXT-INDENT: 2em">CREATE ROLE reader; CREATE ROLE writer;<P style="TEXT-INDENT: 2em">授与脚色权限: <P style="TEXT-INDENT: 2em">GRANT SELECT ON web_content TO reader; GRANT INSERT,UPDATE,DELETE ON web_content TO writer;<P style="TEXT-INDENT: 2em">付与用户脚色: <P style="TEXT-INDENT: 2em">GRANT reader TO cms_user; GRANT reader TO cms_editor; (they need to read too) GRANT writer TO cms_editor;<P style="TEXT-INDENT: 2em">请注重,假如更改 READER 脚色的界说,则这些更改会影响一切具有该脚色的用户帐户。假如是直接将权限授与用户的,则必需逐一更新每一个用户帐户。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">完成上述步调后,可以设置装备摆设 PHP 使用法式,使之对由匿名 Web 用户恳求的一切数据库毗连均利用 CMS_USER 帐户,对由受口令回护的办理页面激发的毗连利用 CMS_EDITOR 帐户。如今,即便公共 Web 表单遭到进击,该进击对数据库的影响将微不足道,这是由于 CMS_USER 帐户仅具有只读权限。 <P style="TEXT-INDENT: 2em"><P style="TEXT-INDENT: 2em">结论 <P style="TEXT-INDENT: 2em">在本文中,咱们只是复杂引见了 Oracle 数据会见平安性的一些最根基的特征。另外,Oracle 还有很多其他特征,可把您的 Web 使用法式的平安性进步到一个新的品级 ― 包含虚拟公用数据库 (VPD) 和标签平安性。有关以 PHP 为后台的数据库平安成绩,请参阅我的 OTN 文章,“为 PHP 使用法式增添数据平安性”。我先把我自己学习PHP的过程做一下概括: 要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。 为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。 学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql 遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。 个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。 兴趣是最好的老师,百度是最好的词典。 这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。 先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。 作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。 php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会) Ps:以上纯属原创,如有雷同,纯属巧合 说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。 为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。 作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。 至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。 找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
页:
[1]
2