Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用$\u GET&$_邮递_Php_Sql Injection - Fatal编程技术网

Php 使用$\u GET&$_邮递

Php 使用$\u GET&$_邮递,php,sql-injection,Php,Sql Injection,也许我从一开始就做错了什么,如果是这样,我也会努力的 我有一个菜单项,作为URL的一部分,它传递一个事件ID。在我的特定情况下,它会将用户带到该事件的信息页面。然后有一个按钮,让他们注册的事件。单击,他们就注册了活动,并返回到同一信息页面,该页面现在显示他们已注册,并让他们看到一些额外的内容 当他们第一次点击页面时,我使用$_GET来计算事件ID,如果他们单击注册按钮作为隐藏输入字段,那么该ID将被传递回页面。但是这次我需要使用$u POST来计算事件ID。所以我查询中的代码有一个布尔部分 SE

也许我从一开始就做错了什么,如果是这样,我也会努力的

我有一个菜单项,作为URL的一部分,它传递一个事件ID。在我的特定情况下,它会将用户带到该事件的信息页面。然后有一个按钮,让他们注册的事件。单击,他们就注册了活动,并返回到同一信息页面,该页面现在显示他们已注册,并让他们看到一些额外的内容

当他们第一次点击页面时,我使用$_GET来计算事件ID,如果他们单击注册按钮作为隐藏输入字段,那么该ID将被传递回页面。但是这次我需要使用$u POST来计算事件ID。所以我查询中的代码有一个布尔部分

SELECT stuff FROM ... WHERE eventID = ($_GET["ID"] ? $_GET["ID"] : $_POST["ID"])

这是可行的,但感觉可以做得更好。

当然可以做得更好。首先,在查询数据库之前清理用户输入,就像查询数据库一样。您已经向SQL注入敞开了大门

  • 清理数据库输入。是实现这一点的快速而简单的方法(或者,如果ID始终是数字,则可以使用)。别像那个迷恋你的学校
  • 如果不确定使用了哪种请求方法,请使用包含GET和POST变量的
    $\u request
    超全局(例如:
    $\u request['ID']
    )。我通常不使用
    $\u REQUEST
    ,因为我想弄清楚我的数据来自哪里,但这将是使用它的最佳情况
  • 正如Nick Presta指出的,
    $\u REQUEST
    还包括cookie变量,事实上,名称冲突的默认*优先顺序是
    $\u cookie
    $\u POST
    ,然后是
    $\u GET
    。有鉴于此,在将数据插入查询之前,您可以执行现在正在执行的操作,或者使用
    $\u SERVER['REQUEST\u METHOD']

    // You can use mysql_real_escape_string() instead if you want
    $id = ($_SERVER['REQUEST_METHOD'] == 'POST') ? intval($_POST['id']) : intval($_GET['id']);
    
    另外,正如outis所指出的,请记住,您可以选择使用而不仅仅是原始SQL查询


    *-正如Stewart在评论中提到的那样,排序是通过
    变量\u order
    配置指令进行的。

    以及htw的回答,如果向用户显示的事件ID是基于权限的,请确保重新验证允许他们使用该特定ID。

    仅仅因为它在一个隐藏字段中,并不意味着他们不能更改它。

    为了简单起见,结合前面的建议:

    "SELECT stuff FROM ... WHERE eventID = '" . mysql_real_escape_string($_REQUEST['id']) . "';"
    
    对于记录,不要对数组键使用双引号,除非要包含任何需要解析的变量或转义,否则需要更长的处理时间。例如:

    $_POST['id'] and not $_POST["id"] unless you're doing something like $_POST["post_$id"]
    

    希望这会有所帮助。

    您应该将所提供ID的选择与其放入数据库的位置分开。换句话说,一旦页面知道它是通过GET还是POST调用的,它就会知道从哪个超全局中检索ID。事实上,可能有些页面总是用POST调用,有些页面总是用GET调用


    如果从哪个获取ID真的不重要,请使用$u请求。

    这需要sql注入。清除的现代替代方法是使用准备好的语句:使用$u请求可以使黑客更容易攻击。一个应该始终是具体的。记住禁用gpc_magic_quotes,这是有史以来最愚蠢的“安全”功能之一。$\u请求还屏蔽了$\u COOKIE,这可能是你不想发生的事情。@Nick:这是我没有意识到的一个非常好的点。我对它进行了测试,如果存在同名的GET-var、POST-var和cookie,则cookie优先。非常好的捕获。您似乎有一个输入错误:在SQL语句中,根据eventID是字符串还是数字,应该在两侧或两侧都有一个引号。(如果您使用预先准备好的语句并绑定值,这也不会成为问题。)该死的好主意,谢谢现场!当我边喝酒边看电视边打字时,就会发生这种情况。xD由于这个问题不一定规定id是字符串还是数字,所以我认为最好为没有防止SQL注入的人引用该值。;]