Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.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用户输入数据安全_Php_Sql_Security_Html Entities - Fatal编程技术网

PHP用户输入数据安全

PHP用户输入数据安全,php,sql,security,html-entities,Php,Sql,Security,Html Entities,我试图找出在输入数据和输出数据的不同情况下,哪些函数最适合使用 当我允许用户将数据输入MySQL时,保护数据以防止SQL注入或其他任何类型的注入或黑客攻击的最佳方法是什么 当我从数据库中以常规html形式输出数据时,最好的方法是什么,这样脚本就不能运行了 目前我基本上只使用 mysql_real_escape_string(); 在将数据输入数据库之前,这似乎很好,但我想知道这是我需要做的全部,还是其他方法更好 现在我用 stripslashes(nl2br(htmlentities()))

我试图找出在输入数据和输出数据的不同情况下,哪些函数最适合使用

当我允许用户将数据输入MySQL时,保护数据以防止SQL注入或其他任何类型的注入或黑客攻击的最佳方法是什么

当我从数据库中以常规html形式输出数据时,最好的方法是什么,这样脚本就不能运行了

目前我基本上只使用

mysql_real_escape_string(); 
在将数据输入数据库之前,这似乎很好,但我想知道这是我需要做的全部,还是其他方法更好

现在我用

stripslashes(nl2br(htmlentities())) 
大多数时间都是用来输出数据的。我发现这些对于我通常使用它们的目的很好,但是我遇到了htmlentities的问题,我希望能够分别输出一些html标记,例如:

<ul></ul><li></li><bold></bold> 
等等,但我不能

任何帮助都会很好,谢谢。

在您的php配置中,magic\u quotes\u gpc应该关闭。所以你不需要斜杠

对于SQL,请看一看

对于您的自定义标记,因为只有三个,您可以在调用htmlentities之后执行preg_replace调用,以便在将它们插入数据库之前将它们转换回来。

在您的php配置中,magic_quotes\u gpc应该处于禁用状态。所以你不需要斜杠

对于SQL,请看一看


对于您的自定义标记,因为只有三个标记,您可以在调用htmlentities之后执行preg_replace调用,以便在将它们插入数据库之前将它们转换回来。

这是当前最有问题的任务之一:

您需要知道SQL注入和其他攻击者方法是如何工作的。其中对每种方法都有非常详细的说明,并且对PHP的整个安全框架也有非常详细的说明

使用某些框架中的特定安全库也是不错的选择,比如在CodeIgniter或Zend中

接下来,尽可能多地使用,并将模式规则固定到特定的输入格式

使用您框架的准备好的语句或活动记录类

如果确实需要数值,请始终使用int$\u GET['myvar']强制转换输入


有很多其他规则和方法可以保护您的应用程序,但有一条金科玉律是永远不要相信用户的输入。

这是当今最有问题的任务之一:

您需要知道SQL注入和其他攻击者方法是如何工作的。其中对每种方法都有非常详细的说明,并且对PHP的整个安全框架也有非常详细的说明

使用某些框架中的特定安全库也是不错的选择,比如在CodeIgniter或Zend中

接下来,尽可能多地使用,并将模式规则固定到特定的输入格式

使用您框架的准备好的语句或活动记录类

如果确实需要数值,请始终使用int$\u GET['myvar']强制转换输入


有很多其他规则和方法可以保护您的应用程序,但有一条金科玉律是永远不要相信用户的输入。

我同意mikikg的观点,即您需要了解SQL注入和XSS漏洞,然后才能尝试针对这些类型的问题保护应用程序

然而,我不同意他的断言,即使用正则表达式作为SQL注入防止器来验证用户输入。是的,请尽可能验证用户输入。但是不要依靠它来阻止注射,因为黑客经常破坏这些类型的过滤器。另外,不要对你的过滤器要求太严格——很多网站都不允许我登录,因为我的名字中有一个撇号,让我告诉你,当这种情况发生时,这是一种痛苦

您在问题中提到了两种安全问题。第一个是SQL注入。此漏洞是一个已解决的问题。也就是说,如果您使用参数化查询,并且从不将用户提供的数据作为参数传递进来,那么无论发生什么情况,数据库都会为您做正确的事情。对于许多数据库,如果使用参数化查询,则不存在注入的可能性,因为数据实际上不是嵌入在SQL中发送的-数据是以长度前缀或类似的blob形式沿线路传递的。这比数据库转义函数的性能要好得多,而且更安全。注意:如果使用在数据库上生成动态SQL的存储过程,它们也可能有注入问题

