Login
网站首页 > 文章中心 > 其它

php网站安全防护_网站安全防护重点

作者:小编 更新时间:2023-10-13 10:56:01 浏览量:56人看过

PHP代码网站如何防范SQL注入漏洞攻击建议分享

做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并学会如何通过代码来保护自己的网站数据库.今天就通过PHP和MySQL数据库为例,分享一下我所了解的SQL注入攻击和一些简单的防范措施和一些如何避免SQL注入攻击的建议.

简单来说,SQL注入是使用代码漏洞来获取网站或应用程序后台的SQL数据库中的数据,进而可以取得数据库的访问权限.比如,黑客可以利用网站代码的漏洞,使用SQL注入的方式取得一个公司网站后台数据库里所有的数据信息.拿到数据库管理员登录用户名和密码后黑客可以自由修改数据库中的内容甚至删除该数据库.SQL注入也可以用来检验一个网站或应用的安全性.SQL注入的方式有很多种,但本文将只讨论最基本的原理,我们将以PHP和MySQL为例.本文的例子很简单,如果你使用其它语言理解起来也不会有难度,重点关注SQL命令即可.

一个简单的SQL注入攻击案例

假如我们有一个公司网站,在网站的后台数据库中保存了所有的客户数据等重要信息.假如网站登录页面的代码中有这样一条命令来读取用户信息.

$q

=

"SELECT

◆id◆

FROM

◆users◆

WHERE

◆username◆=

'

"

.$_GET['username'].

AND

◆password◆=

.$_GET['password'].

";?现在有一个黑客想攻击你的数据库,他会尝试在此登录页面的用户名的输入框中输入以下代码:

;

SHOW

TABLES;

';

DROP

TABLE

[table

name];

这样他就把一张表删除了!

防范SQL注入

-

使用mysql_real_escape_string()函数

在数据库操作的代码中用这个函数mysql_real_escape_string()可以将代码中特殊字符过滤掉,如引号等.如下例:

.mysql_real_escape_string(

$_GET['username']

).

$_GET['password']

";?防范SQL注入

使用mysql_query()函数

mysql_query()的特别是它将只执行SQL代码的第一条,而后面的并不会执行.回想在最前面的例子中,黑客通过代码来例后台执行了多条SQL命令,显示出了所有表的名称.所以mysql_query()函数可以取到进一步保护的作用.我们进一步演化刚才的代码就得到了下面的代码:

//connection

$database

mysql_connect("localhost",

"username","password");

//db

selection

mysql_query("SELECT

",

$database);?除此之外,我们还可以在PHP代码中判断输入值的长度,或者专门用一个函数来检查输入的值.所以在接受用户输入值的地方一定要做好输入内容的过滤和检查.当然学习和了解最新的SQL注入方式也非常重要,这样才能做到有目的的防范.如果使用的是平台式的网站系统如Wordpress,要注意及时打上官方的补丁或升级到新的版本.

php有什么安全规则,有哪些?

php安全篇值过滤用户输入的人参数

规则 1:绝不要信任外部数据或输入

例如,下面的数据元素可以被认为是安全的,因为它们是在PHP中设置的.

复制代码 代码如下:

php

$myUsername = 'tmyer';

$arrayUsers = array('tmyer', 'tom', 'tommy');define("GREETING", 'hello there' . $myUsername);?

但是,下面的数据元素都是有瑕疵的.

$myUsername = $_POST['username']; //tainted!

$arrayUsers = array($myUsername, 'tom', 'tommy'); //tainted!

define("GREETING", 'hello there' . $myUsername); //tainted!

解决方案很简单:必须对 $_POST['username'] 运行清理代码.如果不这么做,那么在使用 $myUsername 的任何其他时候(比如在数组或常量中),就可能污染这些对象.

对用户输入进行清理的一个简单方法是,使用正则表达式来处理它.在这个示例中,只希望接受字母.将字符串限制为特定数量的字符,或者要求所有字母都是小写的,这可能也是个好主意.

清单 ③ 使用户输入变得安全

