我正在尝试使用JQuery,PHP和MySQL进行实时搜索。我不是专家,但我知道并且理解足够危险。无论如何,除了我的任何搜索结果包含单引号或双引号外,一切似乎都有效。例如,我的搜索结果可能包含:
接触,门3/4“凹入
运动,探测器35'x 50'
依旧等等。
我的代码是:
<script type="text/javascript">
function lookup(inputString) {
if(inputString.length == 0) {
// Hide the suggestion box.
$('#suggestions').hide();
} else {
$.post("get_parts.php", {queryString: ""+inputString+""}, function(data){
if(data.length >0) {
$('#suggestions').show();
$('#autoSuggestionsList').html(data);
}
});
}
}
function fill(thisValue) {
$("#inputString").val(thisValue);
setTimeout("$('#suggestions').hide();", 200);
}
</script>
和
<?php
if(isset($_POST['queryString'])) {
$queryString = $_POST['queryString'];
if(strlen($queryString) >0) {
$query = "SELECT short_desc
FROM equipment
WHERE short_desc
LIKE '$queryString%'
ORDER BY short_desc
ASC LIMIT 10";
$result = mysql_query($query) or die("There is an error in database");
while($row = mysql_fetch_array($result)){
$escaped_desc_html = htmlentities($row['short_desc']);
$escaped_desc_escape = addslashes($row['short_desc']);
echo
"<li onClick=\"fill('".$escaped_desc_html."');\">".$escaped_desc_html."</li>";
};
};
};
?>
我已经尝试将数据存储在MYSQL中,如下所示:
接触,门3/4 \“凹入
运动,探测器35 \'x 50 \'
然后它出现在页面上,就像那样。
我已经尝试过addslashes(),htmlentities(),两者的组合,并且它一直在破碎。我在javascript中尝试了escape()但是我没有得到任何格式化,列表是一个连续的混乱文本块。
我的问题是当我的搜索结果传回Jquery时,引号或双引号使它认为命令如果结束并且我得到一个关于缺失的错误)。 有没有办法让Jquery忽略任何以数据形式返回的html,斜杠或引号?也许让它像对象而不是命令一样对待它。即使有htmlentities()&amp; quo;仍然打破了代码。这让我疯狂!问题总是在这两个地方出现问题:
$('#autoSuggestionsList').html(data);
和
$("#inputString").val(thisValue);
答案 0 :(得分:1)
我有类似的问题。因为我的问题只有双引号我在输入时使用:
将它们转换为"
$OUTPUT = str_replace("\"",""",$INPUT);
如果这会导致javascript问题,您可以使用相同的代码将"
替换为“ - ”或其他内容。
当你进入用户输入阶段时,一定要保护自己免受其他人提到的注射攻击!
抱歉刚刚看到这个日期!!希望这对某人有帮助
答案 1 :(得分:0)
您应该使用mysql_real_escape_string来转义MySQL查询中的变量。更重要的是,你需要非常小心地正确地逃避你放入数据库的内容以及你呈现给用户的内容......你永远不应该信任用户提供的输入,因为如果你这样做,你将会遇到至少一个利用此类漏洞的恶意黑客。
避免这种情况的最佳方法是:
对每个组件进行单元测试,并在单元测试中进行运动验证(确保在每个组件上都有适当的验证/转义代码并且它实际上有效。)
使用模糊器自动生成输入以尝试查找这些问题。例如,用户是否可以生成输入以便删除整个数据库?
答案 2 :(得分:0)
使用上面的代码,您可以免于使用SQL注入攻击。在执行SQL语句之前,需要在值上调用mysql_real_escape_string()。