首页 开发编程 正文

php 怎么识别空格

然后找到优质的教程静下来心来好好学习。接下来我就以PS为例详细说一下具体的学习方法。下面的学习时间适合不用上班不用上学,那就搞清楚淘宝美工的工作内容,看看不同的人的操作你会有更多启发。也可以尝试自己做点自己想做的作品再来一个提示:...

php 怎么识别空格,比如PSAEPRCAD等?

这种设计软件教程网上非常的多,例如我要自学网,虎课网、B站、高高手。然后找到优质的教程静下来心来好好学习。接下来我就以PS为例详细说一下具体的学习方法。

首先我想说,基本的PS操作都很简单,难的是创意,每个人只要花点时间去努力,都会很快学好。我只花了一个月,自学了PS、AI、PR,其实主要是PS学好点,然后找到了工作,相信我的经验还是有点点启发的,要对自己有信心。

提示:下面的学习时间适合不用上班不用上学,没事做的人儿,如果自己还有大事要办的,自己酌情安排学习时间。

我真的有点懒得码字,不会很详细,请见谅。

第一阶段:操作和看,时间一个星期,每天花半天左右时间,不要偷懒

1.首先下载一个PS,安装好,B站随便找个什么简单的入门教程,自己百度找个差不多的图片素材,照着慢慢做。

2.不操作的时候看B站李涛老师的初级教程,有时间就看,看完它,有必要时做个笔记,你会学到很多做图原理。

你这么牛,一个星期你就会基本的操作了。

第二阶段:明确职业需求,看,看,看,临摹,临摹,临摹。两个星期,定个目标7个左右临摹作品,每天花整块的时间去学习,最好一个简单的作品一次性做完,尽量一模一样,如果实在实在不行就八成一样也行,作品出来你不单只学到东西,还会很有成就感。

1.如果你是有职业方向的,先知乎搜这个职业了解职业需要,行业情况。

2.然后B站找相关的教程视频去看,搞清楚这个职业的重点,去临摹作品!

举个栗子:你是想做淘宝美工,那就搞清楚淘宝美工的工作内容,针对内容去找教程,临摹别人的作品,从最简单的开始,逐渐深入。

3.不操作的时候,玩手机的时间,B站,多看别人的操作,多看别人的作品,有利于你发现PS更多的操作方法和灵感。因为每个人的使用习惯不一样,看看不同的人的操作你会有更多启发。一模一样的效果,可以有N种方法和步骤做出来。

如果你对自己不敷衍,那么这个时候,你会有几个临摹作品了,作品少点也没关系,时间多点也没关系,你掌握自己的节奏,用心了,知道自己在进步就好。

第三阶段:需要提高自己的审美和寻找灵感了。找各类专业的做图网站,例如致设计,花瓣那些,多看看别人的创意。跟据你自己的发展方向去找网站,这个就不推荐了,自己搜。

这个时候你对PS有自己的见解,对自己的水平也清楚,复盘自己的学习成果,看看哪里需要多练,哪里还一窍不通,个个攻破。

我觉得这时候还是要多临摹,也可以尝试自己做点自己想做的作品

再来一个提示:

对于一窍不通的问题如何攻破???

不懂就百度,题目就直接描述你不懂的就行,比如我曾经搜过:用PS怎么画个三角形,用PS怎么花虚线…

这就是自学,没有一个人可以指点一下,看似这么简单的问题,还是要自己一个个攻破。

说多了都是泪啊

虽然我经历了这么多天,不懂,卡住,挠头挠头挠头,B站搜,百度搜,照着慢慢操作,一个个不懂的问题慢慢弄懂的过程

(我说这段是想给你们打预防针,会遇到困难的,提前做点心理准备,不会那么容易奔溃放弃)

我还是想说学会使用不难

创造软件才是真的难,创造软件本身就是为了使用者操作方便,而不是为难使用者的,所以一个软件做出来,给你用,功能就那么多摆在那里,多点点看看用用,始终会摸透的。

你可以的,请加油!!

为什么这么多人学不会C语言?

C语言是计算机体系结构的基础,很多新人将C语言作为学习计算机的入门语言。作为新入门的新人,肯定会感到迷茫,很混乱,这时我们就需要适当的引导。本文教你如何滴水不漏地学完C语言,学好基础知识,把握重点,不断深入学习。

