我在一个用于验证用户凭据的类中有一个方法verifyCredentials。我正在重写它,以使用PHP的PDO,而不是DBMS依赖的mysqli语句。在获取绑定到准备好的查询的参数时,我遇到了困难。
PDO总是抛出警告
警告: PDOStatement::execute():SQLSTATEHY093:无效的参数号:绑定变量的数量与在线文件中的令牌数量不匹配
我显然错过了一些东西,但我不知道我的生活有什么意义。
代码片段,除DBH和STH外,大写文件中的所有内容都由外部constants.php文件定义:
class FancyClass{
function __construct()
目前,我正在研究一个简单工具的概念,以执行一些维护数据库操作(拖放/截断/复制表等)。用PHP编写。
这必然要求SQL语句中的标识符是动态用户输入。尽管准备好的语句非常适合将SQL语句与用户输入的任何比较值分离开来,但它们不适用于表或列名之类的标识符。(这意味着,我准备了准备标识符的语句。)
保护动态标识符的一种常见方法是白名单,但这需要静态和已知的数据库结构。例如,我希望实现像Copy table A and name it B这样的命令。这里有趣的部分是B。
如果对用户进行了身份验证并允许执行此操作,那么如何保护用户免受SQL注入的影响?这可能吗?
我发现了,它建议在任何标识符中简单地引用
我在用PDO在PHP中准备查询时遇到了问题。代码:
$link = new PDO("mysql:dbname=$dbname;host=127.0.0.1",$username,$password);
$link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = $link->prepare("SELECT locality_name FROM :passedday GROUP BY locality_name ORDER BY locality_name DESC"
我编写了一个php函数,允许您用任何字符串值(一个或多个)更新任何表中的任何条目。PDO不会抛出任何错误,尽管脚本似乎不起作用!我已经多次检查了数据库、表和字段的名称。一切都是正确的。这是我函数中唯一不能工作的查询。我认为这与传入SQL语句的数组im和PDO->bindParam()函数有关。
代码:
public function updateTableDetail($table, $id, $params) {
include($this->doc_root . 'config/config.php');
if (is_array($para
正如我在许多文章中看到的,存储过程中的动态SQL容易受到SQL注入的影响。但是,如果我们在预先准备的语句中使用以前的PDO,这仍然是不安全的吗?
示例:
CREATE PROCEDURE my_sp(
IN in_var VARCHAR(32)
)
BEGIN
DECLARE query VARCHAR(255);
SET @query = CONCAT("SELECT * FROM my_table WHERE my_column = '",in_var,"' LIMIT 1;";
PREPARE stmt F
我在Ubuntu14.04LTS上使用PHP5.5.9和MySQL 5.5.44和mysqlnd 5.0.11-dev。下列声明未作准备:
$db->prepare("SELECT nr.x FROM (SELECT ? AS x) AS nr")
尽管以下声明已成功地准备就绪,但情况却是如此:
$db->prepare("SELECT nr.x FROM (SELECT '1337' AS x) AS nr")
造成这种差异的原因是什么?说:“只能在数据值出现的地方使用参数标记,而不能用于SQL关键字、标识符等。”但这是一个数据值。
DBMSes只允许值作为准备语句的参数。但是,已准备好的语句不允许使用表、列和字段名。例如:
String sql = "Select * from TABLE1 order by ?";
PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, "column_name_1");
这种说法是不允许的。DBMSes没有在准备好的语句中实现归档名称的原因是什么?