$myUsername = cleanInput($_POST['username']); //clean!

$arrayUsers = array($myUsername, 'tom', 'tommy'); //clean!

define("GREETING", 'hello there' . $myUsername); //clean!

function cleanInput($input){

$clean = strtolower($input);

return $clean;

}

一些开发人员使用奇怪的语法,或者将语句组织得很紧凑,形成简短但是含义模糊的代码.这种方式可能效率高,但是如果您不理解代码正在做什么,那么就无法决定如何保护它.

例如,您喜欢下面两段代码中的哪一段?

清单 ④ 使代码容易得到保护

//obfuscated code

$input = (isset($_POST['username']) ? $_POST['username']:");//unobfuscated code

$input = ";

if (isset($_POST['username'])){

$input = $_POST['username'];

}else{

在第二个比较清晰的代码段中,很容易看出 $input 是有瑕疵的,需要进行清理,然后才能安全地处理.

本教程将用示例来说明如何保护在线表单,同时在处理表单的 PHP 代码中采用必要的措施.同样,即使使用 PHP regex 来确保 GET 变量完全是数字的,仍然可以采取措施确保 SQL 查询使用转义的用户输入.

纵深防御不只是一种好思想,它可以确保您不会陷入严重的麻烦.

既然已经讨论了基本规则,现在就来研究第一种威胁:SQL 注入攻击.

防止 SQL 注入攻击

在 SQL 注入攻击 中,用户通过操纵表单或 GET 查询字符串,将信息添加到数据库查询中.例如,假设有一个简单的登录数据库.这个数据库中的每个记录都有一个用户名字段和一个密码字段.构建一个登录表单,让用户能够登录.

清单 ⑤ 简单的登录表单

html

head

titleLogin/title

/head

body

form action="verify.php" method="post"

plabel for='user'Username/label

input type='text' name='user' id='user'/

/p

plabel for='pw'Password/label

input type='password' name='pw' id='pw'/

pinput type='submit' value='login'//p

/form

/body

/html

这个表单接受用户输入的用户名和密码,并将用户输入提交给名为 verify.php 的文件.在这个文件中,PHP 处理来自登录表单的数据,如下所示:

清单 ⑥ 不安全的 PHP 表单处理代码

$okay = 0;

$username = $_POST['user'];

$pw = $_POST['pw'];

$sql = "select count(*) as ctr from users where username='".$username."' and password='". $pw."' limit 1″;$result = mysql_query($sql);

while ($data = mysql_fetch_object($result)){if ($data-ctr == 1){

//they're okay to enter the application!

$okay = 1;

if ($okay){

$_SESSION['loginokay'] = true;

header("index.php");

header("login.php");

这 段代码看起来没问题,对吗?世界各地成百(甚至成千)的 PHP/MySQL 站点都在使用这样的代码.它错在哪里?好,记住 "不能信任用户输入".这里没有对来自用户的任何信息进行转义,所以呢使应用程序容易受到攻击.具体来说,可能会出现任何类型的 SQL 注入攻击.

例如,如果用户输入 foo 作为用户名,输入 ' or '1◆='1 作为密码,那么实际上会将以下字符串传递给 PHP,然后将查询传递给 MySQL:

$sql = "select count(*) as ctr from users where username='foo' and password=" or '1◆='1◆ limit 1″;?

这个查询总是返回计数值 1,所以呢 PHP 会允许进行访问.通过在密码字符串的末尾注入某些恶意 SQL,黑客就能装扮成合法的用户.

清单 ⑦ 安全的 PHP 表单处理代码

$sql = "select count(*) as ctr from users where username='".mysql_real_escape_string($username)."' and password='". mysql_real_escape_string($pw)."' limit 1″;$result = mysql_query($sql);

使用 mysql_real_escape_string() 作为用户输入的包装器,就可以避免用户输入中的任何恶意 SQL 注入.如果用户尝试通过 SQL 注入传递畸形的密码,那么会将以下查询传递给数据库:

select count(*) as ctr from users where username='foo' and password='\' or \'1\'=\'1◆ limit 1″数据库中没有任何东西与这样的密码匹配.仅仅采用一个简单的步骤,就堵住了 Web 应用程序中的一个大漏洞.这里得出的经验是,总是应该对 SQL 查询的用户输入进行转义.

但是,还有几个安全漏洞需要堵住.下一项是操纵 GET 变量.

防止用户操纵 GET 变量

在前一节中,防止了用户使用畸形的密码进行登录.如果您很聪明,应该应用您学到的方法,确保对 SQL 语句的所有用户输入进行转义.

清单 ⑧ 示例 template.php

$pid = $_GET['pid'];

//we create an object of a fictional class Page$obj = new Page;

$content = $obj-fetchPage($pid);

在这种情况下,要记住基本规则,不要信任用户输入.应用程序开发人员知道 template.php 接受的个人标识符(PID)应该是数字,所以可以使用 PHP 的 is_numeric()函数确保不接受非数字的 PID,如下所示:

if (is_numeric($pid)){

//didn't pass the is_numeric() test, do something else!

这个方法似乎是有效的,但是以下这些输入都能够轻松地通过 is_numeric() 的检查:

①.00 (有效)

①.00.1 (不应该有小数位)

清单 10. 使用正则表达式限制 GET 变量

if (strlen($pid)){

//do something appropriate, like maybe logging them out or sending them back to home page}

//empty $pid, so send them back to the home page}

//we create an object of a fictional class Page, which is now//moderately protected from evil user input$obj = new Page;

需 要做的只是使用 strlen() 检查变量的长度是否非零;如果是,就使用一个全数字正则表达式来确保数据元素是有效的.如果 PID 包含字母、斜线、点号或任何与十六进制相似的内容,那么这个例程捕获它并将页面从用户活动中屏蔽.如果看一下 Page 类幕后的情况,就会看到有安全意识的 PHP 开发人员已经对用户输入 $pid 进行了转义,从而保护了 fetchPage() 方法,如下所示:

清单 11. 对 fetchPage() 方法进行转义

class Page{

function fetchPage($pid){

$sql = "select pid,title,desc,kw,content,status from page where pid='".mysql_real_escape_string($pid)."'";}

您可能会问,"既然已经确保 PID 是数字,那么为什么还要进行转义?" 因为不知道在多少不同的上下文和情况中会使用 fetchPage() 方法.必须在调用这个方法的所有地方进行保护,而方法中的转义体现了纵深防御的意义.

} else {

//we create an object of a fictional class Page, which is now//even more protected from evil user input$obj = new Page;

缓冲区溢出攻击

缓冲区溢出攻击 试图使 PHP 应用程序中(或者更精确地说,在 Apache 或底层操作系统中)的内存分配缓冲区发生溢出.请记住,您可能是使用 PHP 这样的高级语言来编写 Web 应用程序,但是最终还是要调用 C(在 Apache 的情况下).与大多数低级语言一样,C 对于内存分配有严格的规则.

缓冲区溢出攻击向缓冲区发送大量数据,使部分数据溢出到相邻的内存缓冲区,从而破坏缓冲区或者重写逻辑.这样就能够造成拒绝服务、破坏数据或者在远程服务器上执行恶意代码.

PHP网站安全问题

①.、对POST或GET数据要做处理,我常用的处理程序如下

//get post处理

function dataFilt($data){

if(is_array($data)){

foreach ($data as $v){

dataFilt($v);

if($data){

//防止sql拼组攻击|mysql数据入库处理

if(!get_magic_quotes_gpc()){

$data = addslashes($data);

//数据过滤

if($_POST){

dataFilt($_POST);

if($_GET){

dataFilt($_GET);

②.、页面输出get 或 post数据是要做处理

//页面输出防止xss远程脚本攻击

function xssFilt($data){

if(!$data){

return $data;

return htmlspecialchars($data);

③.、数据库不要开远程访问权限

④.、站点不要开写入、执行权限

以上就是土嘎嘎小编为大家整理的php网站安全防护相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章