一、背景

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它诞生于美国的贝尔实验室,是由丹尼斯·里奇以肯尼斯·蓝·汤普森设计的B语言为基础发展而来。UNIX 系统是世界上第一个真正的操作系统。而UNIX 操作系统是用C语言编写的,在当时这个系统很流行,于是C语言也跟着流行起来。而 UNIX 操作系统是开源的,所以别人要想学习,就要先学C语言。B语言被C语言改写后,C语言流行了而B语言就被淘汰了。而且后来发现,C语言的确非常好,它是面向过程语言的代表,是有史以来最重要的一门计算机语言。

二、学习方法

C语言是计算机体系结构的基础,很多新人将C语言作为学习计算机的入门语言。作为新入门的新人,肯定会感到迷茫,很混乱,这时我们就需要适当的引导。对于一门语言的学习,不同的人有不同的方法,不过别人好的学习方法我们是可以拿来借鉴参考的。

(1)看书

看书就是学习基础知识,学习一门语言首先就是学习基本语法,学会了基础知识才能有更加深入的发展。除了看一些书籍之外,还可以看一些教学视频入门,毕竟别人讲解演示学起来更加轻松一点。后文我也会推荐一些好的学习书籍和视频,供大家参考学习。

(2)敲代码

想要学习好一门计算机语言,光看书籍学习知识点是远远不够的。在学习知识点的同时一定要自己敲代码进行练习。开始学习敲代码的时候可以用一些轻便的编译器,比如Dev C++,熟练了之后可以使用Visual Studio这些较为大型的编译器。感觉基础知识掌握熟练之后,就可以开始接触算法和数据结构之类的,再然后就可以刷题提高水平了。

(3)练习项目

学习完基础知识我们的目的还是实践,所以我们就可以开始练习一些项目了。比如写一个小的记事本、小游戏、计算器等经典的小项目。平时面对那些黑框框肯定会感觉到很枯燥无聊,当你做出一个小作品之后,你就会很有成就感,这也会极大的提升你的学习兴趣。

三、学习路线

学习一门语言先了解此语言的发展史,早期的C语言功能其实较为简单,随着应用和场景的变化,C语言的功能在不断升级变化,功能也越来越强大。正式学习C语言之前了解一下计算机系统的组成以及工作原理也是很有必要的,除此之外还包括数据在计算机内部的存储方式,以及进制之间的转换。

另外很重要的一点就是编译环境和编译器的学习,学习之初可以选择一些简单易上手的编译器,随着不断深入学习选择一个与时俱进的编译器也是很重要的。学习完这些内容之后,我们就可以开始学习C语言基础知识了。C语言编程离不开数据,几乎所有的程序中都会涉及到数据,其中包含整型、浮点型、字符串等等。而C语言中存在着两种表征数据的形式:常量和变量。常量可以用来表示数据的值,变量不仅可以用来表示数据的值,还可以用来存放数据。变量是用来存放数据,运算符则是用来处理数据。用运算符将变量和常量连接起来的符合C语言语法规则的式子称为表达式。

学习完这些之后,就开始接触结构化程序设计语句。C语言基本控制结构有三种,分别是顺序控制、循环控制、选择控制。程序总是为解决某个实际问题而设计的,而问题往往包含多个方面,不同的情况需要有不同的处理,所以这些结构化程序语句在实际应用程序中可以说是无处不在,正确掌握结构化程序设计语句显得尤为重要。

如果用基本数据类型来定义某些变量,那么这些变量在内存中将占用各自的内存单元,变量之间的制约关系无法体现,不能表现出这些变量之间的关联性,所以我们把这些变量称为“离散变量”;但是如果我们需要操作100个或者是更多的数呢,定义100个变量就显得不太现实,这时我们就引入了数组。数组是一组同类型的数据项的有序集合,我们就可以把100个要定义的变量存放到数组中。

学习指针是学习C语言最重要的一环,能否正确地理解和使用指针是掌握C语言的一个标志,可以说不懂C语言的指针就不懂什么是C语言。指针也是C语言中最难学的一部分,学习时除了要正确理解基本概念,还必须要多编程,多上机敲代码,只要做到这些,指针也是不难掌握的。

