PHP程序员必须学习的第二课——网站安全问题预防

作为PHP程序员,第一课我们学习了基本的语法。那么在熟悉基本语法之后我们应该学些什么呢?我认为是安全问题。安全问题基于一个网站犹如基石,一着不慎,意味着灾难性的事故。

这里主要就提三点最简单,也是最重要的安全问题。以后再做补充。

1. include

有时候,我们可能会根据用户的输入,include 一个文件,比如

include $filename.'php'

那么如果我的$filename 是外部网站的一个连接呢,比如 http://www.hack.com/hack, 无疑会导致安全漏洞。

所以在写这种include 语句的时候我们必须首先判断该文件是否在本地存在。

if (file_exists($filename.'php'))
    include $filename.'php'

2. xss 注入

xss注入 ,即跨站点脚本注入,指用户在输入中添加类似与<script> alert("I‘m hacking")</script>这样的脚本语句。

常见的会被xss攻击的点包括

2.1$_SERVER[‘PHP_SELF‘]

实例:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

如果用户输入URL 为

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert(‘hacked‘)%3C/script%3E

那么 表单中的内容就会变为:

<form method="post" action="test_form.php"/><script>alert('hacked')</script>

然后就会执行后面所加的js 代码。

2.2表单中输入内容添加script 语句

如果在一个填写内容的表单中添加script 语句。如果不做处理,而又在网页上用echo直接输出的话也会在我们的网页中执行,所以对于从表单中的提交的数据,我们也要做一定的处理。

实例:

<form method="post" action="test_form.php"/>
<input name="text" type="text"/>
</form>

如果我在输入框中输入<script>alert(‘hacked‘)</script> 而如果我们的这个输入框中的内容又会在网页上显示的话,那么该脚本就会被执行。

2.2 处理方法

为了预防这样的攻击,我们可以用php中的一个函数——htmlspecialchars() ,它把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 &lt; 和 &gt; 另外我们还可以1使用

1.(通过 PHP trim() 函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)

2.(通过 PHP stripslashes() 函数)删除用户输入数据中的反斜杠(\)

3. sql 注入

攻击的主要手法是在表单输入中添加注入sql语句。

如以下登录表单

<form method="post" action="test_form.php"/>
<input name="id" type="text"/>
<input name="password" type="password" />
</form>

如果我在id 框中输入 name; drop table *;而我在后台处理中又用到了 ”select from user where id=“.$id;

那么sql语句就会变为

select from user where id=name;drop table *;

然后所有数据表都被删除了。因此预防sql注入尤为重要。

处理方法:

php中有专门的函数 mysql_real_escape_string($sql); 它能够转义sql语句中的特殊字符。

对于输入框中提交数据,如果涉及到数据库操作,我们需要用以上函数处理。

实例:

$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);

$sql = "SELECT * FROM users WHERE
user='" . $user . "' AND password='" . $pwd . "'"
时间: 2024-11-05 22:35:28

PHP程序员必须学习的第二课——网站安全问题预防的相关文章

PHP程序猿必须学习的第二课——站点安全问题预防

作为PHP程序猿.第一课我们学习了基本的语法.那么在熟悉基本的语法之后我们应该学些什么呢?我觉得是安全问题.安全问题基于一个站点宛如基石,一着不慎,意味着灾难性的事故. 这里主要就提三点最简单,也是最重要的安全问题. 以后再做补充. 1. include 有时候.我们可能会依据用户的输入,include 一个文件,比方 include $filename.'php' 那么假设我的$filename 是外部站点的一个连接呢,比方 http://www.hack.com/hack, 无疑会导致安全漏

学习 Python 第二课:用户交互程序

Author:uljfangbr/>E-mail:[email protected]Mentor:Liu YouyuanTime:2018-3-25 要求:1.用户输入相关信息2.打印出如下格式: ----------INFO: NAME ----------NAME:AGE:JOB:SALARY: #! usr/bin/env python #Author:uljfang #E-mail:[email protected] #Mentor:Liu Youyuan #Time:2018-3-25

