我正在使用jQuery和PHP进行实时搜索,但我不确定我的查询是否容易受到SQL注入攻击。
在jQuery的帮助下键入字符时,数据被发布到PHP文件中。
$searchData = $_POST['searchData'];
$searchResult = mysql_query("SELECT * FROM songs WHERE songname LIKE '$searchData%' ");
echo $searchResult;
这是否容易受到SQL注入攻击?
答案 0 :(得分:9)
是的,请考虑$searchData
是否:
Robert'); DROP TABLE songs; --
答案 1 :(得分:1)
使用mysql_real_escape_string($_POST['searchData'])
或[PDO]代替mysql _ *
答案 2 :(得分:0)
如果$searchData
没有在任何地方被转义,那么是的,它很容易受到攻击。
答案 3 :(得分:0)
无论何时您正在接受用户输入并进入查询,您都应该通过mysql_real_escape_string
传递它。比抱歉更安全。
答案 4 :(得分:0)
由于您可以使用工具来处理发送的$ _POST数据,是的,这很危险。
要么逃避它,要么使用不需要任何逃避的php data objects (PDO),这是你在这段时间应该使用的。
答案 5 :(得分:0)
是的,它很脆弱。但是其他响应者没有注意到,除了正常的转义(如mysql_real_escape_string()
),您还需要转义LIKE子句的%字符!强>
mysql_real_escape_string(addcslashes($str, "%_"))
这里要抓住的诀窍是没有像“普遍引用”那样的东西。 在引用时,您始终引用某些特定输出的文本,例如:
like
mysql查询表达式对于每种情况,您需要不同的引用,因为每种用法都存在于不同的语法上下文中。这也意味着引用不应该在PHP的输入中进行,而是在特定的输出!这就是为什么像magic_quotes_gpc
这样的功能被打破的原因(永远不会忘记处理它,或者更好,确保它被关闭!!! )。
那么,在这些特定情况下,用什么方法来引用? (随意纠正我,可能有更现代的方法,但这些对我有用)
mysql_real_escape_string($str)
mysql_real_escape_string(addcslashes($str, "%_"))
htmlspecialchars($str)
json_encode()
- 仅适用于utf8!我将我的功能用于iso-8859-2 mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}'))
- 在这种情况下你不能使用preg_quote,因为反斜杠会被转义两次!preg_quote()
答案 6 :(得分:-1)
是的你可以使用它:
$searchData = addslashes( $_POST['searchData'] );