我开始写php web应用程序(静态php),我做了所有的东西。
但是,我应该如何检查常见的安全漏洞:SQL注入, XSS, CSRF等在我的web应用程序?
首先,自动漏洞扫描器无法提供保证。所以你不能相信他们的结果。我将简短地解释为了保护PHP应用程序必须做些什么。
1。使用PDO代替原生MySQL库
为了保护您的应用程序免受SQL注入漏洞的攻击,这是最关键的web应用程序漏洞之一,您必须使用PDO。例如,
不要这样做。
<?php
$cal = $_GET["calories"];
mysql_query('SELECT name, colour, calories
FROM fruit
WHERE calories < '.$cal);
?>
。
<?php
$calories = $_GET['calcalories'];
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->execute();
?>
2。对要在客户端浏览器上打印的每个变量进行编码这是防止XSS的关键。你应该使用编码方法之前,echo/print变量到浏览器!跨站攻击有三种类型。第一个是反射XSS,第二个是存储XSS,最后一个是基于Dom的XSS。请阅读以下链接,了解什么是XSS以及如何保护您的应用程序免受XSS漏洞的侵害。https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)。试着解释其中的三个需要两到三页!所以我将跳过这部分。
3。不安全直接对象引用
取决于web应用程序,此漏洞可能是最危险的一个。因为这与PHP或代码语法无关。此漏洞的出现是由于应用程序设计失败和代码剖析。例如,
www.gsmfirm.com/invoice/1337 -> It's your invoice for January!
www.gsmfirm.com/invoice/1338 -> It belongs to someone else!
请阅读以下链接。我相信你会明白什么是IDOR,它会导致什么。http://avsecurity.in/2013/06/nokia-insecure-direct-object-reference/
4。PHP对象注入漏洞
简短说明,不要使用serialize()函数。使用json_encode代替。如果你愿意看看下面的链接。您可以清楚地了解什么是对象注入漏洞。https://www.owasp.org/index.php/PHP_Object_Injection
5。CSRF
跨站点请求伪造也是很危险的。基本上,你必须确定"这个请求是用户故意发送的吗?"为了确保这一点,您必须为每个用户生成唯一的密钥并将其存储在会话中,并且必须将其用作html标记内部的隐藏html输入。然后您将为每个表单请求检查该值。如果不相同,则表示客户端不是故意发送请求的。6。失效认证和会话管理
基本上,有两种类型的漏洞。会话固定和会话预测。为了防止会话固定,您必须在成功登录后重新生成会话密钥。另外,你必须使用HTTP头Cookie参数来携带会话密钥,而不是GET参数。
会话预测是会话密钥生成算法的弱点。使用复杂密钥生成方法生成不可预测的密钥。请不要尝试开发自己的生成或加密算法。
PS:我不能发布超过2个链接,因为声誉点。不好意思
可以使用Arachni Scanner。它是一个开源工具,具有web和amp;cli接口。
我找到了一家公司,但我还没有尝试过:http://lp.checkmarx.com/php-code-security
这里有一些提示:http://code.tutsplus.com/tutorials/5 -帮助-建议- -创造-安全- php应用程序-网- 2260
-
如果有用户认证,那么你应该检查,当前登录的用户不能访问任何其他与他无关的数据。
表示当前用户从客户表中有3个条目,那么他应该只能访问这3个条目。 如果你正在使用框架,那么他们已经实现了许多安全功能。例如,在Zend框架中,表单元素能够在表单中添加csrf。因此,在给定的时间内,表单应提交,csrf密钥将在后端自动验证。
大多数框架提供htmlescapers。因此,通过使用它,您可以在一定程度上避免xss。对于静态/核心php代码,你应该使用htmlentities来避免多余的字符。