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