希望向您展示我为处理搜索请求而编写的部分代码。用户根据产品的文章(代码)提交搜索。目标是允许用户以任何可能的方式将他的搜索请求写入textarea元素:行、列或用任何分隔符(逗号、空格、分号等)分隔。
$value) { // Processing our array
$codes_list .= $value . "|"; // Adding values and separator to previously created variable to use it in MySQL query
}
$codes_list = rtrim($codes_list, "|"); // Removing last separator from string
$codes_add = " AND `code` REGEXP '^({$codes_list})我的朋友说它包含SQL注入的漏洞,因为我没有过滤用户的输入。但我的逻辑是基于一条语句,即用户的输入过滤器在preg_match_all行中。我确信数组中只包含由6位数组成的元素。无论如何,我希望有PHP和漏洞经验的人看一看这段代码,并分享他对使用它的潜在风险的看法。谢谢。"; // Creating new variable with part of MySQL query and our elements from the array
} else {
$codes_add = ""; // Creating empty variable if our array was empty
}
}
$query = "SELECT * FROM `table` WHERE `status` = '0'" . $codes_add; // Generating MySQL query string
$result = mysqli_query($link, $query); // Making a request to MySQL
?>我的朋友说它包含SQL注入的漏洞,因为我没有过滤用户的输入。但我的逻辑是基于一条语句,即用户的输入过滤器在preg_match_all行中。我确信数组中只包含由6位数组成的元素。
无论如何,我希望有PHP和漏洞经验的人看一看这段代码,并分享他对使用它的潜在风险的看法。谢谢。
发布于 2019-02-04 16:33:53
和我一样,我是准备好的语句的拥护者,我在这里找不到SQL注入的任何方法,所以您的代码应该是安全的。
我只能按照通常的例程来减少此代码的膨胀:
$query = "SELECT * FROM `table` WHERE `status` = '0' ";
if(!empty($_POST['codes'])) {
preg_match_all("/\d{6}/", $_POST['codes'], $codes_array);
$codes_array = array_unique($codes_array[0]);
$codes_list = implode(",", $codes_array);
$codes_add = $codes_list ? " AND `code` IN ($codes_list)" : "";
$query .= $codes_add;
}
$result = mysqli_query($link, $query);基本上,PHP已经有了一个函数,可以将数组值粘合在一起,称为内爆(),根据我对SQL的理解,我决定将REGEXP更改为IN。如果我错了,那么您可以简单地将其更改为regexp。
https://codereview.stackexchange.com/questions/212856
复制相似问题