ユーザーがMicrosoftSQLデータベースに格納されているCSSとHTMLの一部を変更できるようにするシンプルなインターフェイスを作成しています。このインターフェースはPHP5とADOdbを使用します。
何らかの理由で、このフォームは1つ以上の一重引用符を含む入力を拒否します。たとえば、次の文字列は許可されていません: "background-image:url('paper.gif');"
SQLインジェクション攻撃を防ぐために、ADOdbが一重引用符を積極的にフィルタリングしているのではないかと思います。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>