作为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 字符会被替换为 < 和 > 另外我们还能够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 验证电子邮件地址