繁体   English   中英

为了使我的Web应用程序安全,我应该注意些什么?

[英]What should I be aware of to make my web application secure?

通过浏览网络上的各种文章和教程,我已经构建了简单的PHP应用程序。 由于我现在将其提供给一些客户,因此我担心它的安全性。 我如何确保它不会被黑客入侵?

如果您只是从确保代码安全的角度进行讨论,则应注意一些事项(这是不完整的清单,但应该可以帮助您入门):

SQL注入

如果您的应用程序中有任何SQL查询,并且它们中的任何一个都使用用户的输入,那么您可能容易受到SQL注入的攻击。 这是用户在表单字段处提交恶意内容的时候,当将其插入到查询中时,攻击者就可以访问数据库的其他部分。

预防方法:从用户那里获得的任何输入都需要先清理,然后才能在查询中使用。 为此,您可以使用准备 (或参数化 )语句(即mysqli::preparePDO ),或使用在查询中使用输入值之前先对其进行正确转义的函数(即mysql_real_escape_string )。

跨站点脚本(XSS)攻击

如果您从用户那里获取任何输入并将其输出到另一个页面中(例如,您可能会收集用户数据,然后输出用户列表),则您很可能会受到XSS攻击。 这些工作的方式是将代码(通常是<script>标记)添加到表单字段中,如果在输出之前未对它们进行清理,则攻击者将在页面中添加自己的Javascript,该Javascript将在页面的上下文中运行(因此可以访问Cookie之类的东西)。

预防方法:除非有充分的理由让用户输出HTML,否则每次您输出来自用户的内容时,都应使用htmlspecialchars对其进行清理,这会将潜在的危险字符(例如<> )转换为HTML HTML实体。 如果必须让用户输出HTML,则应具有一组允许的特定标记,并确保仅允许这些标记通过(例如,使用DOM解析器或strip_tags )。

另请参阅: 跨站点脚本(XSS)常见问题解答

跨站点请求伪造(CSRF)攻击

这是一种攻击,攻击者利用用户浏览器中存储的身份验证Cookie来诱骗用户的浏览器自行发出请求(例如,通过向您的站点中注入代码,尽管该攻击实际上可能来自任何地方)。 例如,假设您已经创建了一个银行应用程序,那么攻击者可能导致仍然具有有效身份验证cookie的合法用户为您的网站请求http://yourapp.com/transfer_funds.php?to=attacker ,而无需知道。

预防方法: GET请求应该是幂等的 (也就是说,应始终具有相同的效果,否则不应导致应用程序状态改变)。 这意味着用户可以执行的任何操作(例如CRUD操作)应通过POST而非GET 同样,您应该检查$_POST ,而不是$_REQUEST进行这些操作,因为$_REQUEST将包含来自$_POST$_GET
但是,即使使用POST,您的应用程序仍然可能容易受到CSRF的攻击。 为了更好地保护,许多人使用质询令牌系统,其中应用程序生成与用户会话相关的随机字符串。 该质询令牌与应用程序本身发出的任何相关请求一起传递(通过将其包含在表单中),然后在允许进行任何操作之前进行验证。 请注意,如果您的应用程序具有XSS漏洞,则挑战令牌可能会受到威胁。

另请参阅: 跨站点请求伪造(CSRF / XSRF)常见问题解答

利用eval或系统命令

如果您将eval与用户输入一起使用,那么您将使整个应用程序环境(以及除此之外的服务器环境)面临潜在的攻击,因为如果您不太谨慎(即使您确实),用户可以运行所需的任意代码。 这可能会导致任何事情,包括修改数据库,更改服务器环境,在服务器上安装和运行脚本或二进制文件,删除PHP文件...(这种攻击适用于进行系统调用的任何PHP函数,包括systemfopen ,访问文件系统的任何功能...因此在使用用户输入时要非常小心!)

如何防止:不要在用户输入中使用eval 如果您认为需要在用户输入中使用eval ,则可能有更好(更安全)的方法来解决该问题。

开发Web应用程序时,最重要的事情是像对待瘟疫一样对待用户输入。 这是邪恶的,不能被信任!

每当您使用客户端/用户可以修改的变量(例如POST,GET或其他变量)时,都需要对其进行清理。 除去不属于您期望的输入的任何多余碎屑。

例如,如果您具有以下代码:

$var = $_POST['myNumber'];
echo 'You entered the number ' . $var . '!';

此代码容易受到攻击-您需要在此处清理POST变量:

$cleanVar = sanitize($_POST['myNumber']);
echo 'You entered the number ' . $cleanVar. '!';

其中sanitize(string)是用于删除多余引号和类似内容的函数。 可以想象,您可以传入第二个参数,以正确过滤所需内容的类型。 例如,告诉您的sanitize函数以某种方式剥离废话以获取数字,并以另一种方式剥离字符串。

对于Web应用程序安全性,您确实不能错过OWASP。 它由一组专注于Web应用程序安全性的安全专家组成,并定期更新相关资源。

最著名的是OWASP Top 10 (最新版本2010),它概述了Web应用程序通常遇到的十大安全风险。 当人们试图在渗透测试或代码审查期间评估Web应用程序的安全级别时,这已成为事实上的参考。

对于开发人员,您的开发指南中可能还会增加您的内容,其中包含编写代码时应注意的事项。

此外,{ISC} ^ 2在此主题中也有一些参考 我将推荐一种有关如何将安全性集成到软件开发生命周期(SDLC)中的方法。 您可能还想阅读Web应用程序安全性101演示幻灯片。

我选择的清理用户输入的功能是

$input = mysql_real_escape_string($input);<br>
$input = trim($input);<br>
$input = strip_tags($input);<br>
$input = htmlspecialchars($input);

然后,如果我要禁止某些字符,则只需执行以下操作。

$nono = array("=", "{", "}", ";", "[", "]","$","&");<br>
$input = str_replace($nono, "", $input);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM