我正试图建立一个应用程序,以检测用户的输入(前20个字节)是否存在于我的数据库中。
但是,我被卡在了消毒和占位符的问题上,尤其是$stmt->execute()这一部分,任何意见和建议都会让我很感激。尤其是$stmt->execute()这一部分,任何意见和建议都将被感激不尽。
<?php
echo <<<_END
<form method='post' action='test.php' enctype='multipart/form-data' >
Tester: <input type='file' name='uploadfile'>
<input type='submit'>
</form>
_END;
if($_FILES){
require_once 'login.php';
if (!$conn) {
die(mysql_fatal_error());
}
$type = $_FILES['uploadfile']['type'];
if($type == "text/plain"){
$name = $_FILES['uploadfile']['name'];
$fh = fopen($name, 'r') or die("File Does not exist");
$content = file_get_contents($name, FALSE, NULL, 0, 20);
$content = sanitizeMySQL($conn, $content);
fclose($fh);
$stmt = $conn->prepare("SELECT * FROM storage WHERE mydata like ?");
$stmt->bind_param("s", $content);
$stmt->execute();
//$stmt->bind_result($content);
if (!$stmt) {
echo "Not Exist";
} else {
echo "Exist";
}
} else {
echo "txt only <br>";
}
}
你的这部分代码已经对你的输入进行了消毒。
$stmt = $conn->prepare("SELECT * FROM storage WHERE mydata like ?");
$stmt->bind_param("s", $content);
$stmt->execute();
第一行列出了你的sql查询和参数。
$stmt = $conn->prepare("SELECT * FROM storage WHERE mydata like ?");
第二行将用户输入中的任何危险字符转义(即在 $content
),并将其绑定在 ?
在上面一行的查询中。
$stmt->bind_param("s", $content);
第三行用你绑定的参数运行你创建的查询。
$stmt->execute();
$stmt = $conn->prepare("SELECT * FROM storage WHERE mydata like '$content'");
如果一个用户提交的内容是这样的: '; drop * from storage;//
,那么结果查询将是。
SELECT * FROM storage WHERE mydata like ''; drop * from storage;//'
这将最终删除所有数据 在你的数据库中的mydata表。