php - 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 数据库的连接详细信息。
解决方案
您关心正确的数据输入是正确的,但我同意 Bill Karwin 的上述评论(由于我的代表,我无法发表评论)。没有办法知道用户的意图,所以“让它工作”最终可能会让他们的情况变得更糟。如果他们输入了“;” 那么他们也可能有其他问题。
应尽可能通过界面处理防止不需要的字符输入,并且您的后端代码应简单地测试合规性。如果失败,返回错误码,让前端处理。
从数字中去除逗号或修剪空白可能还不错,但这也是我尽可能在前面处理的事情。你只需要根据需要处理它。
推荐阅读
- java - ExecutorService submit() - 并行执行(非阻塞)
- c# - .NET Framework - 环境变量返回 null
- perforce - 我们如何在 WIN server 2019 中为 perforce depot 安装和设置 Perforce 文件资源管理器 P4vx?
- signalr - 如何使用 aspnet core SignalR 向用户发送私人消息?
- java - 请求数组中的循环
- apache-spark - 如何为火花任务或地图操作设置超时?(或跳过长时间运行的任务)
- r - 在 R 中恢复 HoltWinters 预测的固定数据
- rest - 对于 REST 服务中的应用程序错误,建议使用哪种 HTTP 状态代码?
- postgresql - 无法使用 MetricBeat 从 RHEL 7 中的 PostgreSQL 获取指标
- python - 绘制数据帧每 15 行的散点图?