首页 > 解决方案 > PHP 用户输入数据过滤以提交到 MySQL 数据库 - 建议

问题描述

我正在构建一个用于过滤数据的类,并且我一直在编译各种建议。

这主要是为了避免数据库中用户输入的错误数据,也是一个额外的级别,以帮助防止尚未想到的注入攻击类型等。(注意:这并不能取代对任何数据也使用准备好的语句的需要提交到数据库。)

尽可能地,我不想返回错误,我想“使数据工作”。假设有人不小心输入了 a ; 或 ' 等在输入字段中,它不能被接受。或者在不应该出现的数字中留下千位分隔符 (,)。因此,只需将其取出并继续。

我想把它放在那里供其他人批评和使用。我知道关于这类事情还有其他问题,但我还没有看到任何针对各种类型的综合推荐。

我的问题是——你会做些什么不同的事情?你会担心用户输入像“47387.284.02”这样的数字吗?如果是这样,我怎样才能消除第二个点(小数点,句点)以及之后的所有内容?(虽然仍然允许像“.75”和“10.20”这样的数字)

// Use for numbers - integers, floats
function filterNumbers($data) {
    $data = trim(htmlentities(strip_tags($data)));
    $data = preg_replace('/[^.0-9]/', "", $data); // only numeric values allowed (and decimal point)
    $data = filter_var($data, FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_FRACTION);
    $data = mysqli_real_escape_string($GLOBALS['con2'], $data);
    return $data;
}

// Use for short strings - alphanumeric only - usernames, varieties, etc.
function filterExtreme($data) {
    $data = trim(htmlentities(strip_tags($data)));
    $data = preg_replace('/[^ ._A-Za-z0-9]/', "", $data);
    $data = mysqli_real_escape_string($GLOBALS['con'], $data);
    return $data;
}

// Use for email addresses
function filterEmail($data) {
    $data = filter_var($data, FILTER_SANITIZE_EMAIL);
    $data = mysqli_real_escape_string($GLOBALS['con'], $data);
    return $data;
}

// Use for comments where some special characters may be desired
function filterComment($data) {
    $data = trim(htmlentities(strip_tags($data)));
    $data = filter_var($data, FILTER_SANITIZE_STRING,FILTER_FLAG_ENCODE_HIGH);
    $data = mysqli_real_escape_string($GLOBALS['con'], $data);
    return $data;
}

注意:$con 是 MySQL 数据库的连接详细信息。

标签: phpmysqlfiltering

解决方案


您关心正确的数据输入是正确的,但我同意 Bill Karwin 的上述评论(由于我的代表,我无法发表评论)。没有办法知道用户的意图,所以“让它工作”最终可能会让他们的情况变得更糟。如果他们输入了“;” 那么他们也可能有其他问题。

应尽可能通过界面处理防止不需要的字符输入,并且您的后端代码应简单地测试合规性。如果失败,返回错误码,让前端处理。

从数字中去除逗号或修剪空白可能还不错,但这也是我尽可能在前面处理的事情。你只需要根据需要处理它。


推荐阅读