sql注入攻击与预防

一、常用的sql注入方法

1、数字

http://localhost/article.php?id=-1 OR 1=1;

2、字符串

用户登陆

用户名填 admin”#

密码可以随便填

可能拼接的sql语句是

'SELECT * FROM admin WHERE username=admin"#" AND password="123"'

注意:#后面的代码会被注释,因此可以绕过对用户名和密码对判断。

二、常见防御sql注入的方法

1、最有效简单的办法是使用pdo预处理

pdo预处理会对传入的参数进行处理,可以有效防御sql注入

2、对参数进行过滤

数字参数,可以使用is_numeric判断或intval强转

字符串参数,可以使用正则匹配过滤

preg_match('/[a-zA-Z]{6,}/',$usrname);

或者用addslashes对特殊字符转义。

 

curl请求范例

php的curl请求是非常好用的功能,下面简单写个范例:

function curl_get($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    $response = curl_exec($ch);
    $head_info = curl_getinfo($ch);

    if ($head_info['http_code'] != 200){
        return false;
    }

    return $response;
}

 

PHP使用preg_replace_callback函数实现文件内容的批量更换

最近遇到这样一个小需求:对很多个HTML页面(大概有一百个左右)进行修改,修改里面的评论时间。由于有一定的规律,我就想到了用PHP提供的一些方法进行批量操作。这里用到的是 正则匹配替换函数 preg_replace_callback()。

preg_replace_callback() 与 preg_replace() 很相似,相比来讲 preg_replace_callback() 函数功能更强大,可以使用回调函数对匹配内容进行替换修改。

语法: mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject )

$pattern是正则匹配语句;$callback是回调函数;$subject是要替换的内容。

下面是我的应用实例:

1.下面的这种写法,可以在php5.2版本及以上运行

$content = '<span class="list_item_time">12-12 8:59:11</span> <span class="list_item_time">11-20 12:59:11</span>';
$pattern = '/<span class=\"list_item_time\">(.*?)?<\/span>/i';
$replace = array('昨天10:21:30', '昨天16:11:58');
function sks_replace($ms)
{
	global $replace;
        static $i = 0;
	$str = $replace[$i];
	$str = '<span class="list_item_time">'. $str. '</span>';
	$i++;
	return $str;
}
$new = preg_replace_callback($pattern,'sks_replace',$content);

2.下面的写法,由于使用到了匿名函数,只能在php5.3以上版本可以运行

$content = '<span class="list_item_time">12-12 8:59:11</span> <span class="list_item_time">11-20 12:59:11</span>';
$pattern = '/<span class=\"list_item_time\">(.*?)?<\/span>/i';
$replace = array('昨天10:21:30', '昨天16:11:58');
$new = preg_replace_callback(
$pattern,
function($ms)
{
	global $replace;
        static $i = 0;
	$str = $replace[$i];
	$str = '<span class="list_item_time">'. $str. '</span>';
	$i++;
	return $str;
},
$content);

3.以上两种是简单的匹配一个内容 $content,如果有多个内容需要循环匹配替换,就需要代码更复杂一些

以下代码是实现目录结构为下图内容的循环替换

$pro = array('kqky_x', 'nrkc', 'yjs_x', 'yzy', 'pz');

function sks_replace($ms)
{
	//注意这里不能再用静态变量对$j循环了,而是用全局变量
	global $replace, $j;
	$str = $replace[$j];
	$str = '<span class="list_item_time">'. $str. '</span>';
	$j++;
	return $str;
}

foreach($pro as $p)
{
	$file = './'. $p. '.txt';
	if (!is_file($file)){
		echo 'not open '. $file. '<br>';
		continue;
	}
	$replace = file($file);
	foreach($replace as &$value){
		$value = mb_convert_encoding($value, 'utf-8', 'gbk');
	}

	$k = 9;
	for($i = 0; $i < $k; $i++)
	{
		if ($i == 0){
			$i = '';
		}
		$html = '../skswenda'. $i. '/'. $p. '/index.html';
		if ($p == 'pz'){
			$html = '../skswenda/pz'. $i. '/index.html';
			$k = 7;
		}		
		if (!is_file($html)){
			echo 'not open '. $html. '<br>';
			continue;
		}
		$content = file_get_contents($html);
		$pattern = '/<span class=\"list_item_time\">(.*?)?<\/span>/i';
		$j = 0;
		$new = preg_replace_callback($pattern,'sks_replace',$content);
		$handle = fopen($html, 'w');
		fwrite($handle, $new);
		fclose($handle);
	}
}

echo 'replace success';