php怎么校验数据,前端数据跟后端数据有什么区别?
网站前端就是指的网站的页面制作,而网站前端工作使用的是html、css、js等计算机语言技术来制作网站页面的样式、排版布局、动态效果、以及数据交互等,这就是网站前端。
网站后端指的是服务端技术或者网站后台技术,简单来说后端就是部署在服务器的应用程序,为前端提供各种业务支持。而后端的工作主要是做平台部署、接口设计和功能实现。常见的网站后端开发语言有asp、asp.net、jsp、php等。同时网站后台技术还包括数据库如MySQL、sqlserver等,数据库是用来存储后台数据的。
网站前端和后台的工作是完全不同的,前端的工作是设计静态页面,后台是结合数据库实现一些代码的逻辑如验证用户登录等,后台更加偏重与逻辑思维。网站之所以分前端和后台是为了使不同的人干不同的事情,前端的专业做前端后端专业的做后台,这样分工就不用一个既懂前端技术又懂后端技术。
我的php代码中登陆界面加一个验证码?
php登陆页面+验证码的实现,参考如下: 1、首先新建一个php站点; 3、新建login.php文件; 用户名文本框昵称为name; 密码文本框为psw; 验证码为yzm; 表单的提交方式为post,提交到check.php。
我们常见的提交方式有哪些?
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#就无法使用了。但这并不是说我们就毫无对策,要知道用户和数据库打交道的途径不止这一条。
软件测试怎么入门?
软件测试是软件工程的重要过程之一,是保证软件质量的重要手段。不同的软件项目类型,软件测试占整个项目开发工作量的15%到90%不等。例如普通数据分析软件,测试投入的工作量比较小,但对于飞行控制、核电管理等软件测试所投入的精力远大于开发投入。软件测试的重要性可见一斑。
现在软件测试的书籍非常多,有介绍测试理论的、有介绍测试过程的、有介绍自动化测试的等等。软件测试想入门可以先选择2到3本好点的书,从阅读开始。
这里我们先介绍一下软件测试的基础知识。
什么是软件测试广义的软件测试说白了就是主动地找软件的问题,包括需求问题、功能问题、可用性问题、可靠性、逻辑问题、健壮性、性能等等。
为什么进行软件测试软件行业发展初期,软件测试的活基本是由开发工程师自己干的,测试方法及过程比较随意。但是随着软件项目规模越来越大,越来越复杂,软件故障越来越难以避免,给企业和个人带来沉痛损失的案例也屡见不鲜,下面仅举两例:
1962年美国水手1号飞船发射后262秒就不得不摧毁掉,后来分析是因为代码中漏敲了一个破折号。
2009年,丰田因雷克萨斯ES350突然刹车失灵,导致车上4名乘客全部罹难。事后丰田不得不在全球召回900万辆汽车,本次召回给丰田带来的经济损失达30亿美元。后来据查是防抱死延时软件故障所致。
因此,对软件产品主动进行认真测试,尽可能地查出可能的问题和漏洞,已经是现代软件开发必做的重要工作。通过软件测试将软件故障消灭在发布之前,这是所有软件从业人员的共同心愿。
静态测试和动态测软件测试有动态测试和静态测试两种方法。
静态测试就是通过阅读软件的需求 、设计、编码等静态文档,通过分析静态文字或图表来发现需求、设计、编码存在的问题。
可见静态测试的主要方式就是同级评审,其好处是可以在软件需求阶段、设计阶段和编码期间就可以提前进行检查分析,及早发现存在的问题。一般而言,问题发现越早,修复成本越低。从这个角度看,静态测试比动态测试具有更高的性价比。
动态测试就是等软件开发完毕,测试工程师安装好软件,在不同的环境、不同的输入的情况下,运行并测试软件的功能、可用性、性能等。我们通常所说的软件测试就是指动态测试。
单元测试、集成测试、用户测试、阿尔法测试软件系统根据功能和系统内部结构可以划分为一系列的软件模块(或子系统),具体开发是一个模块一个模块地实现的(当然多个模块可以并行开发)。 每实现一个模块,开发人员都要认真地对所开发的模块进行测试,这种主要由开发工程师执行的模块测试,我们称之为单元测试。
单元测试期间一般要开发专门的测试主程序(有时还要开发测试桩程序)。
整个系统开发完毕后,由测试团队对软件进行整体的测试,我们称之为集成测试。
用户拿到我们开发的软件产品或系统后,他们一般也要进行独立的测试,这种类型的测试称之为用户测试。
如果认为软件基本合格了,企业可以将软件进行小范围发布(如企业内部、免费用户群等),让大家测试用并反馈发现的问题,这个过程叫阿尔法测试。
单元测试、集成测试都需要事先进行规划,有明确的流程要求。
集成测试流程集成测试与软件开发是软件开发过程的两条并行线程,其流程如下图所示:
如上图所示,集成测试可划分为测试分析、测试设计(包括测试准备)、测试执行三大步骤。
测试分析阶段对应系统的需求分析,它将软件系统进行功能拆分,分成不同级别的多个功能点,这些功能点是随后测试设计的基础。
测试设计在测试分析的基础上为每个功能点设计多个测试用例。有些用例重点测试基本功能,有些用例重点测试错误响应,有些用例测试边界条件,有些用例测试性能等等。测试数据的收集准备是测试设计的重要工作内容,也往往是测试过程的难点所在。
集成测试执行阶段使用测试设计生成的测试用例和测试数据,对软件逐个测试用例进行测试。发现软件故障应按公司模板或使用专门的故障跟踪工具进行规范化的故障跟踪记录。
一轮测试完毕后,开发工程师应该根据故障记录进行问题重现、分析、修复,并认真记录好修复信息。
通常软件提交给用户前需要进行三轮以上的集成测试。
实际工作中我们常常发现,按正规的集成测试流程走也有一定的问题,就是工作量大,投入时间长,测试效果往往不好。大道无形,我们不妨根据项目和企业自身人力资源特点,将集成测试和流程测试、Bug Hunting测试等多种测试方式结合起来使用,效果会更好一些,
测试工程师的职业规划大的软件公司通常有专门的测试团队,测试团队常年累月负责软件的测试分析、测试设计、集成测试工作。
好的测试工程师需要熟悉目标软件所在行业的专业背景知识,需要对项目需求细节有深入透彻的把握,需要有对软件内在逻辑的直觉领悟,也需要足够的耐性、细心和认真负责的工作态度。加班加点是软件测试人员的家常便饭,团队冲突也是测试团队要面对的常客,当一个好的测试工程师的确不容易。
小规模软件公司,往往没有专门的测试团队,测试工作往往由开发工程师、现场工程师轮流担当。
测试工程师们在测试工作得心应手之后,结合自身特点,学习掌握一些开发技能,对自己职业发展会有帮助。
什么是相对论?
首先说狭义相对论:狭义相对论(the Specia of relatively)作为当代21世纪的五大物理基石之一,它基于“所有的参考系在物理体系中都完全等效”这个事实(all inertial frames of reference are completely equivalent)
爱因斯坦(Einstein)于1905年发表了题为 《论动体的电动力学》一文中提出的区别于牛顿时空观的时空理论
对于力学(mechanics)和那些电磁学(electromagnetism),当两个不同的参考系相对运动时,在特定情形下距离和时间间隔的测量就需要修正(modified),而相对论正好可以满足这一点。
修正后的运动学(kinematic)导致了新的动力学概论(The necessitate generalization of dynamics )的形成。
狭义相对论比牛顿力学(Newton's laws)更具有普遍性(generality)。
牛顿力学只是狭义相对论下的近似,它在我们日常生活中运用广泛,依然保持着活力,因为它简单可以处理比光速低很多的运动问题。
顾名思义,广义相对论(general relatively)包含了狭义相对论,就像狭义相对论可以推导出牛顿力学那样。狭义相对论与广义相对论有什么不同呢?
狭义相对论的时空背景是平直的四维时空,而广义相对论则适用于任意伪黎曼空间,它的时空背景是弯曲的黎曼时空。
四维时空
黎曼时空
爱因斯坦-罗森桥
当一个现象在两个不同的坐标系中被观测时,那两个坐标系各自观察的结果将可能怪异性的不尽相同同:尽管他们看起来相似,事实上已经存在微妙的变化(subtle and far-reaching)而差之千里了,这就是相对论的神奇所在。