PHP的preg_replace()将返回空当字符串包含一个单引号,但否则工作

问题描述 投票:0回答:3

下面的代码是非常简单的。 PHP使用POST收集来自一个形式,我再想找修剪和运行的preg_replace函数将剥离除单引号或连字符的任何特殊字符的字符串。裸记住,整个代码工作正常不带引号的参与或连字符在正则表达式表达。

preg_replace("/[^\w\s'-]/", '', $raw_lemurName);

这些清洁变量然后插入到数据库中。阿帕奇/ 2.4.37。 MariaDB的。

当我做lemurName像“冕狐猴<>!”,它的工作原理,并返回“冕狐猴”的字符串。

当我把它包括一个单引号字符串,但是,像“Coquerel的狐猴”的操作没有完成,没有信息被插入。

我已经测试了自己的正则表达式的表达,它工作正常,看来当你开始涉及到SQL,它停止工作数据库。

值得注意:

  • 使用phpMyAdmin。如果我插入的文本上有它工作得很好,所以我的数据库可以保存这些值。
  • 使用在不同的地方mysqli_real_escape_string()尝试过,但没有运气,也许这样做是错误的。
  • 读书的时候,我认为它是与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;

}

php regex mysqli single-quotes
3个回答
1
投票

这是一个标准的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一个例子。


0
投票

更换从第2 PARAMS区单引号为好。用这个。

preg_replace("/[^\w\s'-]/", "", $raw_lemurName);

希望它会工作


0
投票

您正在使用$ c_lemurLat和$ c_family正则表达式: “/ [^ \ W \ S] /”

这将正确筛选单引号。

对于$ c_lemurName您使用: “/ [^ \ W \ S' - ] /”

这不会删除单引号。

删除“ - 并能正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.