前面介绍的都是简单的数据类型,只能定义一些简单的数据信息。对于复杂的数据信息是无法用前面所学的某个单一数据来定义的,必须使用C语言中提供的复杂数据类型来定义。复杂数据类型是C语言提供的不同于简单数据类型的又一数据类型,它极大地丰富了C语言对数据信息的处理能力。

3.1 C语言基础

第一部分是C语言基础,包括预处理指令、函数、变量和语句。即使是编写最简单的C语言程序,也是会用到这些基本概念。用一个经典的c语言程序,介绍c语言的基本构成、格式,使我们对c语言有个初步认识。

一个C语言程序只有一个主函数,程序执行时从主函数开始,在主函数内结束;函数由函数说明和函数体两部分构成;函数说明部分包含了对函数名,函数类型,函数参数等的定义和说明;函数体包含了变量说明和执行语句。

3.2 选择结构和循环结构

C语言中有三大结构,分别是顺序结构、选择结构和循环结构。

C语言顺序结构就是让程序按照从头到尾的顺序依次执行每一条C语言代码,不重复执行任何代码,也不跳过任何代码。

C语言选择结构也称分支结构,就是让程序“拐弯” ,有选择性的执行代码;换句话说,可以跳过没用的代码,只执行有用的代码。

C语言循环结构就是让程序“杀个回马枪”,不断地重复执行同一段代码。顺序结构很好理解,无需过多阐述,简单概述一下选择语句和循环语句。

其中有两个选择语句,if语句和switch语句。

循环语句有三种,for循环语句,while循环语句,do……while循环语句。

3.3 数组

数组就是一列具有相同类型的数据的集合,这些数据在内存中依次挨着存放,彼此之间没有缝隙。C 语言数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。数组分为一维数组和二维数组,当数组中每个元素都只带有一个下标时,称这样的数组为一维数组,一维数组实质上是一组相同类型数据的线性集合。二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。

3.4 函数

每个C程序都至少有一个函数,即主函数 main() ,如果程序的任务比较简单,全部的代码都写在main()函数中,但是,在实际开发中,程序的任务往往比较复杂,如果全部的代码都写在main()函数中,main()函数将非常庞大繁杂,结构混乱。我们可以根据程序的逻辑和任务的分工把代码划分到不同的自定义函数中,main()函数更关心业务逻辑和处理流程,需要执行具体任务的时候,调用其他的自定义的函数就可以了。引入函数得本质就是把一个复杂的任务分解为子任务,每一个子任务都是一个较小的功能模块,通过实现这些小功能模块来实现复杂的问题,从而使得比较复杂的问题变得简单。

3.5 指针

没学指针就是没学 C 语言!指针是 C 语言的精华,也是 C 语言的难点,pj C 语言指针,会让你的 C 语言水平突飞猛进。所谓指针,也就是内存的地址;所谓指针变量,也就是保存了内存地址的变量。不过,人们往往不会区分两者的概念,而是混淆在一起使用,在必要的情况下,大家也要注意区分。关于指针我们需要重点学习的内容有指针与地址、指针与函数参数、指针与数组、指针数组以及指向指针的指针和指向函数的指针等等。

3.6 结构体

C 语言结构体从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由 int、char、float 等基本类型组成的。你可以认为结构体是一种聚合类型。结构体部分重点学习包括结构体的定义方法、结构体的引用方法、结构体数组、结构体指针的概念及应用、结构体与函数。

在实际开发中,我们可以将一组类型不同的、但是用来描述同一件事物的变量放到结构体中。例如,在校学生有姓名、年龄、身高、成绩等属性,学了结构体后,我们就不需要再定义多个变量了,将它们都放到结构体中即可。

四、学习资料

4.1 经典书籍

《C Primer Plus(第6版)中文版》是非常经典的一本书籍,此书共17章。第1、2章介绍了C语言编程的预备知识。第3~15章详细讲解了C语言的相关知识,包括数据类型、格式化输入/输出、运算符、表达式、语句、循环、字符输入和输出、函数、数组和指针、字符和字符串函数、内存管理、文件输入输出、结构、位操作等。第16章、17章介绍C预处理器、C库和高级数据表示。本书以完整的程序为例,讲解C语言的知识要点和注意事项。每章末设计了大量复习题和编程练习,帮助读者巩固所学知识和提高实际编程能力。附录给出了各章复习题的参考答案和丰富的参考资料。

