【问题标题】:Editing HTML then posting via PHP编辑 HTML 然后通过 PHP 发布
【发布时间】:2013-07-19 22:05:30
【问题描述】:

我有一个场景。假设有人在我的网站上,并且有一个添加事件的表单,例如,有一个字段如下:

<input type="text" name="title" id="title">

假设某人使用 F12 开发人员工具并将 id="title" 更改为 id="whatever",甚至删除 id 属性,那么我将如何让我的 PHP 脚本停止运行,以便没有任何内容发布到 MySQL ?

这是我拥有的书签功能的示例:(前端表单)

<form action="bookmarks.php" method="post" enctype="multipart/form-data">
  <div class="control-group">
    <label class="control-label" for="input-mini">Title*</label>
    <div class="controls">
       <input class="span12" id="title" name="title" type="text" placeholder="e.g. Oliver's pet cat...">
    </div>
  </div><!-- /control-group -->
  <div class="control-group">
    <label class="control-label" for="input-mini">Link*</label>
    <div class="controls">
       <input class="span12" id="link" name="link" type="text" placeholder="e.g. http://boopeo.com">
       <input type="hidden" name="parse_var" id="parse_var" value="addbookmark" />
       <br /><input name="submit" type="submit" class="btn btn-success span12" value="Bookmark" /></form>

后端 PHP:

if (isset($_POST['parse_var'])){
             $parser = $_POST['parse_var'];
             $parser = htmlspecialchars($parser);
    if ($parser == "addbookmark"){


             $title = $_POST['title'];
             $title = htmlspecialchars($title);
             $linkurl = $_POST['link'];
             $linkurl = htmlspecialchars($linkurl);

    $sqlrecentmark = $db->query("SELECT link_url FROM tablenamehere WHERE mem_id='$id' ORDER BY id DESC LIMIT 20");
    while($row = $sqlrecentmark->fetch(PDO::FETCH_ASSOC)) {
      $recent_link = $row["link_url"]; 
    }

    if ( $linkurl != $recent_link ){
         $dataact = array( 'mem_id' => $id, 'title' => $title, 'link_url' => $linkurl );  

    $sqlactivity = $db->prepare("INSERT INTO tablenamehere (mem_id, title, link_url) value (:mem_id, :title, :link_url)");  
    $sqlactivity->execute($dataact);
    } else {
        $not_msg = '<br /><br /><div class="alert alert-error">Oops! You have added that bookmark before. Just look and you shall find!</div>';
    }
    }
    }

【问题讨论】:

  • 永远不要相信用户提交的数据,始终验证和清理......并且不要忘记您必须使用参数化查询
  • 你能发布你的前端表单和后端php代码吗?这看起来更像是与后端输入清理有关的问题。不确定这种情况是否真的有害,但看起来很有趣。
  • 我将在前面的表单中使用不同的示例:
  • 我现在将在问题中发布示例
  • 由于您在后端使用准备好的语句,因此您应该在 MySQL 安全部分上做得很好。对于其他安全措施,您可能需要验证和清理您的输入。看看 GUMP php 库。这在这里可能会有所帮助:github.com/Wixel/GUMP

标签: php html mysql security developer-tools


【解决方案1】:

永远不要相信来自用户的数据。始终进行消毒和验证。您正在使用很好的准备好的语句,因此您将在很大程度上受到保护免受注入。您要做的另一件事是确定用户发送给您的数据是否与您的预期相符,如果确实如此,则继续将其与数据库一起使用。 (你大部分时间都在做,所以老实说,恶意用户应该不会造成不良影响)

【讨论】:

  • 感谢您的回复,真正的帮助 :) 但是如果用户要从 HTML 中删除 id="title" 属性,然后通过提交表单运行 PHP 脚本,它会发布另一个现有的values 然后返回一个错误(注意:未定义的索引:第 22 行 /home/jdowen/public_html/lb/edge/tools/bookmarks.php 中的标题)显示文件路径等。我该如何阻止它,因为这是一种安全风险?
  • 两件事,一是在生产代码中您不应该向用户显示错误(您可以更改 php.ini 文件中的设置)并且在使用之前检查 isset 吗?
【解决方案2】:

输入字段的id 不会作为发布数据传递,因此无法在后端php 代码中分辨。也许你在谈论name 属性。

<input type="text" name="theTitle" id="aTitle">

在我上面的例子中,输入字段将被发布为$_POST["theTitle"]

您可以在提交表单之前使用 javascript 检查这些元素,但如果您担心用户操纵 DOM,那可能不会有太大帮助。

阅读您对未定义索引错误的担忧后,您只需在使用之前检查变量是否已设置:

if(isset($_POST["title"])) {
  $title = $_POST['title'];
} else {
  //output error
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多