作为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 . "'"

4. email 注入

这受众面比較窄,仅仅要在你的页面存在发送email操作时预防就可以。

实例:

假设用户在正文中输入

someone@example.com%0ACc:person2@example.com
%0ABcc:person3@example.com,person3@example.com,
anotherperson4@example.com,person5@example.com
%0ABTo:person6@example.com

信息,那么在发送邮件时这些文本就会被插入到邮件头部。而导致邮件也被发送到这些用户。

<?php
if (isset($_REQUEST['email']))
//if "email" is filled out, send email
{
//send email
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail("someone@example.com", "Subject: $subject",
$message, "From: $email" );
echo "Thank you for using our mail form";
}
else
//if "email" is not filled out, display the form
{
echo "<form method='post' action='mailform.php'>
Email: <input name='email' type='text' /><br />
Subject: <input name='subject' type='text' /><br />
Message:<br />
<textarea name='message' rows='15' cols='40'>
</textarea><br />
<input type='submit' />
</form>";
}
?>

为了预防email注入,我们须要对用户输入的邮件信息进行处理。在这里我们能够使用filter_var 对文本进行过滤。

function spamcheck($field)
{
//filter_var() sanitizes the e-mail
//address using FILTER_SANITIZE_EMAIL
$field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() validates the e-mail
//address using FILTER_VALIDATE_EMAIL
if(filter_var($field, FILTER_VALIDATE_EMAIL))
{
return TRUE;
}
else
{
return FALSE;
}
}

过滤器功能:

FILTER_SANITIZE_EMAIL 从字符串中删除电子邮件的非法字符

FILTER_VALIDATE_EMAIL 验证电子邮件地址

PHP程序猿必须学习的第二课——站点安全问题预防的更多相关文章

  1. Java程序猿JavaScript学习笔记(2——复制和继承财产)

    计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...

  2. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  3. Java程序猿JavaScript学习笔记(14——扩大jQuery UI)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  4. Python-Django框架学习笔记——第二课:Django的搭建

    Django 环境搭建 一. 版本选择 Django 1.5.x 支持 Python 2.6.5 Python 2.7, Python 3.2 和 3.3. Django 1.6.x 支持 Pytho ...

  5. 《梳理业务的三个难点》---创业学习---训练营第二课---HHR---

    一,<开始学习> 1,融资的第一步:把业务一块一块的梳理清楚. 2,预热思考题: (1)投资人会问能做多大,天花板怎么算?你的答案可以得到大家的认同吗?(四种方法,直接引用,自顶向下,自底 ...

  6. Python学习,第二课 - 字符编码

    关于字符编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill) ASCII(American Standard Code for Information Inte ...

  7. maven学习系列第二课,关于springmvc的pop.xml的依赖的添加

    不说废话了,图的书序就是操作顺序 1. 2.

  8. Python学习笔记 第二课 循环

    >>> movies=["The Holy Grail", 1975, "The Life of Brian", 1979, "Th ...

  9. JSP学习(第二课)

    把GET方式改为POST在地址栏上就不会显示. 发现乱码了,设置编码格式(这个必须和reg.jsp中page的charset一致):  但是注意了!我们传中文名,就会乱码: 通过get方式提交的请求无 ...

随机推荐

  1. <正向/反向>最大匹配算法(Java)

    算法描述(正向): 给定最大词长n,待分词文本str,指针f=0,词典dic文档 1 取子串sub=str(f,f+n) 2 如果(遍历dic,有匹配sub) f++; 3 否则 n--; 4 注意: ...

  2. 解决 winedit 打开tex文件 reading error

    从网上下载的论文模板,发现直接双击打开.tex文件(默认关联用winedit打开)时会出现reading error,然后看不到任何文字(网上有人讨论打开是乱码的问题,但是我的是完全看不到任何东西), ...

  3. 【STM32学习笔记1】基于固件库的STM32_MDK工程模版

    文章包含STM32固件库介绍和工程模板搭建两方面内容. 一.STM32固件库介绍 要建立工程模板,首先要对STM32的固件库有所了解.STM32的固件可以从ST官网下载,网址为:http://www. ...

  4. python基础学习笔记6--异常

    异常 1.什么是异常?  python用异常对象来表示( exception object)异常情况.如果异常没有被处理或扑捉,程序就会所谓的回溯(TraceBack,一种错误信息)而终止执行: 2. ...

  5. 如何使用沉浸式状态栏,让你的app风格更好看

    大家都知道,传统的手机状态栏非黑即白,经常让整个app显得不是那么的好看,如何让状态栏的颜色跟你整个界面的颜色能够融为一体,这是我们一直想要的,现在给大家展示一下: 由图可见,第一张是没有使用沉浸式状 ...

  6. Unix Shells: Bash, Fish, Ksh, Tcsh, Zsh

    Hyperpolyglot Unix Shells: Bash, Fish, Ksh, Tcsh, Zsh grammar | quoting and escaping | charactersvar ...

  7. BF、KMP、BM、Sunday算法讲解

    BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中最重要的操作之一. 事实上也就是从一个母串中查找一模板串,判定是否存在. 现给出四种匹配算法包括BF(即 ...

  8. nodejs服务端开发学习笔记

    正在学习中,不断改错... 学习了一段时间nodejs,对其中的很多东西还不是很理解,在网上看过很多的例子,希望通过自己的一些总结让自己了解的更全面些,同时也作为学习笔记留存备忘. 准备工作 node ...

  9. The Highest Mark(01背包)

    The Highest Mark Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  10. Android UI设计

    Android UI设计--PopupWindow显示位置设置 摘要: 当点击某个按钮并弹出PopupWindow时,PopupWindow左下角默认与按钮对齐,但是如果PopupWindow是下图的 ...