《C和指针》本书提供与C语言编程相关的全面资源和深入讨论。本书通过对指针的基础知识和高级特性的探讨,帮助程序员把指针的强大功能融入到自己的程序中去。

全书共18章,覆盖了数据、语句、操作符和表达式、指针、函数、数组、字符串、结构和联合等几乎所有重要的C编程话题。书中给出了很多编程技巧和提示,每章后面有针对性很强的练习,附录部分则给出了部分练习的解答。

本书适合C语言初学者和初级C程序员阅读,也可作为计算机专业学生学习C语言的参考。

4.2 学习视频

现在网络如此发达,网上的学习资源也是非常的丰富。大家可以自行上网查找适合自己的学习视频,这里给大家推荐的是大学MOOC上的浙江大学翁恺老师讲的C语言程序设计。这位老师讲课非常的不错, C语言基础理论知识讲解完善;循序渐进,从易到难,学习很轻松;语言组织严谨,风趣,很容易接受,让你有一直学下去的动力。

4.3 华为云C++语言实战进阶学习资源(免费)

本课程从基础语法、 面向对象特性、 异常处理、 模板编程基础、 C++11新特性、STL标准库容器和算法、并发编程、 C++未来发展趋势几大模块解构知识点,实战场景+学习+练,精炼干货讲解帮助你快速掌握知识短板。

立即点击报名学习

五、结语

C语言是国际上最流行的、应用最广泛的高级编程语言之一。时至今日,它依然保持着旺盛的生命力,深受广大程序员的欢迎。作为一种“个性鲜明”的编程语言,C语言既具有高级语言的优点,又有着低级语言的特性。很多大学或者是新入门的程序员都将C语言作为学习计算机的入门语言,学好C语言显得尤为重要。我们一定要学号基础知识,把握学习重点,不断深入的学习。

本文分享自华为云社区《【云驻共创】如何滴水不漏地学完C语言?》,作者:静Yu 。

我想做一个自己用的web?

撇开各种不同的Web技术不谈,弄清楚Web Apps定义最困难的是如何从各种纷繁复杂的Web App中提取出他们的共同特征。当用户登录一个网站(如Pixlr),大家很容易理解这是在访问一个Web App。但是对那些仅仅提供基础服务(如电话查询或是信息查询)的网站,区分用户是否在访问Web App就变得相当困难了。

其实这些服务大多都是Web App。我常常这样问自己"这个程序是否完成了某个任务?"。即便它只完成了某个非常小的任务,那么它也是一个Web App。Google的搜索引擎就是一个Web App,它本质上和电话查询服务没有什么区别。

这样说来,也并非所有的网站都是Web App。如果这个网站并没有执行任何任务,那么它就并不是Web App。

界面

元素变化

力求简洁明了是用户界面设计的重要原则。在同一时间给用户展示的功能越多,用户需要寻找和思考的时间也就越多。同样,界面中存在的选项越少,可用功能就越明显、越容易浏览。不过简化界面并非轻而易举,尤其是你不想减少应用程序功能的情况下。

将高级功能隐藏起来是一种有效的简化方法。搞清楚在界面中用户最经常用的是哪些功能,然后把其他功能隐藏处理。这些可由下拉式菜单和控件完成。例如,搜索栏中的高级过滤器可以做成尾部的特殊下拉菜单样式。当用户需要这些过滤器的时候只需要几次点击就可以使用。决定哪些功能保留展示哪些需要隐藏起来,并不是一个简单的工作,需要取决于功能控件的重要程度和被使用的频繁程度。

增加阴影

弹出式菜单和窗口周边的阴影不仅仅是为了视觉美观。阴影一方面增大了菜单或窗口的尺寸,有助于将菜单或窗口从背景中区别开来;另一方面通过灰度化的边缘阴影可以屏蔽背景内容的噪音干扰。

