php - 当字符串包含单引号时 PHP preg_replace() 返回 null 但否则有效
问题描述
下面的代码非常简单。PHP 使用 POST 从表单中收集字符串,然后我希望对其进行修剪并运行 preg_replace 函数,该函数将去除除单引号或连字符之外的任何特殊字符。请记住,整个代码可以正常工作,而无需在正则表达式中使用引号或连字符。
preg_replace("/[^\w\s'-]/", '', $raw_lemurName);
然后将这些干净的变量插入数据库。阿帕奇/2.4.37。玛丽亚数据库。
当我将 lemurName 设为“Diademed Sifaka<>!”之类的字符串时,它会起作用,并返回“Diademed Sifaka”。
但是,当我将其设为包含单引号的字符串时,例如“Coquerel's Sifaka”,操作未完成并且没有插入任何信息。
我已经单独测试了正则表达式,它工作正常,似乎当你开始涉及 SQL 和数据库时,它就停止工作了。
值得注意:
- 使用 phpMyAdmin。如果我在那里插入字符串,它工作正常,所以我的数据库可以保存这些值。
- 尝试在各个地方使用 mysqli_real_escape_string() ,但没有运气,也许做错了。
- 仔细阅读,我认为这与 SQL 不允许插入带有单引号的字符串以及服务器在 post 方法中自动转义单引号有关。
有任何想法吗?
非常感激。
$raw_lemurName = isset($_POST['lemurName']) ? $_POST['lemurName'] : null;
$raw_lemurLat = isset($_POST['lemurLat']) ? $_POST['lemurLat'] : null;
$raw_family = isset($_POST['family']) ? $_POST['family'] : null;
//下面的正则表达式似乎搞砸了
$c_lemurName = trim(preg_replace("/[^\w\s'-]/", '', $raw_lemurName));
$c_lemurLat = strtolower(trim(preg_replace('/[^\w\s]/', '', $raw_lemurLat)));
$c_family = trim(preg_replace('/[^\w\s]/', '', $raw_family));
if (isset($_POST['submit'])) {
$query1 = "INSERT INTO `lemurs` (`id`, `lemur`, `latin`, `family`) VALUES (NULL, '$c_lemurName','$c_lemurLat','$c_family')";
$run_query = mysqli_query($connection, $query1);
if($run_query){
echo "Data has been inserted";
} else {
echo "Operation Unsuccessful";
}
header("location: index.php");
return;
}
解决方案
这是一个标准的 SQL 注入问题。问题源于您将这些变量纳入查询的方式:
$query1 = "INSERT INTO `lemurs` (`id`, `lemur`, `latin`, `family`) VALUES (NULL, '$c_lemurName','$c_lemurLat','$c_family')";
想想这里到底发生了什么,你所做的就是将字符串连接在一起,所以如果$c_lemurName
是'
- 那么你的 SQL 将变成:
[...] VALUES (NULL, ''', '[...]
这实际上使您真正了解所谓的“注入攻击”。基本上,恶意用户可以设置$c_family
为... ');drop table lemurs;--
- 您现在正在执行插入语句,然后执行删除表语句,其余的 SQL 是注释。
有几种方法可以解决这个问题,最常见的建议方法是查看参数化查询——对于 mysqli 库,这必须通过准备好的语句来完成。PHP 文档页面上有一个示例。
推荐阅读
- php - 我可以为 php web 应用程序和 android 移动应用程序使用相同的 firebase 数据库吗?如何?
- javascript - 如何生成 blob 文件并将其放置在相对路径上?
- intellij-idea - 如何将语言 [德语、法语、波兰语、捷克语、...] 添加到 intellij 拼写检查器?在 Mac、Windows 和 Linux 上?
- r - 如何从 r 中的函数中找到给出最优值的参数集
- vue.js - Nativescrit Vue - 我可以在 main.js 中访问我的 Vue 实例吗?
- python - Python 错误“FileNotFoundError:[Errno 2] 文件 b Usuarios.csv' 不存在:b Usuarios.csv'”
- excel - Excel复制粘贴宏偏移不正确
- javascript - 将带时区的时间戳字符串转换为“dd/mm/yyyy”格式
- python - 将语言环境数字字符串格式化回数字
- ios - 向导航栏添加了自定义阴影而不是删除