如何在PHP中保护我的$ _GET?

时间:2010-05-13 04:03:14

标签: php mysql

我的个人资料.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

5 个答案:

答案 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_tagshtmlspecialchars一起使用{/ 1}}。

答案 2 :(得分:0)

  

我知道我不能100%安全

啊哈哈哈:)

如果您的问题仅涉及操作,并且仅用于确定要运行的代码,则无论如何都是安全的。

但有些信息适合你:
POST不会阻止跨站点请求伪造。唯一令牌 您没有发布实际的操作代码,所以只是为了确保 - 我希望您检查用户的ID以执行这些操作

答案 3 :(得分:0)

使用其他地方提到的mysqli_real_escape_string。当然,这对防止XSRF没有任何作用。你需要包含一些熵的令牌。

另请参阅:http://www.owasp.org/index.php/Main_Page

答案 4 :(得分:-1)

$ _ GET是完全安全的,直到您尝试将其连接(连接)到程序中的其他内容,如:

  • 要执行的SQL(在这种情况下,您应该使用mysqli_real_escape_string()或与您正在使用的数据库建议的其他转义技术)
  • 要输出的HTML(在这种情况下,您应该在连接或打印/回显之前将其传递给htmlspecialchars())
  • 用户导航到的网址(在这种情况下,您最有可能通过urlencode()传递)
  • 浏览器执行的JavaScript(在这种情况下,您应该通过json_encode()传递它)

如果你想在html中嵌入一个想要插入数据库的javascript中的url,那么你应该将从$ _GET(也是$ _POST,$ _COOKIE和其他类似的外部源)收到的值传递给所有这些函数以适合这种情况的顺序,即

mysql_real_escape_string(htmlspecialchars(json_encode(urlencode($_GET['val']))));

如果您唯一要做的就是将$ _GET ['action']与某些字符串进行比较,那么您完全安全,而不会进行任何转义