如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
只看:
(来源:https://xkcd.com/327/)
这个SQL做了什么:
Robert'); DROP TABLE STUDENTS; --
Run Code Online (Sandbox Code Playgroud)
我知道这两个'并且--是用于评论,但是这个词也没有DROP被评论,因为它是同一行的一部分?
在mysql表中,我有一个名为date的字段,其类型称为timestamp,默认值为CURRENT_TIMESTAMP.但是,如果我在mysql中将该字段留空,则会出错.当我尝试像time()那样插入一些东西时,我会收到日期为00:00:00.
<?php
$name = "";
$email = "";
$subject = "";
$comments = "";
$nameError = "";
$emailError = "";
$subjectError = "";
$x = 5;
function filterData($data)
{
$data = htmlspecialchars($data);
$data = stripslashes($data);
return $data;
}
$connection = mysql_connect('host', 'user', 'pass');
if (!$connection) {
die('Could not connect: ' . mysql_error());
}
$select_database = mysql_select_db("contact");
if (!$select_database) {
echo "could not select database " . mysql_error();
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
//handles the name
$name = filterData($_POST["name"]);
if …Run Code Online (Sandbox Code Playgroud) 我已经做了很多阅读,但仍然不理解100%SQL注入的发生方式!
我想从那些知道基于我的例子的SQL注入的具体例子中看到它,因此它可以被复制,测试和修复.我试过SQL注入我的代码而不能,所以我希望有人来证明我的意思!
1.我认为SQL注入只能通过POST或GET方法进行,这意味着在网站上它应该是帖子形式,例如'注册或搜索'或查询如'search.php?tags = love'?
说这可以注入以下具有POST方法的代码吗?
$name = trim($_POST['username']);
$mail = trim($_POST['email']);
$password = trim($_POST['password ']);
if ($errors == "false") {
$sql =
"INSERT INTO
clients
SET
name='" . mysql_real_escape_string($name) . "',
mail='" . mysql_real_escape_string($mail) . "',
password='" . mysql_real_escape_string(sha1($password)) . "'";
$connection->execute($sql);
}
Run Code Online (Sandbox Code Playgroud)
2.另一个有GET方法: rate.php?like&videoID=250&userID=30
$sql =
"SELECT
videoID
FROM
likes
WHERE
videoID = '" .mysql_real_escape_string($videoID). "' AND UID = '" .mysql_real_escape_string($userID). "' LIMIT 1";
$connection->execute($sql);
Run Code Online (Sandbox Code Playgroud)
请帮助那些对主题感到自由的人,但请使用具体的例子.
提前谢谢,
伊利亚
我有一个PHP函数,它以MM/DD/YYYY
我需要的格式传递日期然后转换它,以便它可以添加到类型的MySQL字段date
我将如何在PHP中执行此操作?
我正在尝试插入格式化为2012年8月12日的日期,但是当我在插入后检查数据库集时,我只能在日期字段中看到00-00-0000?
这是我使用的查询:
$query= "INSERT INTO ambition_opportunities SET
opp_deadline='".strtotime($_POST['deadline'])."'"; // date field come with date picker**
$sql = mysql_query($query) or die(mysql_error());
Run Code Online (Sandbox Code Playgroud)
谢谢
我的$date输出是在foreach循环中
09/25/11,02/13/11,09/15/10,06/11/10,04/13/10,44/13/10,04/13/10,09/24/09,22/19/09年12月21日
我的mysql查询(PHP)如下
("INSERT INTO table_name(`field1`, `field2`,`date`) VALUES ('".$value1."','".$value2 ."','".$date."')");
Run Code Online (Sandbox Code Playgroud)
问题:在我的数据库中,所有日期都存储为0000-00-00 00:00:00.但第4个日期(06/11/10)存储为2006-11-10 00:00:00.
我试过date('Y-m-d H:i:s', $date);但没有帮助.
注意:我的数据库字段是日期时间类型.任何的想法?