php防sql注入和xss攻击

mysql_escape_string  //防sql注入和XSS攻击通用
正则验证必不可少
防XSS攻击
//htmlentities和htmlspecialchars这两个函数对 '之类的字符串支持不好,都不能转化, 所以用htmlentities和htmlspecialchars转化的字符串只能防止XSS攻击,不能防止SQL注入攻击.

测试代码:
$new_name=htmlspecialchars($name); //把< >号转义,展示的时候跟填写的一模一样
$new_name=htmlentities($name); //暂时看起来跟htmlspecialchars的效果一样
$new_name=htmlentities($name,ENT_COMPAT,"GB2312"); //防止中文乱码。。但是我测试的时候没有乱码
$new_name=strip_tags($name); //把js标签直接剥离,展示的时候没有js标签了

防sql注入
sql攻击实例:
比如在一个登录界面,要求输入用户名和密码:
可以这样输入实现免帐号登录:
用户名: ‘or 1 = 1 –或者' or 1=1 #
密 码:
点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)
addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。
最好对magic_quotes_gpc已经开放的情况下,还是对$_POST[’lastname’]进行检查一下。
再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string ,两者的区别是:mysql_real_escape_string 考虑到连接的
当前字符集,而mysql_escape_string 不考虑。
总结一下:
* addslashes() 是强行加\;
* mysql_real_escape_string()  会判断字符集,但是对PHP版本有要求;
* mysql_escape_string不考虑连接的当前字符集。

如果想用mysql_real_escape_string,还得手动连库
mysql_connect('127.0.0.1','root','root');
mysql_select_db('test1');
mysql_query('set names utf8');
$lastname=  mysql_real_escape_string( $lastname );

你可能感兴趣的:(安全)