这个技巧根植于传统桌面程序,帮助用户将注意力集中在弹出的窗口。由于很多模态窗口不容易从桌面程序内容页面中凸显出来,阴影可以使它们看起来具有立体效果、仿佛悬浮于其他内容之上,于是拉近了模态窗口与用户的距离。

为实现这样的效果,设计师往往将透明的PNG背景图片作为容器,再把内容填充到容器中,同时等距离填充弹出框各边缘。或者使用具有透明边框的背景图片,并将内容框绝对定位在其中。另外,也可以使用基于JavaScript的lightboxes命令或者CSS3中的drop shadows命令,但需要注意浏览器是否支持。

提醒用户

当设计web app的时候,不仅需要关心一般情况下的信息展示,还要确保界面在空白状态时表现良好、具有指引作用。页面中还没有产生任何信息的时候,可以在空白区域放置一条帮助信息告诉用户如何开始。

例如,一个项目管理的应用程序主页会列出用户的项目,假如还没有什么项目信息,可以为用户提供一个项目创建页面的链接。即使这个页面上已经存在了这样一个功能按钮,一个额外的帮助并不会有什么妨碍。这个技巧可以有效地鼓励用户试用该服务,并在注册后立即进行使用。通过应用程序的单一操作步骤可以帮助用户理解这个应用的优势以及对他们是否有用。

此外,只为用户展示最重要的功能选项也很关键。一股脑的将众多功能倾泻给用户并没有什么实际意义。需要牢记的是,用户通常想从应用中获得或多或少的信息,但却不想跳进细节中,用户没有时间也没有兴趣。在空白状态中激励用户,可以显著地降低用户的流失率,并帮助潜在的用户更好的理解程序系统是如何工作的。

Button

许多web app拥有自定义样式的按钮。默认的输入按钮可能不适合某些情景,文字链接有时候看起来又太含蓄。需要注意的是,把链接做成Button样式的时候,它们就应该有button的表现形式。

比如,在点击button的时候它们应该会出现被"压"过的样子。这不仅仅是纯粹的视觉变化。及时反馈给用户,可以使web app感觉起来更灵敏,与桌面应用程序的用户体验更接近。可以使用CSS添加按钮的"pressed"等状态,实现处于不同状态下显示不同背景图片的功能。

情境导航

在既定的情境下考虑用户希望看什么、需要什么是非常重要的。不需要在每一个地方都放置相同的导航控件,因为用户不是在任何情况下都需要它们。

上下文情境导航最好的一个例子就是Office 2007中,原先默认的工具栏集合被换成了带状控件形式。每一项tab控制着一组相关联的功能,如编辑图形、校对或者简单书写。Web app可以从这种上下文情境导航中获益,仅展示用户需要的、而不是所有可用的功能,从而保持用户界面的整洁清爽。

关键功能

并不是所有的控件都拥有相同的重要性。例如创建一个新的条目,页面中会有"创建""取消"两个button. 这里的"创建"就要更加重要些,因为这是大多数情况下用户即将要做的事情。极少的情况下用户才会去点击取消。虽然这两个控件并排放置,但是不要给予相同的重视程度。

为了将注意力引导到"创建"上,我们可以尝试使用不用的风格或样式。一种方式是将"创建"设计成button样式,"取消"设计成文字链接样式。另一种方式是在视觉上使用使用不同的颜色,并使button略有凸起的效果。这样便于抓住用户的目光。

优点

第一、使用W3C标准的HTML(标准通用标记语言下的一个应用)语言开发,能够轻松实现跨平台,移动应用开发者不再需要考虑复杂的底层适配和跨平台开发语言的问题。与此同时,使用HTML来开发的Web App在投入上会大大的低于传统的Native App。

第二、基于当下开始普及流行的HTML5,Web App可以实现很多原本Native App才可以实现的功能,比如LBS的功能、本地数据存储、音视频播放的功能,甚至还有调用照相机和结合GPU的硬件加速功能。

第三、移动应用的迭代周期平均不到1个月,用户需要频繁的重新下载与升级。而Web App则无需用户下载,并且和传统网站一样可以动态升级。

第四、Web App有App的特性,更有Web的特性。每一个Native App在当前的用户使用场景下是相对孤立的,而Web App则可以像传统互联网网页那样相互链接,从一个Web App直接跳转到另外一个Web App。这无论是从用户的使用体验层面还是从应用之间的数据传输来看都是非常不错的选择。

