Menghuraikan dan menangani fungsi eval dalam PHP
<p>Penafian: Ini hanyalah contoh untuk mempelajari suntikan kod PHP, bukan kod pengeluaran untuk digunakan dalam apa jua cara. Saya sedar sepenuhnya bahawa ini bukan amalan pengekodan yang baik. </p>
<p>Saya mempunyai skrip PHP berikut: </p>
<pre class="brush:php;toolbar:false;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<kepala>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<tajuk>Contoh skrip</title>
</head>
<badan>
<h1>Contoh halaman</h1>
<p>Sekarang untuk matematik. Sila masukkan formula untuk mengira. Contohnya: 1+1. </p>
<form method="get">
<p>Formula: <input type="text" name="maths" /></p>
<p><input type="submit" value="calculate" /></p>
</form>
<?
if (( isset($_REQUEST["maths"])) && ($_REQUEST["maths"] != "") )
{
echo "<p>Hasilnya ialah:";
eval("echo (".$_REQUEST["matematik"].");");
echo "</p>";
}
?>
</badan>
</html></pre>
<p>Skrip ini terdedah kepada suntikan kod PHP, saya dapat memecahkannya dengan melakukan perkara berikut (kebanyakannya didapati melalui percubaan dan ralat): </p>
<pre class="brush:php;toolbar:false;">$a='1');phpinfo();echo($a</pre>
<p>Namun, saya tidak memahami sepenuhnya rasionalnya. Daripada apa yang saya faham, saya perlu melengkapkan pernyataan gema, masukkan kod saya sendiri (cth. phpinfo()), dan kemudian tulis fungsi lain (cth. echo) untuk mengendalikan kurungan penutup. </p>
<p>Saya fikir kod seperti ini akan berfungsi: </p>
<pre class="brush:php;toolbar:false;">");phpinfo();echo("</pre>
<p>Walau bagaimanapun, ini tidak berfungsi kerana phpinfo dianggap sebagai sebahagian daripada rentetan dan tidak dinilai oleh fungsi eval.
Saya juga cuba melarikan diri dari petikan tanpa kejayaan. </p>
<p>Soalan:</p>
<ul>
<li>Apakah cara yang betul untuk menyuntik kod di sini? </li>
<li>Mengapa<kod>$a='1');phpinfo();echo($a</code> berfungsi?</li>
</ul><p><br /></p>