如果我有一个会话变量$_SESSION['username']
,并且用户名只能包含字母,数字,下划线和连字符,并且我将它直接放入SQL中,这是否容易引起注入?
$sessionUsername = $_SESSION['username'];
SELECT x FROM y WHERE z='$sessionUsername'
答案 0 :(得分:0)
会话变量可以从外部更改,所以是的,这是一个风险。有几种方法可以克服这种风险,因为你可以使用预备语句which is recommended。或者您可以使用filter_var
来排序潜在的线程,但建议使用明确的语句。
准备好的陈述的例子。未经测试但应该没问题。
<?php
$dataFromDb = array();
$conn = new mysqli('HOST', 'USER', 'PASS', 'DATABASE');
$query = "SELECT x FROM y WHERE z = ?";
if ($stmt = $conn->prepare($query)) {
$stmt->bind_param('s', $_SESSION['username']);
$stmt->execute();
$result = $stmt->get_result();
while ($results = $result->fetch_array(MYSQLI_ASSOC)) {
$dataFromDb[] = $results;
}
}