Php 要使我的web应用程序安全,我应该注意什么?
我通过阅读web上的各种文章和教程构建了简单的PHP应用程序。因为我现在把它给了一些客户,所以我担心它的安全性。如何确保它不会被黑客入侵?开发web应用程序时,最重要的是像对待瘟疫一样对待用户输入。这是邪恶的,不能相信 任何时候,当您使用一个可能被客户机/用户修改的变量(如POST、GET或其他变量)时,都需要对其进行清理。清除不属于预期输入部分的任何多余积垢 例如,如果您有以下代码:Php 要使我的web应用程序安全,我应该注意什么?,php,security,web-applications,Php,Security,Web Applications,我通过阅读web上的各种文章和教程构建了简单的PHP应用程序。因为我现在把它给了一些客户,所以我担心它的安全性。如何确保它不会被黑客入侵?开发web应用程序时,最重要的是像对待瘟疫一样对待用户输入。这是邪恶的,不能相信 任何时候,当您使用一个可能被客户机/用户修改的变量(如POST、GET或其他变量)时,都需要对其进行清理。清除不属于预期输入部分的任何多余积垢 例如,如果您有以下代码: $var = $_POST['myNumber']; echo 'You entered the number
$var = $_POST['myNumber'];
echo 'You entered the number ' . $var . '!';
此代码易受攻击-您可能希望在此处清理POST变量:
$cleanVar = sanitize($_POST['myNumber']);
echo 'You entered the number ' . $cleanVar. '!';
其中sanitizestring是一个删除多余引号的函数,诸如此类。可以想象,您可以传入第二个参数,以正确过滤您期望的内容类型。例如,告诉您的清理功能以某种方式清除数字中的垃圾,以另一种方式清除字符串中的垃圾。开发web应用程序时,最重要的事情是像对待瘟疫一样对待用户输入。这是邪恶的,不能相信 任何时候,当您使用一个可能被客户机/用户修改的变量(如POST、GET或其他变量)时,都需要对其进行清理。清除不属于预期输入部分的任何多余积垢 例如,如果您有以下代码:
$var = $_POST['myNumber'];
echo 'You entered the number ' . $var . '!';
此代码易受攻击-您可能希望在此处清理POST变量:
$cleanVar = sanitize($_POST['myNumber']);
echo 'You entered the number ' . $cleanVar. '!';
其中sanitizestring是一个删除多余引号的函数,诸如此类。可以想象,您可以传入第二个参数,以正确过滤您期望的内容类型。例如,告诉您的sanitize函数以某种方式去除数字中的垃圾,以另一种方式去除字符串中的垃圾。如果您只是从确保代码安全的角度出发,那么您应该注意以下几点:这是一个不完整的列表,但您应该开始: SQL注入 如果您的应用程序中有任何SQL查询,并且其中任何查询都使用来自用户的输入,那么您可能容易受到SQL注入的攻击。这是指用户在表单字段的位置提交恶意内容,当插入到查询中时,攻击者将能够访问数据库的其他部分 如何防止:在查询中使用用户输入之前,需要对其进行消毒。为了做到这一点,您可以使用准备好的或参数化的语句,例如,或者在查询ie中使用输入值之前,使用正确转义输入值的函数 跨站点脚本XSS攻击 例如,如果您从用户获取任何输入并将其输出到另一个页面,您可能会收集用户数据,然后输出用户列表,您可能容易受到XSS攻击。这些工作方式是将代码标记添加到表单字段中,如果在输出之前未对其进行清理,攻击者将在您的页面中添加自己的Javascript,该页面将在您的页面上下文中运行,因此可以访问cookie之类的内容 如何防止:除非有充分的理由允许用户输出HTML,否则每次输出来自用户的内容时,都应使用进行清理,这会将潜在的危险字符(例如)转化为HTML实体。如果您必须让用户输出HTML,那么您应该拥有一组允许的特定标记,并确保通过使用DOM解析器或其他方法仅允许这些标记 另见: 跨站点请求伪造CSRF攻击 这是一种攻击,攻击者诱使用户的浏览器自行发出请求(例如,通过向您的站点中注入代码),尽管攻击实际上可能来自利用用户浏览器中存储的身份验证cookie的任何地方。例如,假设您创建了一个银行应用程序,攻击者可能会导致仍然拥有活动身份验证cookie的合法用户请求您的站点http://yourapp.com/transfer_funds.php?to=attacker,却不知情 如何防止:GET请求应该是,也就是说,应该始终具有相同的效果,或者不应该导致应用程序状态更改。这意味着用户可以执行的任何操作(例如,操作应该通过POST而不是GET进行)。同样,对于这些操作,您应该检查$\u POST,而不是$\u REQUEST,因为$\u REQUEST将包含来自$\u POST和$\u GET的值。但是,即使您使用POST,您的应用程序仍然可能受到CSRF的攻击。为了更好地保护,许多人使用质询令牌系统,其中应用程序生成与用户会话相关的随机字符串。此质询令牌与任何相关请求一起传递 sts应用程序本身通过将其包含在表单中进行验证,然后在允许进行任何操作之前进行验证。请注意,如果您的应用程序存在XSS漏洞,您的质询令牌可能会受到威胁 另见: 利用eval或系统命令 如果与用户输入一起使用,则会打开整个应用程序环境,甚至服务器环境,使其面临潜在的攻击,因为如果您不非常小心,即使您非常小心,也会让用户能够运行他们想要的任意代码。这可能导致修改数据库、更改服务器环境、在服务器上安装和运行脚本或二进制文件、删除PHP文件等任何情况。。。这种攻击同样适用于任何进行系统调用的PHP函数,包括system、fopen、任何访问文件系统的函数……因此,使用用户输入时要非常小心
如何防止:不要在用户输入时使用eval。如果您认为需要在用户输入中使用eval,那么可能有更好、更安全的方法来解决此问题。如果您只是从确保代码安全的角度出发,那么您应该注意以下几点:这是一个不完整的列表,但您应该开始: SQL注入 如果您的应用程序中有任何SQL查询,并且其中任何查询都使用来自用户的输入,那么您可能容易受到SQL注入的攻击。这是指用户在表单字段的位置提交恶意内容,当插入到查询中时,攻击者将能够访问数据库的其他部分 如何防止:在查询中使用用户输入之前,需要对其进行消毒。为了做到这一点,您可以使用准备好的或参数化的语句,例如,或者在查询ie中使用输入值之前,使用正确转义输入值的函数 跨站点脚本XSS攻击 例如,如果您从用户获取任何输入并将其输出到另一个页面,您可能会收集用户数据,然后输出用户列表,您可能容易受到XSS攻击。这些工作方式是将代码标记添加到表单字段中,如果在输出之前未对其进行清理,攻击者将在您的页面中添加自己的Javascript,该页面将在您的页面上下文中运行,因此可以访问cookie之类的内容 如何防止:除非有充分的理由允许用户输出HTML,否则每次输出来自用户的内容时,都应使用进行清理,这会将潜在的危险字符(例如)转化为HTML实体。如果您必须让用户输出HTML,那么您应该拥有一组允许的特定标记,并确保通过使用DOM解析器或其他方法仅允许这些标记 另见: 跨站点请求伪造CSRF攻击 这是一种攻击,攻击者诱使用户的浏览器自行发出请求(例如,通过向您的站点中注入代码),尽管攻击实际上可能来自利用用户浏览器中存储的身份验证cookie的任何地方。例如,假设您创建了一个银行应用程序,攻击者可能会导致仍然拥有活动身份验证cookie的合法用户请求您的站点http://yourapp.com/transfer_funds.php?to=attacker,却不知情 如何防止:GET请求应该是,也就是说,应该始终具有相同的效果,或者不应该导致应用程序状态更改。这意味着用户可以执行的任何操作(例如,操作应该通过POST而不是GET进行)。同样,对于这些操作,您应该检查$\u POST,而不是$\u REQUEST,因为$\u REQUEST将包含来自$\u POST和$\u GET的值。但是,即使您使用POST,您的应用程序仍然可能受到CSRF的攻击。为了更好地保护,许多人使用质询令牌系统,其中应用程序生成与用户会话相关的随机字符串。通过将该质询令牌包含在表单中,将其与应用程序本身发出的任何相关请求一起传递,然后在允许进行任何操作之前对其进行验证。请注意,如果您的应用程序存在XSS漏洞,您的质询令牌可能会受到威胁 另见: 利用eval或系统命令 如果与用户输入一起使用,则会打开整个应用程序环境,甚至服务器环境,使其面临潜在的攻击,因为如果您不非常小心,即使您非常小心,也会让用户能够运行他们想要的任意代码。这可能导致修改数据库、更改服务器环境、在服务器上安装和运行脚本或二进制文件、删除PHP文件等任何情况。。。这种攻击同样适用于任何构成系统的PHP函数 m调用,包括system、fopen、访问文件系统的任何函数……所以在使用用户输入时要非常小心
如何防止:不要在用户输入时使用eval。如果您认为需要在用户输入中使用eval,那么可能有更好、更安全的方法来解决此问题。对于web应用程序安全性,您真的不能错过OWASP。它由一组专注于web应用程序安全的安全专家组成,并定期更新相关资源 最著名的是最新版本2010,它总结了web应用程序通常遇到的十大安全风险。当人们试图在渗透测试或代码审查期间评估web应用程序的安全级别时,这已经成为事实上的参考 对于开发人员来说,他们的代码也可能会增加,其中包含了编写代码时的一些注意事项
此外,{ISC}^2在这个主题中也有一些优点。我推荐一个关于如何将安全性集成到软件开发生命周期SDLC中的方法。您可能还想阅读Web应用程序安全101演示幻灯片 对于web应用程序安全,您真的不能错过OWASP。它由一组专注于web应用程序安全的安全专家组成,并定期更新相关资源 最著名的是最新版本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);
我选择的清理用户输入的功能有
$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);
我将添加到XSS中,将任何仅由PHP使用的类似cookies的会话设置为httponly,这样至少在支持浏览器的情况下,跨站点javascript将无法窃取这些会话。我将添加到XSS中,将任何仅由PHP使用的类似cookies的会话设置为httponly,以便至少在支持浏览器的情况下,跨站点javascript将无法窃取这些信息。的已接受答案包含大量信息。的已接受答案包含大量信息。