我有一个小问题。当我使用这段代码时:
<!DOCTYPE HTML>
<html>
<head>
<title>Declare Nerf War!</title>
</head>
<body>
<?php
$form="<center><form action='decwargen.php' method='POST'>
Your Name: <input type='text' name='yname' placeholder='John Doe'><br>
Opponent's Name: <input type='text' name='oname' placeholder='Jane Doe'><br>
Why? <input type='text' name='why' placeholder='for stealing my stuff'><br>
Date of war: <input type='text' name='dwar' placeholder='10/11/13'><br>
Time of war: <input type='text' name='twar' placeholder='10:56 PM'><br>
Created on: <input type='text name='crtd' placeholder='10/10/13'><br>
<input type='submit' name='subbut' value='Submit'></center>
</form>";
$ok = $_POST ['subbut'];
if($ok){
$yname = $_POST ['yname'];
$oname = $_POST ['oname'];
$why = $_POST ['why'];
$dwar = $_POST ['dwar'];
$twar = $_POST ['twar'];
$created = $_POST ['crtd'];
echo("<center><h1>Declaration of war</h1><br><p contenteditable='true'>I, " . $yname . " declare war on " . $oname . " for/because " . $why . ". This will happen on " . $dwar . " at " . $twar . ".<br>Created on" . $created);
} else echo($form);
?>
</body>
</html>
网络浏览器说:
注意:未定义的索引:subbut在第17行的/Applications/MAMP/htdocs/decwargen.php中
当我第一次去页面时,那么
注意:未定义索引:第24行/Applications/MAMP/htdocs/decwargen.php中的crtd
我输入数据时有人可以帮忙吗?
答案 0 :(得分:3)
更改您的
<input type='text name='crtd' placeholder='10/10/13'>
-------^ quote not closed properly
到
<input type='text' name='crtd' placeholder='10/10/13'>
替换
$ok = $_POST ['subbut'];
if($ok){
到
if(isset($_POST ['subbut']))
{
答案 1 :(得分:1)
作为附加的安全提示,切勿在未消毒的情况下打印任何东西。
-编辑-
编写任何可以接受用户提交的内容的代码时,您需要记住,用户内容永远不可信任。恶意用户可以提交特制数据,使他们可以访问您的应用程序,最终用户的计算机或更多其他内容。
减少(或控制)威胁的一种方法是执行以下操作:
您可以通过简单的Google搜索获得有关执行这些操作的更多信息,以及更多信息。您还可以查看PHP Sanitize filters
现在回到原始问题中使用的实际代码。
我已自由地在战争宣言下方打印该表格,以便您可以根据需要宣布更多战争。
代码如下所示...
<!DOCTYPE HTML>
<html>
<head>
<title>Declare Nerf War!</title>
</head>
<body>
<?php
$form="<center><form action='decwargen.php' method='POST'>
Your Name: <input type='text' name='yname' placeholder='John Doe'><br>
Opponent's Name: <input type='text' name='oname' placeholder='Jane Doe'><br>
Why? <input type='text' name='why' placeholder='for stealing my stuff'><br>
Date of war: <input type='text' name='dwar' placeholder='10/11/13'><br>
Time of war: <input type='text' name='twar' placeholder='10:56 PM'><br>
Created on: <input type='text' name='crtd' placeholder='10/10/13'><br>
<input type='submit' name='subbut' value='Submit'></center>
</form>";
$ok = $_POST['subbut'] ?? false;
if($ok){
$yname = $_POST['yname'];
$oname = $_POST['oname'];
$why = $_POST['why'];
$dwar = $_POST['dwar'];
$twar = $_POST['twar'];
$created = $_POST['crtd'];
echo "<center><h1>Declaration of war</h1><br><p contenteditable='true'>I, " . $yname . " declare war on " . $oname . " for/because " . $why . ". This will happen on " . $dwar . " at " . $twar . ".<br>Created on " . $created;
};
?>
<hr>
<?php echo $form; ?>
</body>
</html>
我意识到这个问题最初是在2013年提出的。不过,我将使用更现代的PHP功能解决Notice: Undefined index: subbut ...
。
我将替换...
<?php
$ok = $_POST ['subbut'];
有...
<?php
$ok = $_POST['subbut'] ?? false;
您可以在http://php.net/manual/en/language.operators.comparison.php#example-105处找到有关新的PHP Null合并运算符(猫王运算符??)的更多信息
提交和宣战时,您将具有类似于下图的内容...
现在,您将看到当有人在页面上执行简单的HTML注入时表单会发生什么情况。
我将提交John Doe</form><form action="http://example.com" target="_blank"><input value="You got hacked">
结果在下图可见...
如果您尝试提交其他声明,则会注意到该表单将被提交到example.com域。那是因为:
</form>
标记将尝试关闭当前表单。如果没有要关闭的表单,则该标签将无效,浏览器将忽略它。<form action="http://example.com" target="_blank">
添加的。浏览器通常会拒绝嵌套的表单标签。因此,我的表单将通过使其开始标记无效来代替下一个表单。有人可以说原始的例子不是在打印表格。当然。但这并没有改变我要传达的内容。
我可以创建一个标签,而不是创建一个表单,该标签将加载一个精致的Javascript应用程序,该应用程序然后将在您的站点的域中运行,并使用Javascript可以做任何事情。我还可以添加一个iframe或其他内容。
最重要的是,请勿使用或直接打印提交给脚本的任何内容。哎呀,您甚至不能信任来自您自己的数据库的内容,因为您不知道它是否已被其他人更改。您仍然需要执行一些清理工作,以使用数据来防御XSS和CSRF。
答案 2 :(得分:0)
首次进入该页面时 $ _ POST [ 'subbut'] 不存在。它仅在表单发布后才存在。为了避免这种情况,您需要使用isset。例如,使用以下代码
if(isset($_POST ['subbut'])){
$yname = $_POST ['yname'];
$oname = $_POST ['oname'];
$why = $_POST ['why'];
$dwar = $_POST ['dwar'];
$twar = $_POST ['twar'];
$created = $_POST ['crtd'];
echo("<center><h1>Declaration of war</h1><br><p contenteditable='true'>I, " . $yname . " declare war on " . $oname . " for/because " . $why . ". This will happen on " . $dwar . " at " . $twar . ".<br>Created on" . $created);
} else echo($form);
同时更改此行
Created on: <input type='text name='crtd' placeholder='10/10/13'><br>
到这个
Created on: <input type='text' name='crtd' placeholder='10/10/13'><br>
答案 3 :(得分:0)
你有一个引用错误。尝试改变
type='text name='crtd'
到
type='text' name='crtd'