如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
什么是一个很好的函数用于使字符串安全包含在SQL查询中?例如,需要修复撇号,并且无疑也可能出现其他问题.我想要一个坚如磐石的功能,如果任何可能的输入,邪恶的行为者可以设计它.
现在,在群众告诉我使用查询参数和/或downvote/close这个问题之前,请考虑以下几点:
我被困在使用设计糟糕的API的第三方库.应该按如下方式调用API:
dataObjectVariable.FindWhere("WHERE RecordID = '(your string here)'");
Run Code Online (Sandbox Code Playgroud)
现在,我同意你100%认为这不是一个好的API,因为它(1)向用户公开内部数据库字段名称是实现细节,(2)没有机会使用参数来避免这个问题地方,(3)实际上,你可以说SQL本身是一个实现细节,不应该暴露.但是我坚持使用这个API,因为它需要与其行业中的一个领先系统集成.我们也无法让他们改变他们的API.
我在这个网站上搜索了与此问题有关的其他问题,但发现答案往往强烈建议参数化查询.试图建议编写一个函数来清理字符串的答案经常被低估,没有经过深思熟虑等等 - 我不确定我是否相信它们.
我只搜索字符串,而不是其他数据类型,如数字,日期等.再次,我100%意识到使用参数化查询的好处,我希望我可以使用它们,但我不能因为我的手与此相关.
我想知道PHP中SQL Server转义字符串的等价物是什么?
我有一个问题
$sql ="SELECT CustomerID FROM tblCustomer
WHERE EmailAddress = '".addslashes($_POST['username']) ."' AND Password = '".addslashes($_POST['password']) ."'";
// while printing, it will be
SELECT CustomerID FROM tblCustomer WHERE EmailAddress = 'test@ab\'c.com' AND Password = '123'
Run Code Online (Sandbox Code Playgroud)
如果我们在mysql服务器中执行它,它可以工作,但不能在sql server中
这是什么解决方案?.我使用的是sql server
我正在使用php开发我的个人网站.一切都还可以,但我只是mysql_real_escape_string在php.net上阅读手册,发现了两件事:
- 在向MySQL发送查询之前,必须始终使用此函数(少数例外)使数据安全.
- mysql_real_escape_string()不会转义%和_.如果与LIKE,GRANT或REVOKE结合使用,这些是MySQL中的通配符.
我有两个问题:
1 - 这些例外是什么?
2-如何逃避这些角色?
我可以尽可能地清理和验证我的输入,但这绝对不能涵盖所有内容,如果我足够用力、足够彻底地擦洗,我将完全清除我的输入。
我意识到有很多关于这个主题的帖子,但似乎他们总是回到 PDO 或 Mysql(是的 - 即使有人发布关于 SQL Server 的帖子,他们收到的一半答案都表明 mysql_real_escape_string - 疯狂的世界)。 我也不能用。即使在我打字时,屏幕右侧出现一些“类似的问题”,我也一直点击各种链接,但没有任何内容能完全回答我的问题。
我正在使用 SQL Server。我正在使用 PHP 5.2.4。我不能使用 PDO(因为...?我的老板说“不”,这就是足够的理由)。
有没有一种方法可以编写一种安全的方法来准备我自己的查询语句?
过去,我曾尝试在 PHP 中构建这样的语句。(其中 $input_* 变量是某种形式的用户输入,或者我将它们从某些东西中拉出来)
$query = "
declare @varID int
declare @var1 int
declare @var2 varchar(100)
set @varID = cast('$input_ID' as int)
set @var1 = cast('$input_var1' as int)
set @var2 = cast('$input_var2' as varchar(100))
update table_name_goes_here
set var1 = @var1,
var2 = @var2
where ID = @varID;
";
# $query is then executed
Run Code Online (Sandbox Code Playgroud)
但这也可能很脆弱......显然......我做的最后一件事是删除所有必要的标点符号(有时我知道他们没有理由使用某些字符)
但必须有其他选择......对吗?并且mssql_bind只适用于存储过程,这是一个明确的选择,但我不确定我是否想通过插入/更新过程自愿扩展我的职责以将维护包括在实际数据库中。
我如何real_escape_string在 sqlsrv 中使用?
这是我的代码:
$uname = sqlsrv_real_escape_string($conn, trim($_POST['uname']));
$pass = sqlsrv_real_escape_string($conn, trim($_POST['pword']));
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
未定义函数
sqlsrv_real_escape_string