Php 防止数据库拒绝用户输入

Php 防止数据库拒绝用户输入,php,escaping,adodb,Php,Escaping,Adodb,我正在制作一个简单的界面,允许用户修改存储在Microsoft SQL数据库中的CSS和HTML片段。该接口使用PHP5和ADOdb 出于某种原因,此表单将拒绝包含一个或多个单引号的任何输入。例如,不允许使用此字符串:“背景图像:url('paper.gif');” 我怀疑ADOdb可能正在积极过滤单引号以防止SQL注入攻击。有没有一种方法可以转义PHP中的用户输入,以允许存储单引号字符 我考虑过自动将所有单引号转换为双引号,但这似乎有可能破坏用户的标记 这可能不是很有帮助,但下面是我正在使用的

我正在制作一个简单的界面,允许用户修改存储在Microsoft SQL数据库中的CSS和HTML片段。该接口使用PHP5和ADOdb

出于某种原因,此表单将拒绝包含一个或多个单引号的任何输入。例如,不允许使用此字符串:“背景图像:url('paper.gif');”

我怀疑ADOdb可能正在积极过滤单引号以防止SQL注入攻击。有没有一种方法可以转义PHP中的用户输入,以允许存储单引号字符

我考虑过自动将所有单引号转换为双引号,但这似乎有可能破坏用户的标记

这可能不是很有帮助,但下面是我正在使用的测试示例:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Cp1252">
<title>Edit website</title>
</head>
<body>
<h1>CSS Test</h1>

<?php
    include_once ('database.php');
    $table = "[User Site]";

    if (!isset($_REQUEST['dbname'])) {
        return false;
    } else {
        $dbname = $_REQUEST['dbname'];
        $db = Database::singleton($dbname);

        //Push any new CSS to the database
        if (isset($_POST['css'])) {
            $css = $_POST['css'];
            $sql = "UPDATE " . $table . 
                    " SET html='" . $html . "', css='" . $css . "' " .
                    " WHERE dbnameId='" . $dbname . "'";
            $db->Execute($sql);
        }

        //Fetch any CSS from the database
        $sql = "SELECT * FROM " . $table . " WHERE dbnameId='" . $dbname . "'";
        $data = recordToArray($db->Execute($sql));
        echo "<p>";
        $css = $data[0]['css'];
    }

    $rows = 20;
    $cols = 80;
?>
<!-- Show the user a form -->
<form action="test.php" method="post">
    CSS:<br>  <textarea rows="<?php echo $rows ?>" cols="<?php echo $cols ?>" name="css"><?php echo $css ?></textarea><p>
    <input type="hidden" name="dbname" value="<?php echo $dbname ?>" />
    <input type="submit" value="Update CSS" />
</form>
</p>
</body></html>

编辑网站
CSS测试

CSS:
我认为解决方案更简单:您直接插入用户输入,因此
中断您的SQL查询。(这已经是一个SQL注入!)因此您需要避开这些。但我不知道ADOdb提供了哪种方法。对于
mysql\u real\u escape\u string
PDO::quote
来说,它是
mysql\u real\u escape\u string


此外:请不要使用
$\u请求
,而是使用
$\u发布
。甚至更多请不要使用全球注册,这是不安全的!使用
$\u POST

您使用的是ADODB,但您没有使用几乎所有数据库抽象库的主要功能:占位符/准备好的语句

您的查询失败,因为没有正确转义。使用占位符会自动添加转义。请阅读,这将为您正在使用的数据库插入正确类型的占位符。(看起来您正在使用MSSQL,我不知道它是否使用
作为占位符。)

而不是

$sql = "SELECT * FROM " . $table . " WHERE dbnameId='" . $dbname . "'";
$sth = $db->Execute($sql);
你想要的是:

$sql = "SELECT * FROM $table WHERE dbnameId = " . $db->Param('dbname');
$psh = $db->Prepare($sql);
$sth = $db->Execute($psh, array( $dbname ));
(这是未经测试的,可能有细微的错误,请阅读链接手册页面了解更多信息。我有没有提到ADODB很糟糕?)


请记住,ADODB非常糟糕,是在PHP4时代设计的。请考虑使用更现代的东西,比如.< /P> < P>这不是攻击性过滤来防止SQL注入;这是因为这里没有SQL注入预防措施。CSS中的单引号被解释为查询中的单引号,导致语法错误

我以前没有使用过ADOdb,但它看起来像,这将允许您形成外观更漂亮的查询,并让它们按预期工作(没有SQL注入的风险)

在数据库看来,上述内容相当于以下内容:

$db->Execute("UPDATE foo SET bar = 'it\'s', baz = 'working'");

语法是正确的,可以避免错误和注入,而且使用起来更方便:)

我在本例中使用$\u请求,因为它更易于测试。:-)+1为了真正了解这个库(而不是像我搜索xD那样搜索它的参数绑定)并推荐一个更好的选择:)我一生中从未接触过ADODB,我也搜索了参数绑定方法。事实上,我更喜欢你的解决方案,因为我真的不在乎必须单独做准备。交叉+1'd.;)我假设ADODB是自动转义的,不管用于构建语句的方法是什么。真神奇!(tm)。谢谢你帮我澄清;我现在正在使用绑定并将内容切换到PDO。
$db->Execute("UPDATE foo SET bar = 'it\'s', baz = 'working'");