Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 要使我的web应用程序安全,我应该注意什么?_Php_Security_Web Applications - Fatal编程技术网

Php 要使我的web应用程序安全,我应该注意什么?

Php 要使我的web应用程序安全,我应该注意什么?,php,security,web-applications,Php,Security,Web Applications,我通过阅读web上的各种文章和教程构建了简单的PHP应用程序。因为我现在把它给了一些客户,所以我担心它的安全性。如何确保它不会被黑客入侵?开发web应用程序时,最重要的是像对待瘟疫一样对待用户输入。这是邪恶的,不能相信 任何时候,当您使用一个可能被客户机/用户修改的变量(如POST、GET或其他变量)时,都需要对其进行清理。清除不属于预期输入部分的任何多余积垢 例如,如果您有以下代码: $var = $_POST['myNumber']; echo 'You entered the number

我通过阅读web上的各种文章和教程构建了简单的PHP应用程序。因为我现在把它给了一些客户,所以我担心它的安全性。如何确保它不会被黑客入侵?

开发web应用程序时,最重要的是像对待瘟疫一样对待用户输入。这是邪恶的,不能相信

任何时候,当您使用一个可能被客户机/用户修改的变量(如POST、GET或其他变量)时,都需要对其进行清理。清除不属于预期输入部分的任何多余积垢

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

$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将无法窃取这些信息。的已接受答案包含大量信息。的已接受答案包含大量信息。