制作

常用工具

ASP,PHP,HTML,JAVA等。使用这些常见的网络开发工具,可以制作绝大部分的webapp程序,使其在网站页面上实现传统的C/S架构软件的功能,也就是我们常说的SaaS模式。

其他工具

CBX,AthTekWebAPPKit等。CBX和AthTek WebAPP Kit都是国产软件,它们的主要功能就是以将使用传统编程语言如C,C++,Delphi等开发的C/S架构客户端软件工程,以所见即所得的方式,快速部署到网络服务器上,让传统的编程语言也能够实现基于web的互联网应用程序开发。

一键生成webapp工具

百度SiteApp是致力于为开发者、站长提供从生成WebApp到流量、用户引入再到变现的综合服务平台,亦是国内首家的WebApp在线生成服务平台。

如何实现PHP自动创建数据库?

你做好程序以后,把数据库导出成sql文件

1、连接数据库

2、读取这个sql文件里的sql语句,并执行

3、生成一个数据库连接参数的php文件

<?php

$con = mysql_connect("localhost","peter","abc123");

if (!$con)

{

die('Could not connect: ' . mysql_error());

}

if (mysql_query("CREATE DATABASE my_db",$con))

{

echo "Database created";

}

else

{

echo "Error creating database: " . mysql_error();

}

mysql_close($con);

?>

<?php

class ReadSql {

//数据库连接

protected $connect = null;

//数据库对象

protected $db = null;

//sql文件

public $sqlFile = "";

//sql语句集

public $sqlArr = array();

public function __construct($host, $user, $pw, $db_name) {

$host = empty($host) ? C("DB_HOST") : $host;

$user = empty($user) ? C("DB_USER") : $user;

$pw = empty($pw) ? C("DB_PWD") : $pw;

$db_name = empty($db_name) ? C("DB_NAME") : $db_name;

//连接数据库

$this->connect = mysql_connect($host, $user, $pw) or die("Could not connect: " . mysql_error());

$this->db = mysql_select_db($db_name, $this->connect) or die("Yon can not select the table:" . mysql_error());

}

//导入sql文件

public function Import($url) {

$this->sqlFile = file_get_contents($url);

if (!$this->sqlFile) {

exit("打开文件错误");

} else {

$this->GetSqlArr();

if ($this->Runsql()) {

return true;

}

}

}

//获取sql语句数组

public function GetSqlArr() {

//去除注释

$str = $this->sqlFile;

$str = preg_replace('/--.*/i', '', $str);

$str = preg_replace('/\/\*.*\*\/(\;)?/i', '', $str);

//去除空格 创建数组

$str = explode(";\n", $str);

foreach ($str as $v) {

$v = trim($v);

if (empty($v)) {

continue;

} else {

$this->sqlArr[] = $v;

}

}

}

//执行sql文件

public function RunSql() {

foreach ($this->sqlArr as $k => $v) {

if (!mysql_query($v)) {

exit("sql语句错误:第" . $k . "行" . mysql_error());

}

}

return true;

}

}

//范例:

header("Content-type:text/html;charset=utf-8");

$sql = new ReadSql("localhost", "root", "", "log_db");

$rst = $sql->Import("./log_db.sql");

if ($rst) {

echo "Success!";

}

?>

我们常见的提交方式有哪些?

WEB安全之SQL注入

引言:

在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符。通常,用户可以通过以下接口调用数据库的内容:URL地址栏、登陆界面、留言板、搜索框等。这往往给骇客留下了可乘之机。轻则数据遭到泄露,重则服务器被拿下。

1、SQL注入步骤

a)寻找注入点,构造特殊的语句

传入SQL语句可控参数分为两类 1. 数字类型,参数不用被引号括起来,如 2. 其他类型,参数要被引号扩起来,如

b)用户构造SQL语句(如:'or 1=1#;admin'#(这个注入又称PHP的万能密码,是已知用户名的情况下,可绕过输入密码)以后再做解释)

c)将SQL语句发送给DBMS数据库

d)DBMS收到返回的结果,并将该请求解释成机器代码指令,执行必要得到操作

e)DBMS接受返回结果,处理后,返回给用户

