gpt4 book ai didi

php - 正则表达式是否足够或我需要更多检查?

转载 作者:可可西里 更新时间:2023-11-01 08:09:01 25 4
gpt4 key购买 nike

我有一个搜索,当用户键入关键字时,脚本会在数据库中查找该关键字:

<form method="GET">
<input type="text" name="q" id="keyword" placeholder="Enter a keyword" >
<input type="submit" value="Search" >
</form>

提交表单后,我检查以下内容:

//Check is the form is submitted.
if( isset($_GET['q']) ){

//Assign the submitted keyword to a variable.
$query = $_GET['q'];

//Check if the keyword is empty.
if(!empty($query)){

//Check if the keyword matches the pattern.
//The pattern checks that the keyword contains characters from any language and maybe there are spaces between them.
$pattern = "~^\p{L}[\p{L}\p{M}\h()]*$~u";

//If the keyword matches the pattern.
if(preg_match($pattern, $query)){

//Fetch data from the Database.
$stmt = $conn->prepare('SELECT * FROM posts WHERE title OR description LIKE :s LIMIT 5');
$stmt->bindValue(':s', '%' . $query . '%', PDO::PARAM_STR);
$stmt->execute();
$posts = $stmt->fetchAll();

}
}

这些检查是否足以阻止 SQL 注入(inject)和其他攻击?

或者我需要创建一个黑名单?或者检查其他东西?

最佳答案

由于您使用的是参数化查询,因此根本不需要正则表达式。参数化查询和仅连接参数的区别在于查询最终是如何执行的。例如:

query q = "SELECT * FROM people WHERE people.age =" + userInput;

这样查询将被连接起来然后纯粹执行。在您的情况下,您正在将用户输入作为参数传递:

query q = "SELECT * FROM posts WHERE title OR description LIKE  :s LIMIT 5"

它不会直接连接采石场,它会比较参数 s 的值。确保始终使用参数化查询,因为这是一种很好的做法,也是一种更安全的方法

关于php - 正则表达式是否足够或我需要更多检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51327136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com