您提到的第二个问题是跨站点脚本问题。如果您想允许用户在不首先转义实体的情况下提供HTML,那么这个问题是一个开放的研究问题。只需说一句,如果您允许用户传递某些类型的HTML,那么您的系统很可能会在某个时候遇到XSS问题,从而被确定的攻击者攻击。现在,解决这个问题的最新技术是使用类似的库在服务器上过滤数据。攻击者可以并且确实打破了这个规则
定期进行ese筛选;但到目前为止,还没有人找到更好的方法来保护应用程序免受此类事件的影响。您最好只允许特定的HTML标记白名单,以及实体编码任何其他内容。

我同意Mikigg的观点,即您需要了解SQL注入和XSS漏洞,然后才能尝试针对这些类型的问题保护应用程序

然而,我不同意他的断言,即使用正则表达式作为SQL注入防止器来验证用户输入。是的,请尽可能验证用户输入。但是不要依靠它来阻止注射,因为黑客经常破坏这些类型的过滤器。另外,不要对你的过滤器要求太严格——很多网站都不允许我登录,因为我的名字中有一个撇号,让我告诉你,当这种情况发生时,这是一种痛苦

您在问题中提到了两种安全问题。第一个是SQL注入。此漏洞是一个已解决的问题。也就是说,如果您使用参数化查询,并且从不将用户提供的数据作为参数传递进来,那么无论发生什么情况,数据库都会为您做正确的事情。对于许多数据库,如果使用参数化查询,则不存在注入的可能性,因为数据实际上不是嵌入在SQL中发送的-数据是以长度前缀或类似的blob形式沿线路传递的。这比数据库转义函数的性能要好得多,而且更安全。注意:如果使用在数据库上生成动态SQL的存储过程,它们也可能有注入问题


您提到的第二个问题是跨站点脚本问题。如果您想允许用户在不首先转义实体的情况下提供HTML,那么这个问题是一个开放的研究问题。只需说一句,如果您允许用户传递某些类型的HTML,那么您的系统很可能会在某个时候遇到XSS问题,从而被确定的攻击者攻击。现在,解决这个问题的最新技术是使用类似的库在服务器上过滤数据。攻击者可以并且确实定期破坏这些过滤器;但到目前为止,还没有人找到更好的方法来保护应用程序免受此类事件的影响。您最好只允许特定的HTML标记白名单和实体编码任何其他内容。

您可能想签出,谢谢,但是的,我以前看过,这对我来说没有多大意义\你可能想退房,谢谢,但我以前看过,这对我来说没什么意义\谢谢你的回答,至于magic_quotes_gpc和stripslashes,我需要stripslashes,因为我在提交表单时使用jQuery Serialize,显然这与magic_quotes做的事情是一样的。@Dylan:那么你应该在数据进入数据库之前做stripslashes。数据库中的内容不应该有表示层考虑因素,比如应用了条带斜杠-你永远不知道是否要在某个不是HTML页面的地方使用相同的数据,而在任何地方尝试这样做都是一件痛苦的事情。谢谢你的回答,至于magic_quotes_gpc和stripslashes,我需要stripslashes,因为我在提交表单时使用jQuery Serialize,所以显然这与magic_quotes的作用相同。@Dylan:那么你应该在数据进入数据库之前做stripslashes。数据库中的内容永远不应该有像条带斜杠这样的表示层注意事项-你永远不知道是否要在某个不是HTML页面的地方使用相同的数据,而在任何地方尝试这样做都是一件痛苦的事情。不!不要将正则表达式用作SQL注入防止器来验证用户输入。人们会找到方法打破你的过滤器,或者利用正则表达式引擎中的漏洞。使用逃逸恶心或参数化查询来防止此类攻击;这就是这些设计的目的。请注意,您没有回答用户问题的XSS部分。没有!不要将正则表达式用作SQL注入防止器来验证用户输入。人们会找到方法打破你的过滤器,或者利用正则表达式引擎中的漏洞。使用逃逸恶心或参数化查询来防止此类攻击;这就是这些设计的目的。请注意,您没有解决用户问题的XSS部分。