什么是最好的PHP输入清理功能?

什么是最好的PHP输入清理功能?,php,filter,sanitization,Php,Filter,Sanitization,我正试图想出一个函数,我可以通过它传递我所有的字符串来进行清理。因此,从中产生的字符串对于数据库插入是安全的。但是有太多的过滤功能了,我不确定应该使用/需要哪些功能 请帮我填空: function filterThis($string) { $string = mysql_real_escape_string($string); $string = htmlentities($string); etc... return $string; } 这取决于您使用的数

我正试图想出一个函数,我可以通过它传递我所有的字符串来进行清理。因此,从中产生的字符串对于数据库插入是安全的。但是有太多的过滤功能了,我不确定应该使用/需要哪些功能

请帮我填空:

function filterThis($string) {
    $string = mysql_real_escape_string($string);
    $string = htmlentities($string);
    etc...
    return $string;
}

这取决于您使用的数据类型。通常最好使用的是
mysqli\u real\u escape\u string
,但是,例如,您知道不会有HTML内容,使用strip\u标记将增加额外的安全性


您还可以删除您知道不允许使用的字符。

这取决于您使用的数据类型。通常最好使用的是
mysqli\u real\u escape\u string
,但是,例如,您知道不会有HTML内容,使用strip\u标记将增加额外的安全性

您还可以删除您知道不允许使用的字符。

您在类似以下代码中使用的字符

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
  mysql_real_escape_string($user),
  mysql_real_escape_string($password)
);
正如文档中所说,它的目的是转义作为参数传递的字符串中的特殊字符,同时考虑连接的当前字符集,以便将其安全地放置在参数中。文件还增加了:

如果要插入二进制数据,则必须使用此函数

用于在HTML内容中输出字符串时转换实体中的某些字符。

您在类似于以下代码的代码中使用

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
  mysql_real_escape_string($user),
  mysql_real_escape_string($password)
);
正如文档中所说,它的目的是转义作为参数传递的字符串中的特殊字符,同时考虑连接的当前字符集,以便将其安全地放置在参数中。文件还增加了:

如果要插入二进制数据,则必须使用此函数


用于在HTML内容中输出字符串时转换实体中的某些字符。

防止SQL注入的最有效的清理方法是使用
PDO
进行参数化。使用参数化查询,将查询与数据分离,从而消除了一阶SQL注入的威胁


就删除HTML而言,
strip_tags
可能是删除HTML的最佳方法,因为它只会删除所有内容
htmlentities
做它听起来像什么,所以它也可以工作。如果您需要解析允许哪些HTML(即,您希望允许某些标记),则应该使用成熟的现有解析器,例如防止SQL注入的最有效的清理方法是使用
PDO
进行参数化。使用参数化查询,将查询与数据分离,从而消除了一阶SQL注入的威胁


就删除HTML而言,
strip_tags
可能是删除HTML的最佳方法,因为它只会删除所有内容
htmlentities
做它听起来像什么,所以它也可以工作。如果您需要解析允许使用的HTML(也就是说,您希望允许使用一些标记),那么您应该使用成熟的现有解析器,例如用于数据库插入的

,您只需要
mysql\u real\u escape\u string
(或者使用参数化查询)。您通常不希望在保存数据之前对其进行更改,如果使用
htmlentities
,则会发生这种情况。当您再次运行
htmlentities
以将其显示在网页的某个位置时,这将导致混乱

在网页某处显示数据时,请使用
htmlentities

有些关联,如果您在电子邮件中的某个位置发送提交的数据,例如使用联系人表单,请确保从将在标题中使用的任何数据(例如发件人:姓名和电子邮件地址、子标题等)中删除换行符


如果你不这样做,垃圾邮件机器人找到你的表单并滥用它只是时间问题,我已经学会了艰难的方法。

对于数据库插入,你只需要
mysql\u real\u escape\u string
(或使用参数化查询)。您通常不希望在保存数据之前对其进行更改,如果使用
htmlentities
,则会发生这种情况。当您再次运行
htmlentities
以将其显示在网页的某个位置时,这将导致混乱

在网页某处显示数据时,请使用
htmlentities

有些关联,如果您在电子邮件中的某个位置发送提交的数据,例如使用联系人表单,请确保从将在标题中使用的任何数据(例如发件人:姓名和电子邮件地址、子标题等)中删除换行符

如果你不这样做,垃圾邮件机器人找到你的表单并滥用它只是时间问题,我已经学会了艰难的方法。

停下! 你在这里犯了一个错误。哦,不,您选择了正确的PHP函数,以使数据更安全。那很好。您的错误在于操作顺序,以及如何和在何处使用这些功能

了解清理和验证用户数据、转义存储数据和转义表示数据之间的区别非常重要

清理和验证用户数据 当用户提交数据时,您需要确保他们提供了您期望的内容

消毒和过滤 例如,如果您期望一个数字。您还可以将其转换为其他类型。提交的所有内容最初都被视为字符串,因此强制将已知数字数据转换为整数或浮点数可以快速、轻松地进行清理

那么自由格式的文本字段和文本区域呢?您需要确保这些字段中没有意外的内容。主要是,您需要确保不应该包含任何HTML内容的字段实际上不包含HTML。有两种方法可以解决这个问题

首先,您可以尝试使用转义HTML输入。您不应该使用来中和HTML,因为它还将对重音字符和它所使用的其他字符执行编码
$mysql['username'] = mysql_real_escape_string($clean['username']);
$sql = "SELECT * FROM userlist WHERE username = '{$mysql['username']}'";
$result = mysql_query($sql);
$html['username'] = htmlspecialchars($clean['username'])
function filterThis($string) {
    return mysql_real_escape_string($string);
}
function sanitize($string,$dbmin,$dbmax){
$string = preg_replace('#[^a-z0-9]#i', '', $string); //useful for strict cleanse, alphanumeric here
$string = mysqli_real_escape_string($con, $string); //get ready for db
if(strlen($string) > $dbmax || strlen($string) < $dbmin){
    echo "reject_this"; exit();
    }
return $string;
}
$string = htmlspecialchars(strip_tags($_POST['example']));
$string = htmlentities($_POST['example'], ENT_QUOTES, 'UTF-8');