我的个人资料.php显示所有用户的帖子,评论,图片。如果用户想要删除,它会将发布的id发送到remove.php,这就像remove.php?action = removeposting& posting_id = 2。如果他们想要删除图片,那就是remove.php?action = removepicture& picture_id = 1。
使用获取数据,我对数据库进行查询以显示他们想要删除的信息,如果要删除它们,则单击“是”。因此,数据将通过$ POST NOT $ GET删除,以防止跨站点请求伪造。
我的问题是如何确保GET不是一些javascript代码,sql注入会让我搞砸。
这是我的remove.php
//how do I make $action safe?
//should I use mysqli_real_escape_string?
//use strip_tags()?
$action=trim($_GET['action']);
if (($action != 'removeposting') && ($action != 'removefriend')
&& ($action != 'removecomment'))
{
header("Location: index.php");
exit();
}
if ($action == 'removeposting')
{
//get the info and display it in a form. if user clicks "yes", deletes
}
if ($action =='removepicture')
{
//remove pic
}
我知道我不能100%安全,但我可以使用哪些常见的防御措施。
修改
Do this to prevent xss
$oldaction=trim($_GET['action']);
$action=strip_tags($oldaction);
Then when I am 'recalling' the data back via POST, I would use
$posting_id = mysqli_real_escape_string($dbc, trim($_POST['posting_id']));
if ($action == 'removeposting')
{
//get the posting id from the user
$getposting_id = htmlspecialchars(trim($_GET['posting_id']));
//basic checks for the posting id
if (empty($getposting_id)){
//header ("Location: index.php");
echo '<p>Sorry, no posting was specified for removal.</p>';
exit();
}
if (!is_numeric($getposting_id))
{
echo "Not an integer";
exit();
}
//Also have check to see if the posting_id is the user's. If so, can delete
答案 0 :(得分:5)
因为您没有存储$action
并且只在条件中使用它,所以没有必要进行所有修剪/剥离/转义。简单的字符串比较在“安全性”方面已经足够了,但我建议使用===
代替==
。
或者,如果您将$_GET
或$_POST
值存储到MySQL数据库的整数列中,则可以在将值存储到intval()
之前将其传递给mysql_real_escape_string()
数据库。如果您需要存储纯文本,请在存储之前将其传递给preg_match()
。您还可以使用preg_replace()
或/^\d{5}(?:-?\d{4})?$/
来确保您只存储有效值(不同用途的不同模式,例如邮政编码的{{1}})。
答案 1 :(得分:0)
为了防止任何SQL注入,您应该使用mysqli_real_escape_string
或者您可以使用完成相同操作的Prepared Statements。
要阻止任何JavaScript,您可以strip_tags
与htmlspecialchars
一起使用{/ 1}}。
答案 2 :(得分:0)
我知道我不能100%安全
如果您的问题仅涉及操作,并且仅用于确定要运行的代码,则无论如何都是安全的。
但有些信息适合你:
POST不会阻止跨站点请求伪造。唯一令牌
您没有发布实际的操作代码,所以只是为了确保 - 我希望您检查用户的ID以执行这些操作
答案 3 :(得分:0)
使用其他地方提到的mysqli_real_escape_string
。当然,这对防止XSRF没有任何作用。你需要包含一些熵的令牌。
答案 4 :(得分:-1)
$ _ GET是完全安全的,直到您尝试将其连接(连接)到程序中的其他内容,如:
如果你想在html中嵌入一个想要插入数据库的javascript中的url,那么你应该将从$ _GET(也是$ _POST,$ _COOKIE和其他类似的外部源)收到的值传递给所有这些函数以适合这种情况的顺序,即
mysql_real_escape_string(htmlspecialchars(json_encode(urlencode($_GET['val']))));
如果您唯一要做的就是将$ _GET ['action']与某些字符串进行比较,那么您完全安全,而不会进行任何转义。