从数据库读取时的PHP清理字符串

从数据库读取时的PHP清理字符串,php,mysql,security,sql-injection,Php,Mysql,Security,Sql Injection,说到PHP,我有点不知所措,所以如果这是非常基本的,我深表歉意。这个问题以前可能有人问过,但我找不到另一个与我类似的帖子。 我网站上的URL示例是example.com/read.php?id=1。read.php文件包含以下代码: <?php $id = $_GET['id']; $sql = mysqli_query($con, "SELECT * FROM pages WHERE id='$id'"); ?> 您可以使用filter\u var()函数。有这么

说到PHP,我有点不知所措,所以如果这是非常基本的,我深表歉意。这个问题以前可能有人问过,但我找不到另一个与我类似的帖子。 我网站上的URL示例是example.com/read.php?id=1。read.php文件包含以下代码:

<?php
    $id = $_GET['id'];
    $sql = mysqli_query($con, "SELECT * FROM pages WHERE id='$id'");
?>

您可以使用
filter\u var()
函数。有这么多类型的过滤器可用

请访问此链接:

您可以获取$id并进行如下验证:

filter_var($id,FILTER_VALIDATE_INT);
$id = (int) $_GET['id'];
$stmt = mysqli_prepare($con, "SELECT * FROM pages WHERE id=?");
mysqli_stmt_bind_param($stmt, "i", $id);
上述函数将返回过滤后的数据,如果过滤失败,则返回FALSE。 验证后,可以使用准备好的语句和PDO来完成工作

对于准备好的声明:

对于PDO:
最简单的解决方案是强制变量为整数。任何非数字都将被剥离,并且该值可以安全地用作数值

$id = (int) $_GET['id'];
$sql = mysqli_query($con, "SELECT * FROM pages WHERE id=$id");
我同意其他评论者的观点,使用带参数的预处理查询更好(更快、更安全)。然后看起来是这样的:

filter_var($id,FILTER_VALIDATE_INT);
$id = (int) $_GET['id'];
$stmt = mysqli_prepare($con, "SELECT * FROM pages WHERE id=?");
mysqli_stmt_bind_param($stmt, "i", $id);

从这里开始=>并使用,或者如果性能非常关键,您可以将值转换为整数,甚至删除变量周围的引号。但是一个准备好的语句可能是最好的解决方案……性能永远不应该比安全性更重要。如果性能是关键的,那么,一旦代码正常工作并安全运行,就用XDebug之类的分析器分析代码。与您可能遇到的任何其他性能瓶颈相比,通过适当的参数化查询所花费的时间量可能无法衡量。我的看法正是如此。