如果我使用$_GET而不改变DB的状态,我还应该对来自$_GET的数据进行消毒吗?


Should I also sanitize data coming from $_GET if i use those without changing the state of the DB?

如果来自$_GET的数据不会改变数据库的状态,我是否也应该对这些数据进行消毒?

修改数据库状态的例子是INSERT, DELETE
不改变状态的例子是SELECT

我认为不进行消毒的问题是这个

内部代码

$word = $_GET['word'];
$query = "SELECT * FROM tbl_example WHERE name LIKE '%$word%'"; 
mysqli_query($query);


则您搜索的数据为

testword%';DROP TABLE tbl_example; -- 


所以$query的最终值是

SELECT * FROM tbl_example WHERE name LIKE '%testword%';DROP TABLE tbl_example; -- %'

但是我猜这不会工作,因为mysqli_query和mysql_query()只能执行单个SQL语句。

另外,如果你消毒$_GET然后在数据库中有'那么你搜索',你的搜索将匹配一个在数据库中?

你能给我展示一下sql注入的例子吗?

假设你的表有100万行,你没有像上面的例子那样清理$_GET,那么有人可以利用你的搜索,所以它返回所有100万行,然后你的服务器将尝试显示所有这些,它会崩溃。这只是一个例子。

$_GET["word"]="test%' or name LIKE '";
$word = $_GET['word'];
$query = "SELECT * FROM tbl_example WHERE name LIKE '%$word%'"; 
查询

SELECT * FROM tbl_example WHERE name LIKE '%test%' or name LIKE '%'

您需要使用的是准备好的查询而不是清理来自$_GET

的数据

你正在使用mysql,甚至没有转义GET…您需要使用准备好的查询

你需要使用like

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
    /* bind parameters for markers */
    $stmt->bind_param("s", $city);
    /* execute query */
    $stmt->execute();
    /* bind result variables */
    $stmt->bind_result($district);
    /* fetch value */
    $stmt->fetch();
    printf("%s is in district %s'n", $city, $district);
    /* close statement */
    $stmt->close();
}

from PHP manual

好读

使用PHP清理GET中的用户数据

听起来你好像在找借口不清理数据。这有点像在说:"如果我只开半英里,我就不需要系安全带,对吧?"为什么不坚持使用最佳实践呢?

此外,不要费心对数据进行归档。相反,使用参数化查询,就像其他答案告诉您的那样。

其他人已经给您提供了示例,即使是SELECT也容易受到恶意输入的影响,但您似乎甚至想要绕过这些原因。不要抗拒它。养成好习惯,做正确的事。