如何在带有用户输入字段的html页面上执行sql命令,并在同一页面上显示结果
Posted
技术标签:
【中文标题】如何在带有用户输入字段的html页面上执行sql命令,并在同一页面上显示结果【英文标题】:how to perform sql command on html page with user input field, and show result on the same page 【发布时间】:2011-10-17 15:12:56 【问题描述】:我写了一个命令,或者我从用户输入字段中填写了参数值。单击按钮,将此命令发送到 php 并将结果值发送回 html 以显示。 例如。在 html 页面上:
select ___ from ____,
我用“tablenameone”和“valueone”填充了两个可用的输入字段。然后,结果将打印在同一页面的 html 文本字段中。
我所知道的是这些值可以以这种格式发送(也许)
$('input[name="talbename"]')
$('input[name="value"]')
example.com?tablename=tablenameone&value=valueone
我在 php 方面使用
$sql="SELECT '$_GET['value']' FROM '$_GET['tablename']';
我不知道的是......我应该如何在点击功能中执行此操作?它肯定使用ajax。但我怎样才能产生 example.com?tablename=tablenameone&value=valueone 我应该把 $('input[name="value"]')
在此先感谢 :D
【问题讨论】:
很好的SQL injection hole 在 PHP 语法错误之上... 完全同意 Marc B,巨大的安全漏洞! 所以你让用户决定选择哪个字段,在哪里做,而不是清理?我不知道你的数据库能用多久 guys..lol 来自你的链接 marc B 的好笑话....我只是简化了我的问题,所以我可以从基本开始....我实际上计划使用选择来代替... ***.com/questions/7794055/… 这是我最初的问题...花了一些时间来解释我的实际问题.. 【参考方案1】:您不得在查询中使用直接输入,因为您将对SQL injection attacks 开放。
$sql="SELECT '$_GET['value']' FROM '$_GET['tablename']';
改为使用以下内容:
$column = $_GET['value'];
$table = $_GET['tablename'];
$sql = sprintf("SELECT %s FROM %s;",
mysql_real_escape_string($column),
mysql_real_escape_string($table));
尽管通过向人们提供一个告诉他们所有表名和列名的页面,您仍然暴露了太多“内部信息”!
不管怎样,这里有一个完整的例子;
<form method="post" action="">
<fieldset>
<legend>Select Data</legend>
<p><label>Table<br>
<select name="table">
<option value="tblStudents">Students</option>
</select></label></p>
<p><label>Table<br>
<select name="column">
<option value="firstname">First Name</option>
<option value="lastname">Last Name</option>
</select></label></p>
<p><input type="submit" name="submit" value="submit">
</fieldset>
</form>
<?php
$connection = mysql_connect("servername:3306", "user", "password") or die ('Error connecting to mysql');
mysql_select_db("databasename");
$column = mysql_real_escape_string($_POST['column']);
$table = mysql_real_escape_string($_POST['table']);
$sql = sprintf("SELECT %s FROM %s;",
$column,
$table);
$result = mysql_query($sql) or die(mysql_error());
echo '<ul>';
while($row = mysql_fetch_array($result))
echo '<li>' . $row[$column] . '</li>';
echo '</ul>';
mysql_close($connection);
?>
【讨论】:
【参考方案2】:似乎没有人真正回答过这个问题(虽然它们都是好点,但我会假设你这样做是有原因的),我会回答:
$('form[name=formname]').submit(function(e)
e.preventDefault;
var tablename = $('input[name="tablename"]').val();
var value = $('input[name="value"]').val();
$.get("example.php?tablename="+tablename+"&value="+value, function(data)
$('body div').text(data);
)
);
PHP:
$sql=mysql_query("SELECT '$_GET['value']' FROM '$_GET['tablename']'")or die(mysql_error());
$sqlOutput = mysql_fetch_array($sql);
echo "<pre>";
print_r($sqlOutput);
echo "</pre>";
显然将formname
替换为您的表单名称,将body div
替换为您希望输出进入的元素的名称,并在合适的地方替换所有其他标识符。然后更改 PHP 中的输出以满足您的需要。
再次,请记住有关 SQLi 的帖子,因为您自己有一个非常严重的问题。
【讨论】:
我可以使用 $("input.classname").click(function (e) 代替吗? preventDefault 是为了不去 php 页面,不是吗?:D 当然,但是如果submit
上的e.preventDefault
会正常工作,因为它会阻止表单实际提交,然后处理所有AJAX
【参考方案3】:
您确实想确保您不会对 SQL 注入持开放态度。
你可以使用mysql准备好的语句
或
使用php函数mysql_real_escape_string($_GET['value'])
阅读此主题: How can I prevent SQL injection in PHP?
我不确定你所说的点击功能是什么意思。
【讨论】:
以上是关于如何在带有用户输入字段的html页面上执行sql命令,并在同一页面上显示结果的主要内容,如果未能解决你的问题,请参考以下文章