0

如果这些数据不会改变数据库的状态,我是否也应该清理来自 $_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注入的例子吗?

4

3 回答 3

2

假设您的表有 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 '%'
于 2012-12-28T08:16:16.903 回答
1

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

您正在使用 mysqli 之类的 mysql 甚至没有转义 GET ...您需要使用准备好的查询

你需要使用喜欢

/* 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();
}

来自php手册

好读

通过 PHP 在 GET 中清理用户数据

于 2012-12-28T08:15:32.520 回答
1

听起来您正试图找借口不清理数据。这有点像说“如果我只开半英里,我就不需要系安全带,对吗?” 为什么对始终使用最佳实践如此犹豫不决?

此外,不要费心清理您的数据。相反,请使用其他答案告诉您的参数化查询。

其他人给你的例子是,即使是 SELECT 也容易受到恶意输入的影响,但你似乎甚至想绕过这些原因。不要与之抗争。养成良好的习惯并正确行事。

于 2012-12-28T08:37:52.560 回答