2016-08-02 13 views
0

私はコンテンツ管理システムを作っています。私は、ユーザーが新しいページ(「ページタイトル」や「カルーセルスピード」など)で使用されるフォームを介して、いくつかの情報を投稿できるようにしていますが、私はその情報を生成されたページ。<<< 'EOT'にPOSTデータを出力

私は$page .= <<<'EOT'を使用していますが、そこにhtmlを置いていますが、$_POSTという変数をエコーし​​ようとすると、PHPコードが実際にはEOTの中に書かれ、結果。

<?php echo $_POST['speed'] ?>を例外として扱うようにEOTに指示する方法はありますか?

<?php 

    $addTo = $_POST['addTo']; 
    //$visit = $_POST['visit']; 
    $dir = $_POST['name']; 
    $desc = $_POST['desc']; 

    $dir = preg_replace('/\s+/', '_', $dir); 

    mkdir($addTo.'/'.$dir, 0777); 
    mkdir($addTo.'/'.$dir.'/photos', 0777); 

    //Make page 
    $content = "he"; 
    $myfile = fopen ($addTo.'/'.$dir.'/index.php', "w") or die ("Unable to open file!"); 
    $page = ""; 
    $speed = $_POST['speed']; 



$page .= <<<'EOT' 

<head> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 
    <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha256-cCueBR6CsyA4/9szpPfrX3s49M9vUU5BgtiJj06wt/s=" crossorigin="anonymous"></script> 
    <script src="https://use.fontawesome.com/2c6a42bed3.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
</head> 

<body> 

    <div id="myCarousel" class="carousel slide" data-ride="carousel"> 
     <!-- Indicators --> 
     <ol class="carousel-indicators" style="display:none"> 
     <li data-target="#myCarousel" data-slide-to="0" class="active"></li> 
     <li data-target="#myCarousel" data-slide-to="1"></li> 
     <li data-target="#myCarousel" data-slide-to="2"></li> 
     <li data-target="#myCarousel" data-slide-to="3"></li> 
     </ol> 

     <!-- Wrapper for slides --> 
     <div class="carousel-inner" role="listbox"> 

     <?php 

      $active = "active"; 
      $url = $_SERVER['REQUEST_URI'].'photos/'; 
      //echo $url." - url<br/>"; 

      $conn = mysqli_connect("localhost","root","","test"); 

      $sql = "SELECT speed FROM pages WHERE title = ''"; 

      if (mysqli_connect_errno()) {echo "Failed to connect to MySQL: " . mysqli_connect_error();} 
      $sql = "SELECT * FROM photos WHERE url = '$url'"; 

      $result = mysqli_query($conn, $sql); 

      while($row = mysqli_fetch_array($result)) { 
       ?> 
        <div class="item <?=$active?>"> 
         <img src="<?php echo $row['url'].$row['caption']; ?>"> 
        </div> 
       <?php 

       $active=""; 

      } 

      $conn->close(); 

     ?> 

     </div> 

     <!-- Left and right controls --> 
     <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev"> 
     <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> 
     <span class="sr-only">Previous</span> 
     </a> 
     <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next"> 
     <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> 
     <span class="sr-only">Next</span> 
     </a> 
    </div> 




</body> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
     $("#myCarousel").carousel({ 
      interval : 420, 
      pause: false 
     }); 
    }); 
</script> 

%s 

EOT; 


?> 
<?php 

    $output = sprintf($page, $speed); 
    echo $output; 

    fwrite($myfile, $page); 
    fclose($myfile); 

    $conn = mysqli_connect("localhost","root","","test"); 

    if (mysqli_connect_errno()) {echo "Failed to connect to MySQL: " . mysqli_connect_error();} 

    $sql = "INSERT INTO pages (title, type, description, active, speed) VALUES ('$dir', '$addTo','$desc' , '1', '$speed')"; 

    if ($conn->query($sql) === TRUE) { 
     echo "New record created successfully"; 
    } else { 
     echo "Error: " . $sql . "<br>" . $conn->error; 
    } 

    $conn->close(); 

    //Redirect 
    if (isset($visit)){ 
     //header('Location:index.php?newPage='.$addTo.'/'.$dir.'/'.$filename); 
    } 

    else { 
     //header('Location:index.php?newPage='.$addTo.'/'.$dir.'/'.$filename); 
    } 

?> 
+0

あなたのphp echoステートメントで連結することはどうですか?それは簡単です。 <?php echo '............................................. ........ '。 $ _POST ['スピード']。 .... ';あなたはこれをありがとう –

答えて

1

例外として<?php echoを治療するためのEOTを伝える方法はありますか?

'EOT'"EOT"に置き換えない限り、存在しません。最初のもの(現在使用しているもの)はすべてを生の文字列として扱います。 2番目の引数はPHPで二重引用符として機能するので、文字列は解析され、変数が認識されます。

私はそのまま'EOT'を使用し、文字列にプレースホルダー%sを挿入します。それから私は、値(see the docs

// the %s will be replaced later with your values 
$template = <<< 'EOT' 
The car has speed %s and a mileage of %s ... 
EOT; 

//build the args. Use htmlspecialchars to protect your users from 
// Cross-Site Scripting attacks 
$args = [ 
    htmlspecialchars($_POST['speed']), 
    htmlspecialchars($_POST['mileage']), 
    ... 
]; 

//insert the args into the template 
$output = sprintf($template, ...$args); 

echo $output; 

セキュリティノートにプレースホルダを置き換えるためにsprintfを使用したい:あなたの出力文字列をユーザーがブラウザに戻ってあなたを送っているので、あなたはCross-Site Scripting (XSS) attacksに脆弱である:ユーザーが得ることができます自分の入力を使ってページを構築しているので、自分が望むコードを実行するためにあなたのウェブサイトにアクセスする必要があります。あなたを守るために入力をhtmlspecialchars()できれいにしました。

+0

PHPの多くの行を書くことができます。 $ printをsprintfに入れた後に出力をエコーすると、ページが実際にどのように見えるのかが非常に壊れています($ _POST値として表示されている%sで表示されます)。実際のEOTへの出力番号は、このようなことはありませんか?少し足踏みがあるような気がする。再度、感謝します。 – ERushforth

+0

@ERushforth私はあなたのコードを見ることなく動作していない理由を言うことはできません。私はそれを質問の更新として追加し、何が間違っているのかを説明することをお勧めします。 – BeetleJuice

+0

ありがとう、ちょうどそこにコードを編集しました。今はEOTの直前の%sを底に置いていますが、それは

関連する問題