我正在尝试提出一个函数,我可以通过我的所有字符串来消毒.因此,从中输出的字符串对于数据库插入是安全的.但是那里有很多过滤功能我不知道应该使用/需要哪些功能.
请帮我填空:
function filterThis($string) { $string = mysql_real_escape_string($string); $string = htmlentities($string); etc... return $string; }
Charles.. 421
停止!
你在这里弄错了.哦,不,你已经选择了正确的PHP函数来使你的数据更安全一些.没关系.您的错误在于操作顺序,以及如何以及在何处使用这些功能.
了解清理和验证用户数据,转储存储数据以及转发数据以进行演示之间的区别非常重要.
当用户提交数据时,您需要确保他们提供了您期望的内容.
例如,如果您需要一个数字,请 确保提交的数据是一个数字.您还可以将用户数据转换为其他类型.提交的所有内容最初都被视为字符串,因此强制将已知数字数据转换为整数或浮点数使得清理快速且无痛.
自由格式文本字段和textareas怎么样?您需要确保这些字段中没有任何意外.主要是,您需要确保不应包含任何HTML内容的字段实际上不包含HTML.有两种方法可以解决这个问题.
首先,您可以尝试使用转义 HTML输入htmlspecialchars
.您不应该使用htmlentities
中和HTML,因为它还会执行它认为也需要编码的重音和其他字符的编码.
其次,您可以尝试删除任何可能的HTML. strip_tags
既快速又简单,但也很邋.. HTML Purifier在删除所有HTML以及允许标签和属性的选择性白名单方面做得更彻底.
现代PHP版本附带过滤器扩展,它提供了一种全面的方法来清理用户输入.
确保提交的数据没有意外内容,这只是工作的一半.您还需要尝试确保提交的数据包含您可以实际使用的值.
如果您期望1到10之间的数字,则需要检查该值.如果您使用带有微调器和步骤的新奇特HTML5时代数字输入之一,请确保提交的数据与步骤一致.
如果该数据来自应该是一个下拉菜单,请确保提交的值是菜单中显示的值.
那些满足其他需求的文本输入呢?例如,日期输入应通过strtotime
或DateTime类进行验证.给定日期应在您期望的范围之间.电子邮件地址怎么样?前面提到的过滤器扩展可以检查地址是否格式正确,尽管我是is_email库的粉丝.
所有其他表单控件也是如此.有收音机按钮?验证列表.有复选框吗?验证列表.有文件上传吗?确保该文件是预期类型,并将文件名视为未过滤的用户数据.
每个现代浏览器都内置了一整套开发人员工具,这使得任何人都可以轻松操作您的表单. 您的代码应该假定用户已完全删除了表单内容的所有客户端限制!
既然您已确保数据采用预期格式且仅包含预期值,则需要担心将数据保存到存储中.
每种数据存储机制都有一种特定的方法来确保数据被正确转义和编码.如果您正在构建SQL,那么在查询中传递数据的可接受方式是使用带占位符的预处理语句.
在PHP中使用大多数SQL数据库的更好方法之一是PDO扩展.它遵循准备语句,将变量绑定到语句,然后将语句和变量发送到服务器的常见模式.如果您之前没有使用PDO,那么这是一个非常好的面向MySQL的教程.
一些SQL数据库在PHP中有自己的专业扩展,包括SQL Server,PostgreSQL和SQLite 3.每个扩展都准备了语句支持,它以与PDO相同的prepare-bind-execute方式运行.有时您可能需要使用这些扩展而不是PDO来支持非标准功能或行为.
MySQL也有自己的PHP扩展.事实上,其中两个.你只想使用一个叫mysqli的人.旧的"mysql"扩展已被弃用,在现代时代使用并不安全或理智.
我个人不是mysqli的粉丝.它对预准备语句执行变量绑定的方式是不灵活的,并且可能很难使用.如有疑问,请改用PDO.
如果您没有使用SQL数据库来存储数据,请查看您正在使用的数据库接口的文档,以确定如何安全地通过它传递数据.
如果可能,请确保数据库以适当的格式存储数据.将数字存储在数字字段中.将日期存储在日期字段中.将钱存入十进制字段,而不是浮点字段.查看数据库提供的有关如何正确存储不同数据类型的文档.
每次向用户显示数据时,必须确保数据安全转义,除非您知道不应对其进行转义.
在发布HTML时,您几乎应该始终传递最初由用户提供的任何数据htmlspecialchars
.事实上,你唯一不应该这样做的时候就是你知道用户提供了HTML,而且你知道它已经使用白名单对它进行了清理.
有时您需要使用PHP生成一些Javascript.Javascript没有与HTML相同的转义规则!通过PHP为Javascript提供用户提供的值的安全方法是通过json_encode
.
数据验证还有很多细微差别.
例如,字符集编码可能是一个巨大的陷阱.您的应用程序应遵循" UTF-8一直 "中概述的实践.将字符串数据视为错误的字符集时,可能会发生假设性攻击.
之前我提到过浏览器调试工具.这些工具还可用于处理cookie数据. Cookie应被视为不受信任的用户输入.
数据验证和转义只是Web应用程序安全性的一个方面.您应该了解Web应用程序攻击方法,以便您可以构建对它们的防御.
你在这里弄错了.哦,不,你已经选择了正确的PHP函数来使你的数据更安全一些.没关系.您的错误在于操作顺序,以及如何以及在何处使用这些功能.
了解清理和验证用户数据,转储存储数据以及转发数据以进行演示之间的区别非常重要.
当用户提交数据时,您需要确保他们提供了您期望的内容.
例如,如果您需要一个数字,请 确保提交的数据是一个数字.您还可以将用户数据转换为其他类型.提交的所有内容最初都被视为字符串,因此强制将已知数字数据转换为整数或浮点数使得清理快速且无痛.
自由格式文本字段和textareas怎么样?您需要确保这些字段中没有任何意外.主要是,您需要确保不应包含任何HTML内容的字段实际上不包含HTML.有两种方法可以解决这个问题.
首先,您可以尝试使用转义 HTML输入htmlspecialchars
.您不应该使用htmlentities
中和HTML,因为它还会执行它认为也需要编码的重音和其他字符的编码.
其次,您可以尝试删除任何可能的HTML. strip_tags
既快速又简单,但也很邋.. HTML Purifier在删除所有HTML以及允许标签和属性的选择性白名单方面做得更彻底.
现代PHP版本附带过滤器扩展,它提供了一种全面的方法来清理用户输入.
确保提交的数据没有意外内容,这只是工作的一半.您还需要尝试确保提交的数据包含您可以实际使用的值.
如果您期望1到10之间的数字,则需要检查该值.如果您使用带有微调器和步骤的新奇特HTML5时代数字输入之一,请确保提交的数据与步骤一致.
如果该数据来自应该是一个下拉菜单,请确保提交的值是菜单中显示的值.
那些满足其他需求的文本输入呢?例如,日期输入应通过strtotime
或DateTime类进行验证.给定日期应在您期望的范围之间.电子邮件地址怎么样?前面提到的过滤器扩展可以检查地址是否格式正确,尽管我是is_email库的粉丝.
所有其他表单控件也是如此.有收音机按钮?验证列表.有复选框吗?验证列表.有文件上传吗?确保该文件是预期类型,并将文件名视为未过滤的用户数据.
每个现代浏览器都内置了一整套开发人员工具,这使得任何人都可以轻松操作您的表单. 您的代码应该假定用户已完全删除了表单内容的所有客户端限制!
既然您已确保数据采用预期格式且仅包含预期值,则需要担心将数据保存到存储中.
每种数据存储机制都有一种特定的方法来确保数据被正确转义和编码.如果您正在构建SQL,那么在查询中传递数据的可接受方式是使用带占位符的预处理语句.
在PHP中使用大多数SQL数据库的更好方法之一是PDO扩展.它遵循准备语句,将变量绑定到语句,然后将语句和变量发送到服务器的常见模式.如果您之前没有使用PDO,那么这是一个非常好的面向MySQL的教程.
一些SQL数据库在PHP中有自己的专业扩展,包括SQL Server,PostgreSQL和SQLite 3.每个扩展都准备了语句支持,它以与PDO相同的prepare-bind-execute方式运行.有时您可能需要使用这些扩展而不是PDO来支持非标准功能或行为.
MySQL也有自己的PHP扩展.事实上,其中两个.你只想使用一个叫mysqli的人.旧的"mysql"扩展已被弃用,在现代时代使用并不安全或理智.
我个人不是mysqli的粉丝.它对预准备语句执行变量绑定的方式是不灵活的,并且可能很难使用.如有疑问,请改用PDO.
如果您没有使用SQL数据库来存储数据,请查看您正在使用的数据库接口的文档,以确定如何安全地通过它传递数据.
如果可能,请确保数据库以适当的格式存储数据.将数字存储在数字字段中.将日期存储在日期字段中.将钱存入十进制字段,而不是浮点字段.查看数据库提供的有关如何正确存储不同数据类型的文档.
每次向用户显示数据时,必须确保数据安全转义,除非您知道不应对其进行转义.
在发布HTML时,您几乎应该始终传递最初由用户提供的任何数据htmlspecialchars
.事实上,你唯一不应该这样做的时候就是你知道用户提供了HTML,而且你知道它已经使用白名单对它进行了清理.
有时您需要使用PHP生成一些Javascript.Javascript没有与HTML相同的转义规则!通过PHP为Javascript提供用户提供的值的安全方法是通过json_encode
.
数据验证还有很多细微差别.
例如,字符集编码可能是一个巨大的陷阱.您的应用程序应遵循" UTF-8一直 "中概述的实践.将字符串数据视为错误的字符集时,可能会发生假设性攻击.
之前我提到过浏览器调试工具.这些工具还可用于处理cookie数据. Cookie应被视为不受信任的用户输入.
数据验证和转义只是Web应用程序安全性的一个方面.您应该了解Web应用程序攻击方法,以便您可以构建对它们的防御.
防止SQL注入的最有效的清理是使用参数化PDO
.使用参数化查询,查询与数据分离,从而消除了一阶SQL注入的威胁.
在删除HTML方面,strip_tags
可能是删除HTML 的最佳选择,因为它只会删除所有内容. htmlentities
它听起来像什么,所以也有效.如果您需要解析允许哪个HTML(也就是说,您想要允许某些标记),则应使用成熟的现有解析器,例如HTML Purifier
数据库输入 - 如何防止SQL注入
例如,通过确保它实际上是一个整数来检查以确保类型为integer的数据是有效的
对于非字符串,您需要确保数据实际上是正确的类型
在字符串的情况下,您需要确保字符串在查询中被引号括起来(显然,否则它甚至不起作用)
在避免SQL注入的同时将值输入数据库(mysql_real_escape_string或参数化查询)
从数据库中检索值时,请确保通过确保不能将HTML注入页面来避免跨站点脚本攻击(htmlspecialchars)
在将数据插入或更新到数据库之前,您需要转义用户输入.这是一种较旧的方法.您现在想要使用参数化查询(可能来自PDO类).
$mysql['username'] = mysql_real_escape_string($clean['username']); $sql = "SELECT * FROM userlist WHERE username = '{$mysql['username']}'"; $result = mysql_query($sql);
数据库输出 - 如何防止XSS(跨站点脚本)
htmlspecialchars()
仅在从数据库输出数据时使用.这同样适用于HTML Purifier.例:
$html['username'] = htmlspecialchars($clean['username'])
如果可以,请购买本书:Essential PHP Security
另请阅读本文:为什么mysql_real_escape_string很重要而且有些问题
最后......你要求的
我必须指出,如果你将PDO对象与参数化查询(正确的方法)一起使用,那么实际上没有简单的方法可以轻松实现.但是如果你使用旧的'mysql'方式,那么这就是你需要的.
function filterThis($string) { return mysql_real_escape_string($string); }
我的5美分.
这里没有人理解这种方式mysql_real_escape_string
有效.此功能不会过滤或"消毒"任何内容.
因此,您不能将此功能用作一些通用过滤器,以免您注射.
只有在了解了工作原理和适用场合时,才能使用它.
我已经回答了我已经写过的非常相似的问题:
在PHP中,当我向数据库提交字符串时,我应该使用htmlspecialchars()处理非法字符还是使用正则表达式?
请单击以获取数据库侧安全性的完整说明.
至于htmlentities - 查尔斯正确地告诉你将这些功能分开.
想象一下,您将要插入由admin生成的数据,该数据允许发布HTML.你的功能会破坏它.
虽然我建议反对htmlentities.这个功能很久以前就已经过时了.如果你想只更换<
,>
和"
在HTML安全起见字符-使用有意开发用于这一目的的功能-一个用htmlspecialchars()之一.