黑马程序员_OC学习笔记之Foundation框架集合类

OC--集合类 1.OC集合类包括NSArray,NSSet,NSDictionary都是以面向对象的方式操作数组,而且OC数组不像C语言中的数组只能存放同一种数据类型,它可以存放任意类型的对象,但是不能存放非OC对象类型如基本数据类型int,struct,enum等 2.OC数组是以对象的方式存在,因此在创建的时候需要为创建的对象前面加* 3.NSArray数组一旦创建就决定了是不是可变,而且永远是可变或不可变 4.NSArray数组和子类NSMutableArray的基本操作: 1>使用NS

黑马程序员_OC学习笔记之@property和@synthesize

[objc] view plaincopyprint? <span style="font-size:24px;">#import <Foundation/Foundation.h> @interface Person : NSObject { int _age; int age; int _height; int height; int _weight; int weight; int _money; int money; } @property int ag

黑马程序员-C学习笔记之scanf

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.scanf函数介绍 这也是在stdio.h中声明的一个函数,因此使用前必须加入#include<stdio.h>.调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待标准输入设备(比如键盘)输入数据,并且将输入的数据赋值给地址对应的变量. 函数原型为:int scanf(const char*format,...); 二.scanf用

程序员怎么学习C++?3大方法让你快速入门!

C++是一门系统级语言,有些程序员小伙伴学了很久才明白明白栈与堆.内存管理等的含义. 新手程序员学习C++很容易陷入误区,就是不停地啃书本,结果把自己搞的晕头转向的. 一个类的成员函数包含了重载.覆盖.虚函数.纯虚函数等,不得不说复杂. 程序员怎么学习C++?3大方法让你快速入门!最后,如果大家如果在自学遇到困难,想找一个C++的学习环境,可以加入我们的C++学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题. 那么,如何学习C++比较靠谱呢?w3cschool分享3种方法: 0.

好程序员Java学习路线分享5分钟了解基数排序

好程序员Java学习路线分享5分钟了解基数排序,前言:基数排序无需进行比较和交换,而是利用分配和收集两种基本操作实现排序.基数排序分为两种:第一种是LSD ,从最低位开始排序:第二种是 MSD, 从最高位开始排序. 基数排序思想介绍 分配:对于数字,每位的取值范围是0-9,因此需要10个容器(我们可以将其称为桶),这10个桶标号为0-9.每趟排序时,我们取每一个元素在该位的数值依次放入桶中. 收集:在一趟排序完成后,我们按顺序从0-9的桶中依次取元素. 继续进行分配和收集,直到最大位数排序完成.

好程序员Java学习路线分享冒泡排序及优化

? 好程序员Java学习路线分享冒泡排序及优化,冒泡排序是一定典型的交换排序,如排序规则是升序,有如下数列: ? A[0] A[1] A[2] A[3] ...... A[n] ? 将A[0]和A[1]比较,如果A[0]>A[1] ,则交换两个元素的位置,否则不变, 再继续比较A[1]和A[2],直到A[n-1]和A[n].即比较相邻的两个元素,如果前一个大,就交换(否则不交换),再继续比较后面的元素,每一轮比较之后,最大的元素会移动到最后(完成一轮冒泡):再开始第二轮冒泡,本次会选出第二大的元

好程序员Java学习路线分享Java面试题之加载机制

好程序员Java学习路线分享Java面试题之加载机制,面试场景:面试官第一问:请问,我现在编写一个类,类全名如下:java.lang.String,我们知道JDK也给我们听过了一个java.lang.String,那么,我们编写的这个String类能否替换到JDK默认提供,也就是说程序实际运行的时候,会加载我们的String还是JDK的String?为什么?如果,你无法确定?那么第二问:了解类的加载机制吗?知道JDK的类加载器吗?双亲委托机制说说看如果,你还不了解,那么我们聊聊今天的天气吧!1,