如果来自$_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也容易受到恶意输入的影响,但您似乎甚至想要绕过这些原因。不要抗拒它。养成好习惯,做正确的事。