下面的代码是非常简单的。 PHP使用POST收集来自一个形式,我再想找修剪和运行的preg_replace函数将剥离除单引号或连字符的任何特殊字符的字符串。裸记住,整个代码工作正常不带引号的参与或连字符在正则表达式表达。
preg_replace("/[^\w\s'-]/", '', $raw_lemurName);
这些清洁变量然后插入到数据库中。阿帕奇/ 2.4.37。 MariaDB的。
当我做lemurName像“冕狐猴<>!”,它的工作原理,并返回“冕狐猴”的字符串。
当我把它包括一个单引号字符串,但是,像“Coquerel的狐猴”的操作没有完成,没有信息被插入。
我已经测试了自己的正则表达式的表达,它工作正常,看来当你开始涉及到SQL,它停止工作数据库。
值得注意:
有任何想法吗?
非常感激。
$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')";
想想究竟这里发生了什么,你正在做的是concatonating串在一起的,所以如果$c_lemurName
是'
- 那么你的SQL将变为:
[...] VALUES (NULL, ''', '[...]
其实,这真的可能让你到所谓的“注入式攻击”。基本上,恶意用户可以设置$c_family
喜欢的东西...... ');drop table lemurs;--
- 你现在正在执行的INSERT语句,然后DROP TABLE语句,用你的SQL是一个注释休息。
有几个打击这种方式,最常见的建议的方法是寻找到paramaterised查询 - 这对于mysqli的库必须通过准备好的语句来完成。有这样的PHP docs page一个例子。
更换从第2 PARAMS区单引号为好。用这个。
preg_replace("/[^\w\s'-]/", "", $raw_lemurName);
希望它会工作
您正在使用$ c_lemurLat和$ c_family正则表达式: “/ [^ \ W \ S] /”
这将正确筛选单引号。
对于$ c_lemurName您使用: “/ [^ \ W \ S' - ] /”
这不会删除单引号。
删除“ - 并能正常工作。