提问人:code_dough 提问时间:7/5/2020 最后编辑:Dharmancode_dough 更新时间:7/6/2020 访问量:165
这种使用单选按钮的表单是否安全,不会被 SQL 注入?
Is this form using radio buttons safe from SQL Injection?
问:
我正在尝试在我的网站上开发一个动态搜索功能,用户可以选择根据 ID、品牌、型号或日期查找索赔信息。有一个搜索栏可以输入数据,单选按钮提供搜索过滤器。
我想知道我简单的 if 语句方法是否对 SQL 注入有漏洞,因为我直接将变量作为列名传入(据我了解,PDO 不允许您将此值作为参数传入)
HTML代码:
<form method="POST" action="find-claims.php">
<label for="find-claim">Find Claim:</label>
<input type="search" id="claim-search-bar" name="claim-search-bar"><br/>
<input type="radio" value="by-id" class="radio-param" name="search-param" checked><label for="by-id">By Claim Id</label>
<input type="radio" value="by-make" class="radio-param" name="search-param"><label for="by-make">By Vehicle Make</label>
<input type="radio" value="by-model" class="radio-param" name="search-param"><label for="by-model">By Vehicle Model</label>
<input type="radio" value="by-date" class="radio-param" name="search-param"><label for="by-date">By Claim Date</label>
<input type="submit" class="radio-param" value="Submit">
</form>
PHP代码:
// Get search data
$searchVal = $_POST["claim-search-bar"];
// Get radio value
$searchType = $_POST["search-param"];
// Store search type into db-naming scheme
$radioVal = "";
if($searchType == "by-id"){
$radioVal = "claim_id";
}
else if($searchType == "by-make"){
$radioVal = "make";
}
else if($searchType == "by-model"){
$radioVal = "model";
}
else if($searchType == "by-date"){
$radioVal = "date_received";
}
// DB Interaction
try{
// Connection to DB
require "../db-info.php";
$dbh = new PDO("mysql:host=$serverName; dbname=$dbName", $userName, $password);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
// Get Claim based off dynamic input
$getClaim = $dbh->prepare("SELECT * FROM claims WHERE $radioVal = ?");
$getClaim->bindParam(1, $searchVal);
$getClaim->execute();
$claimInfo = $getClaim->fetchAll();
// Checks if DB returned any data
if($claimInfo){
// Display corresponding info
}
else{
echo "sorry no claim found";
}
$dbh = null;
$stmt = null;
} catch(PDOException $e){
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
答:
1赞
Bill Karwin
7/5/2020
#1
由于只分配了您在代码中编写的文本值,并且从未分配过任何不受信任的内容,因此在 SQL 注入方面是安全的。$radioVal
但是,我建议您给它一个更好的默认值,而不是 .因为如果没有一个已知值匹配,那么将保留,你将获得以下 SQL 语句:""
$searchType
$radioVal
""
SELECT * FROM claims WHERE = ?
这将是一个语法错误。这不会是由于 SQL 注入,但它不会起作用。
顺便说一句,你不需要消毒.这就是使用绑定参数的意义所在,它是在查询准备好后绑定的,因此它不能引入 SQL 注入。是否消毒并不重要。$searchVal
2赞
Your Common Sense
7/5/2020
#2
您可以将搜索值存储在数组中。除了删除无用的 try-catch 外,它还将使您的代码减少两倍的臃肿。
// Get search data
$searchVal = $_POST["claim-search-bar"];
// Get radio value
$searchType = $_POST["search-param"];
// Store search type into db-naming scheme
$searchValues = [
"by-id" => "claim_id",
"by-make" => "make",
"by-model" => "model",
"by-date") => "date_received",
];
$radioVal = $searchValues[$searchType] ?? "claim_id";
// Connection to DB
require "../db-info.php";
// the connection code should really go into include
// Get Claim based off dynamic input
$getClaim = $dbh->prepare("SELECT * FROM claims WHERE $radioVal = ?");
$getClaim->execute([$searchVal]);
$claimInfo = $getClaim->fetchAll();
// Checks if DB returned any data
if($claimInfo){
// Display corresponding info
}
else{
echo "sorry no claim found";
}
评论
0赞
Your Common Sense
7/6/2020
我知道。但它解释说,这是一个特例,以及为什么它在这个确切的地方使用,不应该在其他任何地方使用
0赞
Dharman
7/6/2020
在回答中解释这一点可能是个好主意。我知道你的意思,你知道你的意思,但对其他人来说,这个评论听起来很矛盾。
1赞
Your Common Sense
7/6/2020
我有一种感觉,这将是徒劳的。以及整个答案。要删除它
上一个:如何防止PHP中的SQL注入?
评论