因为用户构造了特殊的SQL语句,必定返回特殊的结果(只要你的SQL语句够灵活)

下面,我通过一个实例具体来演示下SQL注入 二、SQL注入实例详解(以上测试均假设服务器未开启magic_quote_gpc)

1) 前期准备工作 先来演示通过SQL注入漏洞,登入后台管理员界面 首先,创建一张试验用的数据表:

CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(64) NOT NULL, `password` varchar(64) NOT NULL, `email` varchar(64) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

添加一条记录用于测试:

INSERT INTO users (username,password,email)VALUES('MarcoFly',md5('test'),'marcofly@test.com');

接下来,贴上登入界面的源代码

<html><head><title>Sql注入演示</title><meta http-equiv="content-type" content="text/html;charset=utf-8"></head><body ><form action="validate.php" method="post"><fieldset ><legend>Sql注入演示</legend><table><tr><td>用户名:</td><td><input type="text" name="username"></td></tr><tr><td>密 码:</td><td><input type="text" name="password"></td></tr><tr><td><input type="submit" value="提交"></td><td><input type="reset" value="重置"></td></tr></table></fieldset></form></body></html>

附上效果图:

当用户点击提交按钮的时候,将会把表单数据提交给validate.php页面,validate.php页面用来判断用户输入的用户名和密码有没有都符合要求(这一步至关重要,也往往是SQL漏洞所在)

! <!--前台和后台对接--><html><head><title>登录验证</title><meta http-equiv="content-type" content="text/html;charset=utf-8"></head><body><?php $conn=@mysql_connect("localhost",'root','') or die("数据库连接失败!");; mysql_select_db("injection",$conn) or die("您要选择的数据库不存在"); $name=$_POST['username']; $pwd=$_POST['password']; $sql="select * from users where username='$name' and password='$pwd'"; $query=mysql_query($sql); $arr=mysql_fetch_array($query);if(is_array($arr)){ header("Location:manager.php"); }else{ echo "您的用户名或密码输入有误,<a href=\"Login.php\">请重新登录!</a>"; } ?></body></html>

注意到了没有,我们直接将用户提交过来的数据(用户名和密码)直接拿去执行,并没有实现进行特殊字符过滤,待会你们将明白,这是致命的。 代码分析:如果,用户名和密码都匹配成功的话,将跳转到管理员操作界面(manager.php),不成功,则给出友好提示信息。 登录成功的界面:

登录失败的提示:

到这里,前期工作已经做好了,接下来将展开我们的重头戏:SQL注入

2) 构造SQL语句 填好正确的用户名(marcofly)和密码(test)后,点击提交,将会返回给我们“欢迎管理员”的界面。 因为根据我们提交的用户名和密码被合成到SQL查询语句当中之后是这样的: select * from users where username='marcofly' and password=md5('test') 很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。

比如:在用户名输入框中输入:' or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为: select * from users where username='' or 1=1#' and password=md5('') 语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:

select * from users where username='' or 1=1#' and password=md5('')

等价于

select* from users where usrername='' or 1=1

因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:

select * from users 没错,该sql语句的作用是检索users表中的所有字段

上面是一种输入方法,这里再介绍一种注入的方法,这个方法又称PHP的万能密码

我们再已知用户名的条件下,可以不能密码即可登入,假设用户名:admin

构造语句:

select * from users where username='admin'#' and password=md5('')

等价于

select * from users where username='admin'

这样即可不能输入密码登入上去的。

数据库就会错认为不用用户名既可以登入,绕过后台的验证,已到达注入的目的。

同样利用了SQL语法的漏洞。

看到了吧,一个经构造后的sql语句竟有如此可怕的破坏力,相信你看到这后,开始对sql注入有了一个理性的认识了吧~ 没错,SQL注入就是这么容易。但是,要根据实际情况构造灵活的sql语句却不是那么容易的。有了基础之后,自己再去慢慢摸索吧。 有没有想过,如果经由后台登录窗口提交的数据都被管理员过滤掉特殊字符之后呢?这样的话,我们的万能用户名' or 1=1#就无法使用了。但这并不是说我们就毫无对策,要知道用户和数据库打交道的途径不止这一条。

本文转载自互联网,如有侵权,联系删除