php生成一个随机的密码,方便快捷,可以随机生成安全可靠的密码,希望此文章对大家会有所帮助。
例
代码如下 |
复制代码 |
<?php
header("Content-type:text/html;charset=utf-8");
function getRandPass($length = 6){
$password = '';
//将你想要的字符添加到下面字符串中,默认是数字0-9和26个英文字母
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$char_len = strlen($chars);
for($i=0;$i<$length;$i++){
$loop = mt_rand(0, ($char_len-1));
//将这个字符串当作一个数组,随机取出一个字符,并循环拼接成你需要的位数
$password .= $chars[$loop];
}
return $password;
}
echo getRandPass(12); //随机生成一个12位数的密码
?>
|
生成密码哪下
例2,与第一个有一点像
1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
2、在 $chars 字符串中随机取一个字符
3、重复第二步 n 次,可得长度为 n 的密码
代码如下 |
复制代码 |
function generate_password( $length = 8 ) {
// 密码字符集,可任意添加你需要的字符
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
$password = '';
for ( $i = 0; $i < $length; $i++ )
{
// 这里提供两种字符获取方式
// 第一种是使用 substr 截取$chars中的任意一位字符;
// 第二种是取字符数组 $chars 的任意元素
// $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
$password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
return $password;
}
|
内容过滤多是为了防止一些安全注入或者是跨域操作了,下面我们一起来看看我整理的几个简单的防注入内容过滤程序代码,希望文章对各位同学会有所帮助。
方法一,过滤一些没用的内容
过滤没用的信息比较严格,有用的可能也输入不进去,可以从网上找找其他的过滤方法:
代码如下 |
复制代码 |
function checkHtml($data){
$ret = preg_match("/['.,:;*?~`!@#$%^&+=)(<>{}]|]|[|/|\|"||/",$data);
if ($ret == 1) {
return false; exit;
} else {
return true;
}
}
|
例2 过滤一些html标签了
代码如下 |
复制代码 |
function uh($str)
{
$farr = array(
"/s+/", //过滤多余的空白
"/<(/?)(scripti?framestylehtmlbodytitlelinkmeta?%)([^>]*?)>/isU", //过滤 <script 等可能引入恶意内容或恶意改变显示布局的代码,如果不需要插入flash等,还可以加入<object的过滤
"/(<[^>]*)on[a-zA-Z]+s*=([^>]*>)/isU", //过滤javascript的on事件
);
$tarr = array(
" ",
"<\1\2\3>", //如果要直接清除不安全的标签,这里可以留空
"\1\2",
);
$str = preg_replace( $farr,$tarr,$str);
return $str;
}
|
方法三,上面两种方法都是把要过滤内容放在了程序中,下面我把要过滤的内容放到一个txt文本只,第次只要读文件内容进行判断即可,这样方便维护要过滤的内容。
代码如下 |
复制代码 |
<?php
if($_POST)
{
//获取文件内容转为数组两种方法:
/*
$fcon = file_get_contents("./filter.txt");
$filter_word = explode("n",$fcon);
*/
$filter_word = file("./filter.txt");
//$filter_word = array("test1","test2","test3","test4");
$str = $_POST["mess"];
for($i=0;$i<count($filter_word);$i++)
{
if(preg_match("/".(trim($filter_word[$i]))."/i",$str))
{
echo "<script>alert('您输入的内容含非法内容,请重输!');</script>";
echo "<a href='index.php'>返回</a>";
exit;
}
}
echo "您输入的内容是:".$str;
}
?>
<h2>测试过滤是否生效:</h2>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<p><textarea name="mess" cols="40" rows="4"></textarea></p>
<p><input type="submit" name="sub" value="send"></p>
</form>
|
在网站中表单提交或url获取值我们都可能碰到一些安全问题,下面我总结了一些常用的过滤一些危险特殊字符的解决方法,希望此教程对各位有帮助。
一般,对于传进来的字符,php可以用addslashes函数处理一遍(要get_magic_quotes_gpc()为假才处理,不然就重复转义了!),这样就能达到一定程度的安全要求
比如这样
代码如下 |
复制代码 |
if (!get_magic_quotes_gpc()) {
add_slashes($_GET);
add_slashes($_POST);
add_slashes($_COOKIE);
}
function add_slashes($string) {
if (is_array($string)) {
foreach ($string as $key => $value) {
$string[$key] = add_slashes($value);
}
} else {
$string = addslashes($string);
}
return $string;
}
|
但是还可以更进一步进行重新编码,解码,如下:
代码如下 |
复制代码 |
//编码
function htmlencode($str) {
if(empty($str)) return;
if($str=="") return $str;
$str=trim($str);
$str=str_replace("&","&amp;",$str);
$str=str_replace(">","&gt;",$str);
$str=str_replace("<","&lt;",$str);
$str=str_replace(chr(32),"&nbsp;",$str);
$str=str_replace(chr(9),"&nbsp;",$str);
$str=str_replace(chr(34),"&",$str);
$str=str_replace(chr(39),"&#39;",$str);
$str=str_replace(chr(13),"<br />",$str);
$str=str_replace("'","''",$str);
$str=str_replace("select","sel&#101;ct",$str);
$str=str_replace("join","jo&#105;n",$str);
$str=str_replace("union","un&#105;on",$str);
$str=str_replace("where","wh&#101;re",$str);
$str=str_replace("insert","ins&#101;rt",$str);
$str=str_replace("delete","del&#101;te",$str);
$str=str_replace("update","up&#100;ate",$str);
$str=str_replace("like","lik&#101;",$str);
$str=str_replace("drop","dro&#112;",$str);
$str=str_replace("create","cr&#101;ate",$str);
$str=str_replace("modify","mod&#105;fy",$str);
$str=str_replace("rename","ren&#097;me",$str);
$str=str_replace("alter","alt&#101;r",$str);
$str=str_replace("cast","ca&#115;",$str);
return $str;
}
|
这样就能更放心的对外来数据进行入库处理了, 但是从数据库取出来,在前台显示的时候,必须重新解码一下:
代码如下 |
复制代码 |
//解码
function htmldecode($str) {
if(empty($str)) return;
if($str=="") return $str;
$str=str_replace("sel&#101;ct","select",$str);
$str=str_replace("jo&#105;n","join",$str);
$str=str_replace("un&#105;on","union",$str);
$str=str_replace("wh&#101;re","where",$str);
$str=str_replace("ins&#101;rt","insert",$str);
$str=str_replace("del&#101;te","delete",$str);
$str=str_replace("up&#100;ate","update",$str);
$str=str_replace("lik&#101;","like",$str);
$str=str_replace("dro&#112;","drop",$str);
$str=str_replace("cr&#101;ate","create",$str);
$str=str_replace("mod&#105;fy","modify",$str);
$str=str_replace("ren&#097;me","rename",$str);
$str=str_replace("alt&#101;r","alter",$str);
$str=str_replace("ca&#115;","cast",$str);
$str=str_replace("&amp;","&",$str);
$str=str_replace("&gt;",">",$str);
$str=str_replace("&lt;","<",$str);
$str=str_replace("&nbsp;",chr(32),$str);
$str=str_replace("&nbsp;",chr(9),$str);
$str=str_replace("&",chr(34),$str);
$str=str_replace("&#39;",chr(39),$str);
$str=str_replace("<br />",chr(13),$str);
$str=str_replace("''","'",$str);
return $str;
}
|
虽然多了一步编码,解码的过程,但是安全方面,会更进一步,要如何做,自己取舍吧。
再附一些
代码如下 |
复制代码 |
function safe_replace($string) {
$string = str_replace(' ','',$string);
$string = str_replace(''','',$string);
$string = str_replace(''','',$string);
$string = str_replace('*','',$string);
$string = str_replace('"','"',$string);
$string = str_replace("'",'',$string);
$string = str_replace('"','',$string);
$string = str_replace(';','',$string);
$string = str_replace('<','<',$string);
$string = str_replace('>','>',$string);
$string = str_replace("{",'',$string);
$string = str_replace('}','',$string);
return $string;
}
|
更全面的
代码如下 |
复制代码 |
//处理提交的数据
function htmldecode($str) {
if (empty ( $str ) || "" == $str) {
return "";
}
$str = strip_tags ( $str );
$str = htmlspecialchars ( $str );
$str = nl2br ( $str );
$str = str_replace ( "?", "", $str );
$str = str_replace ( "*", "", $str );
$str = str_replace ( "!", "", $str );
$str = str_replace ( "~", "", $str );
$str = str_replace ( "$", "", $str );
$str = str_replace ( "%", "", $str );
$str = str_replace ( "^", "", $str );
$str = str_replace ( "^", "", $str );
$str = str_replace ( "select", "", $str );
$str = str_replace ( "join", "", $str );
$str = str_replace ( "union", "", $str );
$str = str_replace ( "where", "", $str );
$str = str_replace ( "insert", "", $str );
$str = str_replace ( "delete", "", $str );
$str = str_replace ( "update", "", $str );
$str = str_replace ( "like", "", $str );
$str = str_replace ( "drop", "", $str );
$str = str_replace ( "create", "", $str );
$str = str_replace ( "modify", "", $str );
$str = str_replace ( "rename", "", $str );
$str = str_replace ( "alter", "", $str );
$str = str_replace ( "cast", "", $str );
$farr = array ("//s+/", //过滤多余的空白
"/<(//?)(img|script|i?frame|style|html|body|title|link|meta|/?|/%)([^>]*?)>/isU", //过滤 <script 防止引入恶意内容或恶意代码,如果不需要插入flash等,还可以加入<object的过滤
"/(<[^>]*)on[a-zA-Z]+/s*=([^>]*>)/isU" )//过滤javascript的on事件
;
$tarr = array (" ", "", //如果要直接清除不安全的标签,这里可以留空
"" );
return $str;
}
|
get_magic_quotes_gpc函数是一个用来判断是否为用户提供的数据增加斜线了,这个在php.ini配置文件中哦,下面我来介绍一下get_magic_quotes_gpc()函数说明.
get_magic_quotes_gpc函数介绍
取得 PHP 环境变数 magic_quotes_gpc 的值,属于 PHP 系统功能。
语法: long get_magic_quotes_gpc(void);
返回值: 长整数
本函数取得 PHP 环境配置的变量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示关闭本功能;返回 1 表示本功能打开。
当 magic_quotes_gpc 打开时,所有的 ‘ (单引号), ” (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。
magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的’”加上反斜线。可以用get_magic_quotes_gpc()检测系统设置。
如果没有打开这项设置,可以使用addslashes()函数添加,它的功能就是给数据库查询语句等的需要在某些字符前加上了反斜线。
这些字符是单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)。
默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。
不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
例
利用 get_magic_quotes_gpc()预防数据库攻击的正确做法
代码如下 |
复制代码 |
<?php
function check_input($value)
{
// 去除斜杠
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// 如果不是数字则加引号
if (!is_numeric($value))
{
$value = “‘” . mysql_real_escape_string($value) . “‘”;
}
return $value;
}
$con = mysql_connect(“localhost”, “hello”, “321″);
if (!$con)
{
die(‘Could not connect: ‘ . mysql_error());
}
// 进行安全的 SQL
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = “SELECT * FROM users WHERE
user=$user AND password=$pwd”;
mysql_query($sql);
mysql_close($con);
?>
|
总结如下:
1. 对于magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2. 对于magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行
验证码是一个现在WEB2.0中常见的一个功能了,像注册、登录又或者是留言页面,都需要注册码来验证当前操作者的合法性,我们会看到有些网站没有验证码,但那是更高级的验证了,下面我们来看常用的验证码生成与使用方法。
1 一个简单的验证码实例
1.1 显示验证码的图片
代码如下 |
复制代码 |
<?php
$num=intval(mt_rand(1000,9999));
for($i=0 ; $i<4 ;$i++)
{echo "<img src=img/yzm/".substr(strval($num),$i,1).".gif/>";}
?>
|
1.2 验证过程
代码如下 |
复制代码 |
if (strval($inputyzm)!=strval($num))
{
echo "<script>alert('验证码错误!');history.go(-1);</script>";
exit;
}
|
2 一个汉字的验证码实例
2.1 显示验证码的图片
代码如下 |
复制代码 |
<?php
$str="汉","字","验","证","码"); //可以定义汉字的内容和个数
$word=strlen($str));
for ($i=0;$i<4;$i++)
{
$num=rand(0,$word);
$img = $img."<img src='../images/yzm/".$num".gif'/>";
$pic = $pic.$str[$num];
}
> |
2.2 将生成的随机字符串赋给一个隐藏域
代码如下 |
复制代码 |
<input type="hidden" name="yzm" value="<?php echo $pic; ?/>"> |
2.3 定义一个check()函数
代码如下 |
复制代码 |
<script language="javascript">
function check(form)
{
if(form.yzm.value==""){
alert("请输入验证码");
form.yzm.focus();
return false;
}
if(form.yzm.vale!=form.yz.value)
{alert("验证码错误");
form.yzm.focus();
return false;
}
}
</script>
|
看一个完整的实例
php 验证码生成与调用的例子,平时开发中经常使用,记录一下。
1、验证码生成文件code.php
代码如下 |
复制代码 |
<?
Header("Content-type:image/png");
//定义header,声明图片文件,最好是png,无版权之扰;
//生成新的四位整数验证码
session_start();//开启session;
authnum_session = '';
str = 'abcdefghijkmnpqrstuvwxyz1234567890';
//定义用来显示在图片上的数字和字母;
l = strlen(str); //得到字串的长度;
//循环随机抽取四位前面定义的字母和数字;
for(i=1;i<=4;i++)
{
num=rand(0,l-1);
//每次随机抽取一位数字;从第一个字到该字串最大长度,
//减1是因为截取字符是从0开始起算;这样34字符任意都有可能排在其中;
authnum_session.= str[num];
//将通过数字得来的字符连起来一共是四位;
}
session_register("authnum_session");
//用session来做验证也不错;注册session,名称为authnum_session,
//其它页面只要包含了该图片
//即可以通过_SESSION["authnum_session"]来调用
//生成验证码图片,
srand((double)microtime()*1000000);
im = imagecreate(50,20);//图片宽与高;
//主要用到黑白灰三种色;
black = ImageColorAllocate(im, 0,0,0);
white = ImageColorAllocate(im, 255,255,255);
gray = ImageColorAllocate(im, 200,200,200);
//将四位整数验证码绘入图片
imagefill(im,68,30,gray);
//如不用干扰线,注释就行了;
li = ImageColorAllocate(im, 220,220,220);
for(i=0;i<3;i++)
{//加入3条干扰线;也可以不要;视情况而定,因为可能影响用户输入;
imageline(im,rand(0,30),rand(0,21),rand(20,40),rand(0,21),li);
}
//字符在图片的位置;
imagestring(im, 5, 8, 2, authnum_session, white);
for(i=0;i<90;i++)
{//加入干扰象素
imagesetpixel(im, rand()%70 , rand()%30 , gray);
}
ImagePNG(im);
ImageDestroy(im);
?>
|
以上代码,参考了如下的文章:
php图片验证码
php生成验证码的例子
用php生成带有雪花背景的验证码
2、调用验证码的页面 sessionValidate.php
代码如下 |
复制代码 |
<?php
session_start();
//在页首先要开启session,
//error_reporting(2047);
session_destroy();
//将session去掉,以每次都能取新的session值;
//用seesion 效果不错,也很方便
?>
<html>
<head>
<title>session 图片验证实例</title>
</head>
<body>
此例为session验证实例
<form action="" method="post">
验证码:<input type="text" name="validate" value="" size=10> <img src="checkNum_session.php"><br>
<input type="submit">
</form>
<?php
//打印上一个session;
echo "上一个session:<b>"._SESSION["authnum_session"]."</b><br>";
validate="";
if(isset(_POST["validate"])){
validate=_POST["validate"];
echo "您刚才输入的是:"._POST["validate"]."<br>状态:";
if(validate!=_SESSION["authnum_session"]){
//判断session值与用户输入的验证码是否一致;
echo "<font color=red>输入有误</font>";
}else{
echo "<font color=green>通过验证</font>";
}
}
/*
//打印全部session;
PrintArr(_SESSION);
function PrintArr(aArray){
echo '<xmp>';
print_r(aArray);
echo '</xmp>';
}
*/
?>
|